prjct-cli 1.54.0 → 1.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,13 +5,13 @@ 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 Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Object.getOwnPropertyNames;var tf=Object.prototype.hasOwnProperty;var l=(r,e)=>Lr(r,"name",{value:e,configurable:!0}),kt=(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 Jt=(r,e)=>{for(var t in e)Lr(r,t,{get:e[t],enumerable:!0})},sf=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ef(e))!tf.call(r,n)&&n!==t&&Lr(r,n,{get:()=>e[n],enumerable:!(s=Zg(e,n))||s.enumerable});return r};var at=r=>sf(Lr({},"__esModule",{value:!0}),r);import{z as be}from"zod";function nf(r){return r instanceof nn}function ie(r){return nf(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var rn,cT,lT,uT,dT,mT,pT,nn,Fr,Ur,rr,Yt=v(()=>{"use strict";rn={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}},cT=rn.create("FileError",be.object({path:be.string(),operation:be.enum(["read","write","delete","create","copy"]),reason:be.string().optional()})),lT=rn.create("ValidationError",be.object({field:be.string(),expected:be.string(),received:be.string().optional(),message:be.string().optional()})),uT=rn.create("PermissionError",be.object({action:be.string(),resource:be.string(),reason:be.string().optional()})),dT=rn.create("TaskError",be.object({taskId:be.string().optional(),operation:be.enum(["create","update","complete","pause","resume","delete"]),reason:be.string()})),mT=rn.create("SessionError",be.object({sessionId:be.string().optional(),reason:be.string()})),pT=rn.create("SyncError",be.object({projectId:be.string().optional(),operation:be.enum(["push","pull","auth","connect"]),reason:be.string()})),nn=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)}},Fr=class r extends nn{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")}},Ur=class r extends nn{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")}},rr=class r extends nn{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(nf,"isPrjctError");l(ie,"getErrorMessage")});function rf(r){return r instanceof Error&&"code"in r}function D(r){return rf(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var U=v(()=>{"use strict";l(rf,"isNodeError");l(D,"isNotFoundError");l(y,"getErrorMessage")});import{formatDistanceToNowStrict as kT}from"date-fns";function Vl(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 Bl(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function S(){return new Date().toISOString()}function ds(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ct(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 Qt(r,e=new Date){let t=e.getTime()-r.getTime();return ct(t)}function on(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 St(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 q=v(()=>{"use strict";l(Vl,"formatDate");l(Bl,"getYearMonthDay");l(S,"getTimestamp");l(ds,"getDaysAgo");l(ct,"formatDuration");l(Qt,"calculateDuration");l(on,"parseVarianceMinutes");l(St,"parseDurationMinutes")});var Jl,ql,zl,Ni=v(()=>{"use strict";Jl=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"]),ql=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zl=/(?:import|from)\s+['"]([^'"]+)['"]/g});import Yl from"node:fs/promises";async function Ql(r,e){let t;try{t=await Yl.readFile(r,"utf-8")}catch(o){if(D(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Kl(r,t),Xl(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Kl(r,t),Xl(r,of(n.error)),null)}async function Kl(r,e){let t=`${r}.backup`;try{await Yl.writeFile(t,e,"utf-8")}catch{}}function Xl(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 of(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zl=v(()=>{"use strict";U();l(Ql,"safeRead");l(Kl,"createBackup");l(Xl,"logCorruption");l(of,"formatZodError")});import bt from"node:fs/promises";import or from"node:path";async function an(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 bt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Jl.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=or.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(or.relative(r,d))}}return l(o,"walk"),await o(r),t}async function cn(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 Pe(r,e=null,t){if(t)return await Ql(r,t)??e;try{let s=await bt.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(D(s))return e;throw s}}async function le(r,e,t=2){let s=or.dirname(r);await bt.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await bt.writeFile(r,n,"utf-8")}async function Ie(r,e=""){try{return await bt.readFile(r,"utf-8")}catch(t){if(D(t))return e;throw t}}async function Tt(r,e){let t=or.dirname(r);await bt.mkdir(t,{recursive:!0}),await bt.writeFile(r,e,"utf-8")}async function eu(r,e){let t=or.dirname(r);await bt.mkdir(t,{recursive:!0}),await bt.appendFile(r,`${e}
9
- `,"utf-8")}async function C(r){try{return await bt.access(r),!0}catch(e){if(D(e))return!1;throw e}}async function ms(r){try{return(await bt.stat(r)).isDirectory()}catch(e){if(D(e))return!1;throw e}}async function Ve(r){await bt.mkdir(r,{recursive:!0})}async function ps(r,e={}){try{let s=await bt.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(D(t))return[];throw t}}var B=v(()=>{"use strict";Ni();Zl();U();l(an,"walkDir");l(cn,"batchProcess");l(Pe,"readJson");l(le,"writeJson");l(Ie,"readFile");l(Tt,"writeFile");l(eu,"appendLine");l(C,"fileExists");l(ms,"dirExists");l(Ve,"ensureDir");l(ps,"listFiles")});var Hi={};Jt(Hi,{PACKAGE_ROOT:()=>lt,VERSION:()=>Ee,compareVersions:()=>tu,getPackageInfo:()=>af,getPackageRoot:()=>Ui,getVersion:()=>xs,isCompatible:()=>cf,needsMigration:()=>lf});import Li from"node:fs";import Wr from"node:path";function Ui(){if(ir)return ir;let r=__dirname;for(let e=0;e<5;e++){let t=Wr.join(r,"package.json");if(Li.existsSync(t))try{if(JSON.parse(Li.readFileSync(t,"utf-8")).name==="prjct-cli")return ir=r,r}catch{}r=Wr.dirname(r)}return ir=Wr.join(__dirname,"..","..",".."),ir}function xs(){if(Hr)return Hr;try{let r=Wr.join(Ui(),"package.json"),e=JSON.parse(Li.readFileSync(r,"utf-8"));return Hr=e.version,Fi=e,Hr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function af(){return Fi||xs(),Fi}function tu(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 cf(r){let e=xs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function lf(r,e=null){let t=e||xs();return tu(r,t)<0}var Hr,Fi,ir,Ee,lt,It=v(()=>{"use strict";U();Hr=null,Fi=null,ir=null;l(Ui,"getPackageRoot");l(xs,"getVersion");l(af,"getPackageInfo");l(tu,"compareVersions");l(cf,"isCompatible");l(lf,"needsMigration");Ee=xs(),lt=Ui()});var nu={};Jt(nu,{execAsync:()=>_,execFileAsync:()=>As});import{exec as uf,execFile as df}from"node:child_process";import{promisify as su}from"node:util";var _,As,Le=v(()=>{"use strict";_=su(uf),As=su(df)});async function Gr(r){try{let{stdout:e}=await _(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mf(){let r=await Gr("gh api user --jq .login");return r.success&&r.output||(r=await Gr("git config --global github.user"),r.success&&r.output)?r.output:null}async function pf(){let r=await Gr("git config user.name");return r.success&&r.output?r.output:null}async function gf(){let r=await Gr("git config user.email");return r.success&&r.output?r.output:null}async function ln(){let[r,e,t]=await Promise.all([mf(),pf(),gf()]);return{github:r,email:t,name:e||r||"Unknown"}}var Vr=v(()=>{"use strict";Le();l(Gr,"execCommand");l(mf,"detectGitHubUsername");l(pf,"detectGitName");l(gf,"detectGitEmail");l(ln,"detect")});var ar=v(()=>{"use strict"});import{z as qt}from"zod";function ru(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 WT,GT,VT,un,BT,Br=v(()=>{"use strict";WT=qt.enum(["opus","sonnet","haiku"]),GT=qt.enum(["2.5-pro","2.5-flash","2.0-flash"]),VT=qt.string().min(1),un=qt.object({provider:qt.string(),model:qt.string(),cliVersion:qt.string().optional(),recordedAt:qt.string()}),BT=qt.object({preferredModel:qt.string().optional(),lastAnalysisModel:un.optional()});l(ru,"compareSemver")});function gs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var dn,Rs=v(()=>{"use strict";l(gs,"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 ff from"node:fs/promises";import hf from"node:os";import ou from"node:path";async function au(){try{let r=await ff.readFile(iu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||gs(e.timestamp,wf)?null:e.detection}catch{return null}}async function cu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(iu,e)}var yf,iu,wf,lu=v(()=>{"use strict";Rs();B();yf=ou.join(hf.homedir(),".prjct-cli","cache"),iu=ou.join(yf,"providers.json"),wf=600*1e3;l(au,"readProviderCache");l(cu,"writeProviderCache")});var jt={};Jt(jt,{AntigravityProvider:()=>Vi,ClaudeProvider:()=>Jr,CodexProvider:()=>Bi,CursorProvider:()=>du,GeminiProvider:()=>Gi,Providers:()=>ut,WindsurfProvider:()=>mu,detectAllProviders:()=>cr,detectAntigravity:()=>Kr,detectCodex:()=>Ds,detectCursorProject:()=>fu,detectProvider:()=>qr,detectWindsurfProject:()=>hu,getActiveProvider:()=>Tf,getCapabilities:()=>Sf,getCommandsDir:()=>Rf,getGlobalContextPath:()=>Cf,getGlobalSettingsPath:()=>xf,getProjectCommandsPath:()=>Df,getProviderBranding:()=>zr,getSkillsPath:()=>Af,hasProviderConfig:()=>vf,needsCursorRouterRegeneration:()=>Ef,needsWindsurfRouterRegeneration:()=>Pf,selectProvider:()=>Ji,validateCliVersion:()=>gu});import fs from"node:os";import We from"node:path";function Sf(r,e){return{...kf[r],...e}}async function pu(r){try{let{stdout:e}=await _(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function bf(r){try{let{stdout:e}=await _(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function qr(r){let e=ut[r];if(!e.cliCommand)return{installed:!1};let t=await pu(e.cliCommand);if(!t)return{installed:!1};let s=await bf(e.cliCommand),n=gu(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function gu(r,e){let t=ut[r];return!t.minCliVersion||!e?null:ru(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 cr(r=!1){if(!r){let i=await au();if(i)return i}let[e,t,s]=await Promise.all([qr("claude"),qr("gemini"),Ds()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await cu(o).catch(()=>{}),o}async function Tf(r){if(r&&ut[r])return ut[r];let e=await cr();return e.claude.installed&&!e.gemini.installed?Jr:e.gemini.installed&&!e.claude.installed?Gi:Jr}async function vf(r){let e=ut[r];return e.configDir?C(e.configDir):!1}function zr(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 fu(r){let e=We.join(r,".cursor"),t=We.join(e,"rules"),s=We.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Ef(r){let e=await fu(r);return e.detected&&!e.routerInstalled}async function hu(r){let e=We.join(r,".windsurf"),t=We.join(e,"rules"),s=We.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Pf(r){let e=await hu(r);return e.detected&&!e.routerInstalled}async function Kr(){let r=Vi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=We.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Ds(){let r=Bi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await pu("codex"),t=We.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Cf(r){let e=ut[r];return e.configDir?We.join(e.configDir,e.contextFile):null}function xf(r){let e=ut[r];return!e.configDir||!e.settingsFile?null:We.join(e.configDir,e.settingsFile)}function Af(r){return ut[r].skillsDir}function Rf(r){return ut[r].commandsDir}function Df(r,e){let t=ut[r];return We.join(e,t.commandsDir)}async function Ji(){let r=await cr(),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 kf,Jr,Gi,Vi,du,mu,Bi,ut,dt=v(()=>{"use strict";ar();Br();Le();B();lu();kf={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");Jr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:We.join(fs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:We.join(fs.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"},Gi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:We.join(fs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:We.join(fs.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"},Vi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:We.join(fs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:We.join(fs.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"},du={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"},mu={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"},Bi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:We.join(fs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:We.join(fs.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"},ut={claude:Jr,gemini:Gi,cursor:du,antigravity:Vi,windsurf:mu,codex:Bi};l(pu,"whichCommand");l(bf,"getCliVersion");l(qr,"detectProvider");l(gu,"validateCliVersion");l(cr,"detectAllProviders");l(Tf,"getActiveProvider");l(vf,"hasProviderConfig");l(zr,"getProviderBranding");l(fu,"detectCursorProject");l(Ef,"needsCursorRouterRegeneration");l(hu,"detectWindsurfProject");l(Pf,"needsWindsurfRouterRegeneration");l(Kr,"detectAntigravity");l(Ds,"detectCodex");l(Cf,"getGlobalContextPath");l(xf,"getGlobalSettingsPath");l(Af,"getSkillsPath");l(Rf,"getCommandsDir");l(Df,"getProjectCommandsPath");l(Ji,"selectProvider")});import If from"node:crypto";import zt from"node:fs/promises";import qi from"node:os";import V from"node:path";import{globSync as jf}from"glob";var zi,$f,A,ye=v(()=>{"use strict";q();B();zi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?V.resolve(e):V.join(qi.homedir(),".prjct-cli"),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=V.resolve(e),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}generateProjectId(e){return If.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return V.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return V.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return V.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return V.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ms(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await Ve(this.globalBaseDir),await Ve(this.globalProjectsDir),await Ve(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 Ve(V.join(t,n));return await Ve(V.join(t,"planning","tasks")),await Ve(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Bl(t);return V.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 Ve(s),s}async listSessions(e,t=null,s=null){let n=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await zt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(n,a.name),u=await zt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=V.join(c,d.name),p=await zt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:V.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return V.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await zt.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 ms(t)}getDisplayPath(e){let t=qi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return V.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return V.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return V.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return V.join(this.globalBaseDir,".running")}getDocsPath(){return V.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(dt(),at(jt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(dt(),at(jt)).getActiveProvider();return(dt(),at(jt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(qi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return V.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return V.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=V.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=V.join(e,"package.json");if(await C(n))try{let o=await zt.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 zt.readFile(V.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=V.join(e,"package.json"),i=await zt.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=V.join(e,"lerna.json");if(await C(c)){let u=await zt.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=V.join(e,"package.json"),i=await zt.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=jf(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),u=V.join(c,"package.json");if(await C(u))try{let d=await zt.readFile(u,"utf-8"),m=JSON.parse(d),p=V.join(c,"PRJCT.md");s.push({name:m.name||V.basename(a),path:c,relativePath:a,hasPrjctMd:await C(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=V.resolve(e);for(let n of t.packages){let o=V.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=V.resolve(e),s=V.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=V.dirname(t)}return null}},$f=new zi,A=$f});var Xr={};Jt(Xr,{default:()=>Ot,worktreeService:()=>wu});import Ki from"node:fs/promises";import Kt from"node:path";var yu,Xi,wu,Ot,lr=v(()=>{"use strict";Le();B();yu=".worktrees",Xi=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=Kt.join(n,yu,t),i=s.branch||`feat/${t}`;await Ki.mkdir(Kt.join(n,yu),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await _(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await _("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await _(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await _(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await _("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await _("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await _("git rev-parse --git-dir",{cwd:e}),n=Kt.resolve(e,t.trim()),o=Kt.resolve(e,s.trim());if(n!==o){let{stdout:i}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await _("git rev-parse HEAD",{cwd:e}),{stdout:c}=await _("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=Kt.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await _("git worktree list --porcelain",{cwd:e}),n=s.split(`
11
- `)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await _("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=Kt.join(t,".env");await C(s)&&await Ki.copyFile(s,Kt.join(e,".env"));let n=Kt.join(t,".prjct"),o=Kt.join(e,".prjct");await C(n)&&!await C(o)&&await Ki.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await _("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
8
+ var Qr=Object.defineProperty;var wf=Object.getOwnPropertyDescriptor;var kf=Object.getOwnPropertyNames;var Sf=Object.prototype.hasOwnProperty;var u=(r,e)=>Qr(r,"name",{value:e,configurable:!0}),vt=(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 P=(r,e)=>()=>(r&&(e=r(r=0)),e);var Lt=(r,e)=>{for(var t in e)Qr(r,t,{get:e[t],enumerable:!0})},bf=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of kf(e))!Sf.call(r,n)&&n!==t&&Qr(r,n,{get:()=>e[n],enumerable:!(s=wf(e,n))||s.enumerable});return r};var lt=r=>bf(Qr({},"__esModule",{value:!0}),r);import{z as Ee}from"zod";function Tf(r){return r instanceof mn}function de(r){return Tf(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var gn,CT,xT,RT,AT,jT,DT,mn,Zr,eo,yr,ns=P(()=>{"use strict";gn={create(r,e){class t extends Error{static{u(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}},CT=gn.create("FileError",Ee.object({path:Ee.string(),operation:Ee.enum(["read","write","delete","create","copy"]),reason:Ee.string().optional()})),xT=gn.create("ValidationError",Ee.object({field:Ee.string(),expected:Ee.string(),received:Ee.string().optional(),message:Ee.string().optional()})),RT=gn.create("PermissionError",Ee.object({action:Ee.string(),resource:Ee.string(),reason:Ee.string().optional()})),AT=gn.create("TaskError",Ee.object({taskId:Ee.string().optional(),operation:Ee.enum(["create","update","complete","pause","resume","delete"]),reason:Ee.string()})),jT=gn.create("SessionError",Ee.object({sessionId:Ee.string().optional(),reason:Ee.string()})),DT=gn.create("SyncError",Ee.object({projectId:Ee.string().optional(),operation:Ee.enum(["push","pull","auth","connect"]),reason:Ee.string()})),mn=class extends Error{static{u(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)}},Zr=class r extends mn{static{u(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")}},eo=class r extends mn{static{u(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")}},yr=class r extends mn{static{u(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")}};u(Tf,"isPrjctError");u(de,"getErrorMessage")});function vf(r){return r instanceof Error&&"code"in r}function j(r){return vf(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var W=P(()=>{"use strict";u(vf,"isNodeError");u(j,"isNotFoundError");u(w,"getErrorMessage")});import{formatDistanceToNowStrict as NT}from"date-fns";function lu(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 uu(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 ws(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ut(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 rs(r,e=new Date){let t=e.getTime()-r.getTime();return ut(t)}function fn(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 Et(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=P(()=>{"use strict";u(lu,"formatDate");u(uu,"getYearMonthDay");u(b,"getTimestamp");u(ws,"getDaysAgo");u(ut,"formatDuration");u(rs,"calculateDuration");u(fn,"parseVarianceMinutes");u(Et,"parseDurationMinutes")});var du,pu,mu,Zi=P(()=>{"use strict";du=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"]),pu=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],mu=/(?:import|from)\s+['"]([^'"]+)['"]/g});import hu from"node:fs/promises";async function yu(r,e){let t;try{t=await hu.readFile(r,"utf-8")}catch(o){if(j(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await gu(r,t),fu(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await gu(r,t),fu(r,Ef(n.error)),null)}async function gu(r,e){let t=`${r}.backup`;try{await hu.writeFile(t,e,"utf-8")}catch{}}function fu(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 Ef(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var wu=P(()=>{"use strict";W();u(yu,"safeRead");u(gu,"createBackup");u(fu,"logCorruption");u(Ef,"formatZodError")});import Pt from"node:fs/promises";import wr from"node:path";async function hn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Pt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let l=String(c.name);if(du.has(l)||e.skipDotfiles&&l.startsWith(".")&&(!n||!n.has(l)))continue;let d=wr.join(i,l);c.isDirectory()?await o(d):c.isFile()&&t.push(wr.relative(r,d))}}return u(o,"walk"),await o(r),t}async function yn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Te(r,e=null,t){if(t)return await yu(r,t)??e;try{let s=await Pt.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(j(s))return e;throw s}}async function le(r,e,t=2){let s=wr.dirname(r);await Pt.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Pt.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Pt.readFile(r,"utf-8")}catch(t){if(j(t))return e;throw t}}async function Ct(r,e){let t=wr.dirname(r);await Pt.mkdir(t,{recursive:!0}),await Pt.writeFile(r,e,"utf-8")}async function ku(r,e){let t=wr.dirname(r);await Pt.mkdir(t,{recursive:!0}),await Pt.appendFile(r,`${e}
9
+ `,"utf-8")}async function C(r){try{return await Pt.access(r),!0}catch(e){if(j(e))return!1;throw e}}async function ks(r){try{return(await Pt.stat(r)).isDirectory()}catch(e){if(j(e))return!1;throw e}}async function Ke(r){await Pt.mkdir(r,{recursive:!0})}async function Ss(r,e={}){try{let s=await Pt.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(j(t))return[];throw t}}var B=P(()=>{"use strict";Zi();wu();W();u(hn,"walkDir");u(yn,"batchProcess");u(Te,"readJson");u(le,"writeJson");u(_e,"readFile");u(Ct,"writeFile");u(ku,"appendLine");u(C,"fileExists");u(ks,"dirExists");u(Ke,"ensureDir");u(Ss,"listFiles")});var na={};Lt(na,{PACKAGE_ROOT:()=>dt,VERSION:()=>Re,compareVersions:()=>Su,getPackageInfo:()=>Pf,getPackageRoot:()=>sa,getVersion:()=>Ls,isCompatible:()=>Cf,needsMigration:()=>xf});import ea from"node:fs";import so from"node:path";function sa(){if(kr)return kr;let r=__dirname;for(let e=0;e<5;e++){let t=so.join(r,"package.json");if(ea.existsSync(t))try{if(JSON.parse(ea.readFileSync(t,"utf-8")).name==="prjct-cli")return kr=r,r}catch{}r=so.dirname(r)}return kr=so.join(__dirname,"..","..",".."),kr}function Ls(){if(to)return to;try{let r=so.join(sa(),"package.json"),e=JSON.parse(ea.readFileSync(r,"utf-8"));return to=e.version,ta=e,to}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Pf(){return ta||Ls(),ta}function Su(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 Cf(r){let e=Ls(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function xf(r,e=null){let t=e||Ls();return Su(r,t)<0}var to,ta,kr,Re,dt,_t=P(()=>{"use strict";W();to=null,ta=null,kr=null;u(sa,"getPackageRoot");u(Ls,"getVersion");u(Pf,"getPackageInfo");u(Su,"compareVersions");u(Cf,"isCompatible");u(xf,"needsMigration");Re=Ls(),dt=sa()});var Tu={};Lt(Tu,{execAsync:()=>O,execFileAsync:()=>Fs});import{exec as Rf,execFile as Af}from"node:child_process";import{promisify as bu}from"node:util";var O,Fs,We=P(()=>{"use strict";O=bu(Rf),Fs=bu(Af)});async function no(r){try{let{stdout:e}=await O(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function jf(){let r=await no("gh api user --jq .login");return r.success&&r.output||(r=await no("git config --global github.user"),r.success&&r.output)?r.output:null}async function Df(){let r=await no("git config user.name");return r.success&&r.output?r.output:null}async function If(){let r=await no("git config user.email");return r.success&&r.output?r.output:null}async function wn(){let[r,e,t]=await Promise.all([jf(),Df(),If()]);return{github:r,email:t,name:e||r||"Unknown"}}var ro=P(()=>{"use strict";We();u(no,"execCommand");u(jf,"detectGitHubUsername");u(Df,"detectGitName");u(If,"detectGitEmail");u(wn,"detect")});var Sr=P(()=>{"use strict"});import{z as Yt}from"zod";function vu(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 iv,av,cv,kn,lv,oo=P(()=>{"use strict";iv=Yt.enum(["opus","sonnet","haiku"]),av=Yt.enum(["2.5-pro","2.5-flash","2.0-flash"]),cv=Yt.string().min(1),kn=Yt.object({provider:Yt.string(),model:Yt.string(),cliVersion:Yt.string().optional(),recordedAt:Yt.string()}),lv=Yt.object({preferredModel:Yt.string().optional(),lastAnalysisModel:kn.optional()});u(vu,"compareSemver")});function bs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Sn,Us=P(()=>{"use strict";u(bs,"isExpired");Sn=class{static{u(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 $f from"node:fs/promises";import _f from"node:os";import Eu from"node:path";async function Cu(){try{let r=await $f.readFile(Pu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||bs(e.timestamp,Of)?null:e.detection}catch{return null}}async function xu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(Pu,e)}var Mf,Pu,Of,Ru=P(()=>{"use strict";Us();B();Mf=Eu.join(_f.homedir(),".prjct-cli","cache"),Pu=Eu.join(Mf,"providers.json"),Of=600*1e3;u(Cu,"readProviderCache");u(xu,"writeProviderCache")});var Mt={};Lt(Mt,{AntigravityProvider:()=>ia,ClaudeProvider:()=>io,CodexProvider:()=>aa,CursorProvider:()=>ju,GeminiProvider:()=>oa,Providers:()=>pt,WindsurfProvider:()=>Du,detectAllProviders:()=>br,detectAntigravity:()=>lo,detectCodex:()=>Hs,detectCursorProject:()=>_u,detectProvider:()=>ao,detectWindsurfProject:()=>Mu,getActiveProvider:()=>Uf,getCapabilities:()=>Lf,getCommandsDir:()=>Jf,getGlobalContextPath:()=>Gf,getGlobalSettingsPath:()=>Bf,getProjectCommandsPath:()=>zf,getProviderBranding:()=>co,getSkillsPath:()=>Vf,hasProviderConfig:()=>Hf,needsCursorRouterRegeneration:()=>Wf,needsWindsurfRouterRegeneration:()=>qf,selectProvider:()=>ca,validateCliVersion:()=>$u});import Ts from"node:os";import Ve from"node:path";function Lf(r,e){return{...Nf[r],...e}}async function Iu(r){try{let{stdout:e}=await O(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ff(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 ao(r){let e=pt[r];if(!e.cliCommand)return{installed:!1};let t=await Iu(e.cliCommand);if(!t)return{installed:!1};let s=await Ff(e.cliCommand),n=$u(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function $u(r,e){let t=pt[r];return!t.minCliVersion||!e?null:vu(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 br(r=!1){if(!r){let i=await Cu();if(i)return i}let[e,t,s]=await Promise.all([ao("claude"),ao("gemini"),Hs()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await xu(o).catch(()=>{}),o}async function Uf(r){if(r&&pt[r])return pt[r];let e=await br();return e.claude.installed&&!e.gemini.installed?io:e.gemini.installed&&!e.claude.installed?oa:io}async function Hf(r){let e=pt[r];return e.configDir?C(e.configDir):!1}function co(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 _u(r){let e=Ve.join(r,".cursor"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Wf(r){let e=await _u(r);return e.detected&&!e.routerInstalled}async function Mu(r){let e=Ve.join(r,".windsurf"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function qf(r){let e=await Mu(r);return e.detected&&!e.routerInstalled}async function lo(){let r=ia.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ve.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Hs(){let r=aa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Iu("codex"),t=Ve.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Gf(r){let e=pt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function Bf(r){let e=pt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Vf(r){return pt[r].skillsDir}function Jf(r){return pt[r].commandsDir}function zf(r,e){let t=pt[r];return Ve.join(e,t.commandsDir)}async function ca(){let r=await br(),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 Nf,io,oa,ia,ju,Du,aa,pt,mt=P(()=>{"use strict";Sr();oo();We();B();Ru();Nf={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}};u(Lf,"getCapabilities");io={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ve.join(Ts.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ve.join(Ts.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"},oa={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ve.join(Ts.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ve.join(Ts.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"},ia={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ve.join(Ts.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ve.join(Ts.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"},ju={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"},Du={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"},aa={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ve.join(Ts.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ve.join(Ts.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"},pt={claude:io,gemini:oa,cursor:ju,antigravity:ia,windsurf:Du,codex:aa};u(Iu,"whichCommand");u(Ff,"getCliVersion");u(ao,"detectProvider");u($u,"validateCliVersion");u(br,"detectAllProviders");u(Uf,"getActiveProvider");u(Hf,"hasProviderConfig");u(co,"getProviderBranding");u(_u,"detectCursorProject");u(Wf,"needsCursorRouterRegeneration");u(Mu,"detectWindsurfProject");u(qf,"needsWindsurfRouterRegeneration");u(lo,"detectAntigravity");u(Hs,"detectCodex");u(Gf,"getGlobalContextPath");u(Bf,"getGlobalSettingsPath");u(Vf,"getSkillsPath");u(Jf,"getCommandsDir");u(zf,"getProjectCommandsPath");u(ca,"selectProvider")});import Kf from"node:crypto";import Qt from"node:fs/promises";import la from"node:os";import V from"node:path";import{globSync as Xf}from"glob";var ua,Yf,R,Se=P(()=>{"use strict";K();B();ua=class{static{u(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?V.resolve(e):V.join(la.homedir(),".prjct-cli"),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=V.resolve(e),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}generateProjectId(e){return Kf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return V.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return V.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return V.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return V.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ks(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await Ke(this.globalBaseDir),await Ke(this.globalProjectsDir),await Ke(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 Ke(V.join(t,n));return await Ke(V.join(t,"planning","tasks")),await Ke(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=uu(t);return V.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 Ke(s),s}async listSessions(e,t=null,s=null){let n=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(n,a.name),l=await Qt.readdir(c,{withFileTypes:!0});for(let d of l){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=V.join(c,d.name),m=await Qt.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:V.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 V.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await ks(t)}getDisplayPath(e){let t=la.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return V.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return V.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return V.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return V.join(this.globalBaseDir,".running")}getDocsPath(){return V.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(mt(),lt(Mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(mt(),lt(Mt)).getActiveProvider();return(mt(),lt(Mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(la.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return V.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return V.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=V.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=V.join(e,"package.json");if(await C(n))try{let o=await Qt.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 Qt.readFile(V.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=V.join(e,"package.json"),i=await Qt.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=V.join(e,"lerna.json");if(await C(c)){let l=await Qt.readFile(c,"utf-8"),d=JSON.parse(l);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=V.join(e,"package.json"),i=await Qt.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=Xf(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),l=V.join(c,"package.json");if(await C(l))try{let d=await Qt.readFile(l,"utf-8"),p=JSON.parse(d),m=V.join(c,"PRJCT.md");s.push({name:p.name||V.basename(a),path:c,relativePath:a,hasPrjctMd:await C(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=V.resolve(e);for(let n of t.packages){let o=V.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=V.resolve(e),s=V.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=V.dirname(t)}return null}},Yf=new ua,R=Yf});var uo={};Lt(uo,{default:()=>Ut,worktreeService:()=>Nu});import da from"node:fs/promises";import Zt from"node:path";var Ou,pa,Nu,Ut,Tr=P(()=>{"use strict";We();B();Ou=".worktrees",pa=class{static{u(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=Zt.join(n,Ou,t),i=s.branch||`feat/${t}`;await da.mkdir(Zt.join(n,Ou),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await O(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await O("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await O("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await O(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await O(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await O("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await O("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await O("git rev-parse --git-dir",{cwd:e}),n=Zt.resolve(e,t.trim()),o=Zt.resolve(e,s.trim());if(n!==o){let{stdout:i}=await O("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await O("git rev-parse HEAD",{cwd:e}),{stdout:c}=await O("git rev-parse --show-toplevel",{cwd:e}),l=c.trim(),d=Zt.basename(l);return{path:l,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await O("git worktree list --porcelain",{cwd:e}),n=s.split(`
11
+ `)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await O("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=Zt.join(t,".env");await C(s)&&await da.copyFile(s,Zt.join(e,".env"));let n=Zt.join(t,".prjct"),o=Zt.join(e,".prjct");await C(n)&&!await C(o)&&await da.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await O("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
12
12
 
13
13
  `);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
14
- `),a="",c="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":Kt.basename(a)})}}return s}},wu=new Xi,Ot=wu});import Yi from"node:fs/promises";import Mf from"node:path";import*as Yr from"jsonc-parser";function ku(r){let e=[],t=Yr.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}: ${Yr.printParseErrorCode(s.error)}`)}return t}var Qi,_f,j,Ce=v(()=>{"use strict";Yt();U();q();B();It();Vr();ye();l(ku,"parseJsonc");Qi=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await Yi.readFile(t,"utf-8");return ku(s)}catch(t){return D(t)||console.warn(`Warning: Could not read config at ${e}: ${ie(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 Yi.readFile(t,"utf-8");return ku(s)}catch(t){return D(t)||console.warn(`Warning: Could not read global config for ${e}: ${ie(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=S();t={projectId:e,authors:[],version:Ee,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=S(),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:Ee,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=S(),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 Yi.readdir(Mf.join(o,"core"))).length===0}catch(i){return D(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(lr(),Xr));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=S();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=S(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await ln(),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))}}},_f=new Qi,j=_f});import Qr from"node:fs/promises";var Zi,Of,Is,Zr=v(()=>{"use strict";Ce();ye();U();Rs();B();Zi=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 j.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 Qr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(D(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Qr.readFile(d,"utf-8"),Qr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(D(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)s[u]=m,this._cache.set(d,{content:m,mtime:p})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Qr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(D(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},Of=new Zi,Is=Of});function Su(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ea(){if(Su()==="bun")return!0;try{let{execSync:r}=kt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function js(){return Su()==="bun"}var ur=v(()=>{"use strict";l(Su,"detectRuntime");l(ea,"isBunAvailable");l(js,"isBun")});var to={};Jt(to,{PrjctDatabase:()=>eo,default:()=>$,prjctDb:()=>P});import ta from"node:fs";import bu from"node:path";function Nf(r){if(js()){let{Database:n}=kt("bun:sqlite");return new n(r,{create:!0})}let e=kt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Lf,Ff,eo,P,$,te=v(()=>{"use strict";ye();ur();l(Nf,"openDatabase");Lf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
14
+ `),a="",c="",l="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?c=p.replace("HEAD ","").trim():p.startsWith("branch ")?l=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(l="(detached)");if(a){let p=a===t||d;s.push({path:a,branch:l,commit:c,isMain:p,slug:p?"main":Zt.basename(a)})}}return s}},Nu=new pa,Ut=Nu});import ma from"node:fs/promises";import Qf from"node:path";import*as po from"jsonc-parser";function Lu(r){let e=[],t=po.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}: ${po.printParseErrorCode(s.error)}`)}return t}var ga,Zf,I,Ae=P(()=>{"use strict";ns();W();K();B();_t();ro();Se();u(Lu,"parseJsonc");ga=class{static{u(this,"ConfigManager")}async readConfig(e){try{let t=R.getLocalConfigPath(e),s=await ma.readFile(t,"utf-8");return Lu(s)}catch(t){return j(t)||console.warn(`Warning: Could not read config at ${e}: ${de(t)}`),null}}async writeConfig(e,t){let s=R.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=R.getGlobalProjectConfigPath(e),s=await ma.readFile(t,"utf-8");return Lu(s)}catch(t){return j(t)||console.warn(`Warning: Could not read global config for ${e}: ${de(t)}`),null}}async writeGlobalConfig(e,t){let s=R.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=b();t={projectId:e,authors:[],version:Re,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:Re,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 ma.readdir(Qf.join(o,"core"))).length===0}catch(i){return j(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(Tr(),uo));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return 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 wn(),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))}}},Zf=new ga,I=Zf});import mo from"node:fs/promises";var fa,eh,Ws,go=P(()=>{"use strict";Ae();Se();W();Us();B();fa=class{static{u(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Sn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await I.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 l=await mo.stat(a);(!c.mtime||l.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(l){if(j(l))this._cache.delete(a);else throw l}}let i=[];for(let[a,c]of o){let l=this._cache.get(c);l!==null?s[a]=l.content:i.push([a,c])}if(i.length>0){let a=i.map(async([l,d])=>{try{let[p,m]=await Promise.all([mo.readFile(d,"utf-8"),mo.stat(d)]);return{key:l,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(j(p))return{key:l,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:l,filePath:d,content:p,mtime:m}of c)s[l]=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 mo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(j(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},eh=new fa,Ws=eh});function Fu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ha(){if(Fu()==="bun")return!0;try{let{execSync:r}=vt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function qs(){return Fu()==="bun"}var vr=P(()=>{"use strict";u(Fu,"detectRuntime");u(ha,"isBunAvailable");u(qs,"isBun")});var ho={};Lt(ho,{PrjctDatabase:()=>fo,default:()=>_,prjctDb:()=>T});import ya from"node:fs";import Uu from"node:path";function th(r){if(qs()){let{Database:n}=vt("bun:sqlite");return new n(r,{create:!0})}let e=vt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var sh,nh,fo,T,_,Y=P(()=>{"use strict";Se();vr();u(th,"openDatabase");sh=[{version:1,name:"initial-schema",up:u(r=>{r.run(`
15
15
  -- =======================================================================
16
16
  -- Document storage (backward-compatible with JSON file pattern)
17
17
  -- =======================================================================
@@ -225,7 +225,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
225
225
  started_at TEXT,
226
226
  ended_at TEXT
227
227
  );
228
- `)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
228
+ `)},"up")},{version:2,name:"archives-table",up:u(r=>{r.run(`
229
229
  -- =======================================================================
230
230
  -- Archives: Stale data moved out of active storage (PRJ-267)
231
231
  -- =======================================================================
@@ -242,7 +242,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
242
242
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
243
243
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
244
244
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
245
- `)},"up")},{version:3,name:"workflow-rules-table",up:l(r=>{r.run(`
245
+ `)},"up")},{version:3,name:"workflow-rules-table",up:u(r=>{r.run(`
246
246
  -- =======================================================================
247
247
  -- Workflow Rules: hooks, gates, and custom steps (Phase 2)
248
248
  -- =======================================================================
@@ -260,7 +260,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
260
260
  );
261
261
 
262
262
  CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
263
- `)},"up")},{version:4,name:"custom-workflows-table",up:l(r=>{r.run(`
263
+ `)},"up")},{version:4,name:"custom-workflows-table",up:u(r=>{r.run(`
264
264
  -- =======================================================================
265
265
  -- Custom Workflows: User-defined workflows with agentic auto-config
266
266
  -- =======================================================================
@@ -285,7 +285,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
285
285
  ('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
286
286
  ('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
287
287
  ('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
288
- `)},"up")},{version:5,name:"llm-analysis-table",up:l(r=>{r.run(`
288
+ `)},"up")},{version:5,name:"llm-analysis-table",up:u(r=>{r.run(`
289
289
  -- =======================================================================
290
290
  -- LLM Analysis: Structured findings from hybrid sync pipeline
291
291
  -- Pipeline: CLI (collect) \u2192 LLM (analyze) \u2192 CLI (store)
@@ -301,7 +301,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
301
301
 
302
302
  CREATE INDEX idx_llm_analysis_status ON llm_analysis(status);
303
303
  CREATE INDEX idx_llm_analysis_commit ON llm_analysis(commit_hash);
304
- `)},"up")},{version:6,name:"context-feedback-table",up:l(r=>{r.run(`
304
+ `)},"up")},{version:6,name:"context-feedback-table",up:u(r=>{r.run(`
305
305
  -- =======================================================================
306
306
  -- Context Feedback: RL loop for file suggestion improvement
307
307
  -- Records suggested vs actual files per task for scoring boosts
@@ -319,7 +319,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
319
319
  );
320
320
 
321
321
  CREATE INDEX idx_cf_task ON context_feedback(task_id);
322
- `)},"up")},{version:7,name:"sessions-table",up:l(r=>{r.run(`
322
+ `)},"up")},{version:7,name:"sessions-table",up:u(r=>{r.run(`
323
323
  -- =======================================================================
324
324
  -- Sessions: Task lifecycle tracking (replaces current.json + archive/)
325
325
  -- =======================================================================
@@ -339,13 +339,13 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
339
339
  CREATE INDEX idx_sessions_project ON sessions(project_id);
340
340
  CREATE INDEX idx_sessions_status ON sessions(status);
341
341
  CREATE INDEX idx_sessions_completed ON sessions(completed_at);
342
- `)},"up")},{version:8,name:"task-token-tracking",up:l(r=>{r.run(`
342
+ `)},"up")},{version:8,name:"task-token-tracking",up:u(r=>{r.run(`
343
343
  -- =======================================================================
344
344
  -- Token usage tracking per task (input + output)
345
345
  -- =======================================================================
346
346
  ALTER TABLE tasks ADD COLUMN tokens_in INTEGER DEFAULT 0;
347
347
  ALTER TABLE tasks ADD COLUMN tokens_out INTEGER DEFAULT 0;
348
- `)},"up")},{version:9,name:"context-health-tables",up:l(r=>{r.run(`
348
+ `)},"up")},{version:9,name:"context-health-tables",up:u(r=>{r.run(`
349
349
  -- =======================================================================
350
350
  -- Context Zone Events: Track zone transitions for health analytics
351
351
  -- =======================================================================
@@ -375,7 +375,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
375
375
  );
376
376
 
377
377
  CREATE INDEX idx_cc_project ON context_compactions(project_id);
378
- `)},"up")},{version:10,name:"fts5-memories",up:l(r=>{r.run(`
378
+ `)},"up")},{version:10,name:"fts5-memories",up:u(r=>{r.run(`
379
379
  -- =======================================================================
380
380
  -- Memories: Tagged, searchable memory store (replaces memories.json)
381
381
  -- =======================================================================
@@ -428,7 +428,7 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
428
428
  INSERT OR IGNORE INTO memories
429
429
  (id, project_id, title, content, tags, content_hash, user_triggered, confidence, observation_count, created_at, updated_at)
430
430
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
431
- `);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(`
431
+ `);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:u(r=>{r.run(`
432
432
  -- =======================================================================
433
433
  -- Agent Sessions: Track AI agent work sessions across compactions
434
434
  -- =======================================================================
@@ -461,47 +461,58 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
461
461
 
462
462
  CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
463
463
  CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
464
- `);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Ff=3,eo=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return bu.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Ff&&this.evictLru();let s=this.getDbPath(e),n=bu.dirname(s);ta.existsSync(n)||ta.mkdirSync(n,{recursive:!0});let o=Nf(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 ta.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(`
464
+ `);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")},{version:12,name:"task-body-and-comments",up:u(r=>{try{r.run("ALTER TABLE queue_tasks ADD COLUMN body TEXT")}catch{}r.run(`
465
+ CREATE TABLE IF NOT EXISTS queue_task_comments (
466
+ id TEXT PRIMARY KEY,
467
+ task_id TEXT NOT NULL,
468
+ author TEXT NOT NULL DEFAULT 'user',
469
+ content TEXT NOT NULL,
470
+ created_at TEXT NOT NULL,
471
+ updated_at TEXT NOT NULL
472
+ );
473
+
474
+ CREATE INDEX IF NOT EXISTS idx_qtc_task_id ON queue_task_comments(task_id);
475
+ `)},"up")}],nh=3,fo=class{static{u(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Uu.join(R.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=nh&&this.evictLru();let s=this.getDbPath(e),n=Uu.dirname(s);ya.existsSync(n)||ya.mkdirSync(n,{recursive:!0});let o=th(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 ya.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(`
465
476
  CREATE TABLE IF NOT EXISTS _migrations (
466
477
  version INTEGER PRIMARY KEY,
467
478
  name TEXT NOT NULL,
468
479
  applied_at TEXT NOT NULL
469
480
  )
470
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Lf)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 eo,$=P});function so(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Fe,dr=v(()=>{"use strict";Fe={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(so,"calculateConfidence")});var no,ro,oo,sa=v(()=>{"use strict";te();dr();q();no=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=$.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();$.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}},ro=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()}},oo=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:S(),...t,type:t.type};$.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return $.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 io,Tu=v(()=>{"use strict";te();dr();q();sa();io=class r extends no{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=S();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=so(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=S(),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=S();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=so(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=S(),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:S(),confidence:so(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=S(),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=$.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return $.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import Uf from"node:crypto";import{homedir as Hf}from"node:os";import{join as Wf}from"node:path";function J(){return Uf.randomUUID()}var dE,vt=v(()=>{"use strict";l(J,"generateUUID");dE=Wf(Hf(),".prjct-cli","projects")});import{createHash as vu}from"node:crypto";function mr(r){return vu("sha256").update(r).digest("hex")}function $s(r){return mr(r).slice(0,16)}function Eu(r){return vu("md5").update(r).digest("hex")}var Ms=v(()=>{"use strict";l(mr,"sha256");l($s,"sha256Short");l(Eu,"md5")});function Zt(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 mn,na=v(()=>{"use strict";vt();te();dr();q();Ms();l(Zt,"rowToMemory");mn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Fe));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=S(),d=$s(s),m=$.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(m)return m.id;if(i){let g=$.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return $.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
471
- revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let p=J();return $.run(e,`INSERT INTO memories
481
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of sh)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}},T=new fo,_=T});function yo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var qe,Er=P(()=>{"use strict";qe={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"};u(yo,"calculateConfidence")});var wo,ko,So,wa=P(()=>{"use strict";Y();Er();K();wo=class{static{u(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=_.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();_.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}},ko=class{static{u(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()}},So=class{static{u(this,"HistoryStore")}async appendHistory(e,t){let s={ts:b(),...t,type:t.type};_.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return _.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 bo,Hu=P(()=>{"use strict";Y();Er();K();wa();bo=class r extends wo{static{u(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=yo(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=yo(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:yo(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 l=new Date(c.lastSeen).getTime();s-l>n&&o.push(a)}if(o.length===0)return 0;let i=_.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return _.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import rh from"node:crypto";import{homedir as oh}from"node:os";import{join as ih}from"node:path";function z(){return rh.randomUUID()}var AE,xt=P(()=>{"use strict";u(z,"generateUUID");AE=ih(oh(),".prjct-cli","projects")});import{createHash as Wu}from"node:crypto";function Pr(r){return Wu("sha256").update(r).digest("hex")}function Gs(r){return Pr(r).slice(0,16)}function qu(r){return Wu("md5").update(r).digest("hex")}var Bs=P(()=>{"use strict";u(Pr,"sha256");u(Gs,"sha256Short");u(qu,"md5")});function os(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 bn,ka=P(()=>{"use strict";xt();Y();Er();K();Bs();u(os,"rowToMemory");bn=class{static{u(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(qe));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(","),l=b(),d=Gs(s),p=_.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=_.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return _.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
482
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,l,g.id),g.id}let m=z();return _.run(e,`INSERT INTO memories
472
483
  (id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
473
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}async updateMemory(e,t,s){let n=$.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?$s(i):n.content_hash;return $.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
474
- revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,S(),t),!0}async deleteMemory(e,t){return $.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?($.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",S(),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 $.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
475
- AND (${a}) ORDER BY updated_at DESC`,...c).map(Zt)}async searchMemories(e,t,s=20,n=0){try{return $.query(e,`SELECT m.* FROM memories m
484
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,l,l),m}async updateMemory(e,t,s){let n=_.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?Gs(i):n.content_hash;return _.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
485
+ revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,b(),t),!0}async deleteMemory(e,t){return _.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(_.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 _.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
486
+ AND (${a}) ORDER BY updated_at DESC`,...c).map(os)}async searchMemories(e,t,s=20,n=0){try{return _.query(e,`SELECT m.* FROM memories m
476
487
  JOIN memories_fts fts ON m.rowid = fts.rowid
477
488
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
478
- ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Zt)}catch{let o=`%${t}%`;return $.query(e,`SELECT * FROM memories
489
+ ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(os)}catch{let o=`%${t}%`;return _.query(e,`SELECT * FROM memories
479
490
  WHERE project_id = ? AND deleted_at IS NULL
480
491
  AND (title LIKE ? OR content LIKE ?)
481
- ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Zt)}}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 $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Zt);let o=n.join(" ");try{return $.query(e,`SELECT m.* FROM memories m
492
+ ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(os)}}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 _.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(os);let o=n.join(" ");try{return _.query(e,`SELECT m.* FROM memories m
482
493
  JOIN memories_fts fts ON m.rowid = fts.rowid
483
494
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
484
- ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Zt)}catch{return $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Zt)}}async getRelevantMemoriesWithMetrics(e,t){let n=$.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,m)=>({...d,relevanceScore:Math.max(10,100-m*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-m*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,m)=>d+m.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Fe.COMMIT_STYLE],branch_naming:[Fe.BRANCH_NAMING],test_before_ship:[Fe.TEST_BEHAVIOR,Fe.SHIP_WORKFLOW],preferred_agent:[Fe.AGENT_PREFERENCE],code_style:[Fe.CODE_STYLE],verbosity:[Fe.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
485
- 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 $.query(e,`SELECT m.* FROM memories m
495
+ ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(os)}catch{return _.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(os)}}async getRelevantMemoriesWithMetrics(e,t){let n=_.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),l=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:l}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[qe.COMMIT_STYLE],branch_naming:[qe.BRANCH_NAMING],test_before_ship:[qe.TEST_BEHAVIOR,qe.SHIP_WORKFLOW],preferred_agent:[qe.AGENT_PREFERENCE],code_style:[qe.CODE_STYLE],verbosity:[qe.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
496
+ 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 _.query(e,`SELECT m.* FROM memories m
486
497
  JOIN memories_fts fts ON m.rowid = fts.rowid
487
498
  WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
488
- ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Zt)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=$.query(e,`SELECT title, COUNT(*) as cnt FROM memories
499
+ ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(os)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=_.query(e,`SELECT title, COUNT(*) as cnt FROM memories
489
500
  WHERE project_id = ? AND deleted_at IS NULL
490
- GROUP BY title HAVING cnt > 1`,e),n=S();for(let o of s){let i=$.query(e,`SELECT * FROM memories
501
+ GROUP BY title HAVING cnt > 1`,e),n=b();for(let o of s){let i=_.query(e,`SELECT * FROM memories
491
502
  WHERE project_id = ? AND title = ? AND deleted_at IS NULL
492
- ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(p=>p.content!==a.content).map(p=>p.content)].filter((p,g,h)=>h.indexOf(p)===g).join(`
503
+ ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,l=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,h)=>h.indexOf(m)===g).join(`
493
504
 
494
505
  ---
495
506
 
496
- `),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&$.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let m=[];for(let p of c)$.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,p.id),m.push(p.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:m})}return t}async getMemoryById(e,t){let s=$.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Zt(s):null}async getAllMemories(e){return $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Zt)}async getMemoryStats(e){let t=$.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 ra,Gf,nt,ao=v(()=>{"use strict";sa();Tu();na();ra=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new mn,this._patternStore=new io,this._historyStore=new oo,this._sessionStore=new ro}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()}},Gf=new ra,nt=Gf});import $t from"node:fs/promises";import Nt from"node:path";var oa,Vf,Be,Pu=v(()=>{"use strict";U();Le();B();oa=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(D(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(D(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(D(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(D(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(D(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(D(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(D(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(D(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(D(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await _('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(`
497
- `).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(D(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(D(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await _(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await _("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await _('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await _('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 _('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return C(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(D(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await _(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
498
- `).filter(Boolean)}catch{return[]}}},Vf=new oa,Be=Vf});import aa from"node:fs";import Bf from"node:fs/promises";import co from"node:path";function ca(){if(Cu)return ia;Cu=!0;let r=co.join(lt,"dist","templates.json");try{let e=aa.readFileSync(r,"utf-8");return ia=JSON.parse(e),ia}catch{return null}}function qf(r){let e=_s.indexOf(r);e>-1&&_s.splice(e,1),_s.push(r)}function zf(){for(;pn.size>=Jf&&_s.length>0;){let r=_s.shift();r&&pn.delete(r)}}function xu(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(`
499
- `).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 Au(r){if(pn.has(r))return qf(r),pn.get(r);let e,t=ca();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=co.join(lt,"templates","commands",`${r}.md`);try{e=await Bf.readFile(n,"utf-8")}catch{throw Ur.notFound(r)}}let s=xu(e);return zf(),pn.set(r,s),_s.push(r),s}async function Kf(r){return(await Au(r)).frontmatter["allowed-tools"]||[]}function Xf(){pn.clear(),_s.length=0}function gt(r){let e=ca();if(e?.[r])return e[r];let t=co.join(lt,"templates",r);try{return aa.readFileSync(t,"utf-8")}catch{return null}}function gn(r){let e=ca();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=co.join(lt,"templates",r);try{return aa.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Jf,pn,_s,ia,Cu,Yf,Ru,Os=v(()=>{"use strict";Yt();It();Jf=50,pn=new Map,_s=[],ia=null,Cu=!1;l(ca,"loadBundle");l(qf,"updateLruOrder");l(zf,"evictLru");l(xu,"parseFrontmatter");l(Au,"load");l(Kf,"getAllowedTools");l(Xf,"clearCache");l(gt,"getTemplateContent");l(gn,"listTemplates");Yf={load:Au,parseFrontmatter:xu,getAllowedTools:Kf,clearCache:Xf,getTemplateContent:gt,listTemplates:gn},Ru=Yf});function Zf(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Qf.has(r)||r.includes("prjct"))return{level:fn.debug,name:"debug"};let e=fn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function lo(r,e,t){return Du>=r?(...s)=>console[t](e,...s):th}var fn,Qf,Du,eh,th,sh,H,es=v(()=>{"use strict";fn={error:0,warn:1,info:2,debug:3},Qf=new Set(["1","true","*"]);l(Zf,"getLogLevel");({level:Du,name:eh}=Zf()),th=l(()=>{},"noop");l(lo,"createLogMethod");sh={error:lo(fn.error,"[prjct:error]","error"),warn:lo(fn.warn,"[prjct:warn]","warn"),info:lo(fn.info,"[prjct:info]","log"),debug:lo(fn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Du>=0,"isEnabled"),level:l(()=>eh,"level")},H=sh});function uo(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
507
+ `),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(l!==a.content||d.size>0)&&_.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",l,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)_.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=_.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?os(s):null}async getAllMemories(e){return _.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(os)}async getMemoryStats(e){let t=_.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 Sa,ah,it,To=P(()=>{"use strict";wa();Hu();ka();Sa=class{static{u(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new bn,this._patternStore=new bo,this._historyStore=new So,this._sessionStore=new ko}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()}},ah=new Sa,it=ah});import Ot from"node:fs/promises";import Ht from"node:path";var ba,ch,Xe,Gu=P(()=>{"use strict";W();We();B();ba=class{static{u(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Ht.join(this.projectPath,"package.json"),t=await Ot.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(j(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Ht.join(this.projectPath,"Cargo.toml");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readRequirements(){try{let e=Ht.join(this.projectPath,"requirements.txt");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readGoMod(){try{let e=Ht.join(this.projectPath,"go.mod");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readGemfile(){try{let e=Ht.join(this.projectPath,"Gemfile");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readMixExs(){try{let e=Ht.join(this.projectPath,"mix.exs");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readPomXml(){try{let e=Ht.join(this.projectPath,"pom.xml");return await Ot.readFile(e,"utf-8")}catch(e){if(j(e))return null;throw e}}async readComposerJson(){try{let e=Ht.join(this.projectPath,"composer.json"),t=await Ot.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(j(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Ht.join(this.projectPath,"pyproject.toml");return await Ot.readFile(e,"utf-8")}catch(e){if(j(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(`
508
+ `).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 Ot.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(j(e))return[];throw e}}async listDirectories(){try{return(await Ot.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(j(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 C(Ht.join(this.projectPath,e))}async readFile(e){try{let t=Ht.join(this.projectPath,e);return await Ot.readFile(t,"utf-8")}catch(t){if(j(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(`
509
+ `).filter(Boolean)}catch{return[]}}},ch=new ba,Xe=ch});import va from"node:fs";import lh from"node:fs/promises";import vo from"node:path";function Ea(){if(Bu)return Ta;Bu=!0;let r=vo.join(dt,"dist","templates.json");try{let e=va.readFileSync(r,"utf-8");return Ta=JSON.parse(e),Ta}catch{return null}}function dh(r){let e=Vs.indexOf(r);e>-1&&Vs.splice(e,1),Vs.push(r)}function ph(){for(;Tn.size>=uh&&Vs.length>0;){let r=Vs.shift();r&&Tn.delete(r)}}function Vu(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(`
510
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let l=c.join(":").trim();l.startsWith("[")&&l.endsWith("]")?o[a.trim()]=l.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=l.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function Ju(r){if(Tn.has(r))return dh(r),Tn.get(r);let e,t=Ea();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=vo.join(dt,"templates","commands",`${r}.md`);try{e=await lh.readFile(n,"utf-8")}catch{throw eo.notFound(r)}}let s=Vu(e);return ph(),Tn.set(r,s),Vs.push(r),s}async function mh(r){return(await Ju(r)).frontmatter["allowed-tools"]||[]}function gh(){Tn.clear(),Vs.length=0}function kt(r){let e=Ea();if(e?.[r])return e[r];let t=vo.join(dt,"templates",r);try{return va.readFileSync(t,"utf-8")}catch{return null}}function vn(r){let e=Ea();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=vo.join(dt,"templates",r);try{return va.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var uh,Tn,Vs,Ta,Bu,fh,zu,Js=P(()=>{"use strict";ns();_t();uh=50,Tn=new Map,Vs=[],Ta=null,Bu=!1;u(Ea,"loadBundle");u(dh,"updateLruOrder");u(ph,"evictLru");u(Vu,"parseFrontmatter");u(Ju,"load");u(mh,"getAllowedTools");u(gh,"clearCache");u(kt,"getTemplateContent");u(vn,"listTemplates");fh={load:Ju,parseFrontmatter:Vu,getAllowedTools:mh,clearCache:gh,getTemplateContent:kt,listTemplates:vn},zu=fh});function yh(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(hh.has(r)||r.includes("prjct"))return{level:En.debug,name:"debug"};let e=En[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Eo(r,e,t){return Ku>=r?(...s)=>console[t](e,...s):kh}var En,hh,Ku,wh,kh,Sh,q,is=P(()=>{"use strict";En={error:0,warn:1,info:2,debug:3},hh=new Set(["1","true","*"]);u(yh,"getLogLevel");({level:Ku,name:wh}=yh()),kh=u(()=>{},"noop");u(Eo,"createLogMethod");Sh={error:Eo(En.error,"[prjct:error]","error"),warn:Eo(En.warn,"[prjct:warn]","warn"),info:Eo(En.info,"[prjct:info]","log"),debug:Eo(En.debug,"[prjct:debug]","log"),isEnabled:u(()=>Ku>=0,"isEnabled"),level:u(()=>wh,"level")},q=Sh});function Po(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
500
511
 
501
- ${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 la=v(()=>{"use strict";Os();U();B();es();It();l(uo,"mergeWithMarkers")});import Xe from"node:fs/promises";import mo from"node:os";import Se from"node:path";async function nh(){try{let r=Se.join(mo.homedir(),".prjct-cli","docs");await Xe.mkdir(r,{recursive:!0});let e=gn("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=gt(n);if(o){let i=Se.basename(n);await Xe.writeFile(Se.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(It(),at(Hi)),s=Se.join(t,"templates/global/docs");try{let n=await Xe.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Se.join(s,o),a=Se.join(r,o),c=await Xe.readFile(i,"utf-8");await Xe.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function rh(){let r=(dt(),at(jt)),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 Xe.mkdir(e.configDir,{recursive:!0});let n=Se.join(e.configDir,e.contextFile),o=Iu;if(t!=="claude"){let g=gt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(It(),at(Hi)),b=Se.join(h,"templates","global",e.contextFile);try{o=await Xe.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Iu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Xe.readFile(n,"utf-8"),a=!0}catch(g){if(D(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,`
512
+ ${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 Pa=P(()=>{"use strict";Js();W();B();is();_t();u(Po,"mergeWithMarkers")});import st from"node:fs/promises";import Co from"node:os";import ve from"node:path";async function bh(){try{let r=ve.join(Co.homedir(),".prjct-cli","docs");await st.mkdir(r,{recursive:!0});let e=vn("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=kt(n);if(o){let i=ve.basename(n);await st.writeFile(ve.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(_t(),lt(na)),s=ve.join(t,"templates/global/docs");try{let n=await st.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=ve.join(s,o),a=ve.join(r,o),c=await st.readFile(i,"utf-8");await st.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function Th(){let r=(mt(),lt(Mt)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await st.mkdir(e.configDir,{recursive:!0});let n=ve.join(e.configDir,e.contextFile),o=Xu;if(t!=="claude"){let g=kt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(_t(),lt(na)),S=ve.join(h,"templates","global",e.contextFile);try{o=await st.readFile(S,"utf-8")}catch{t==="gemini"&&(o=Xu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await st.readFile(n,"utf-8"),a=!0}catch(g){if(j(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",l="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(l)){let g=i.substring(0,i.indexOf(c)),h=i.substring(i.indexOf(l)+l.length);i=`${(g+h).replace(/\n{3,}/g,`
502
513
 
503
514
  `).trim()}
504
- `}let p=uo(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Xe.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:y(n),action:"failed"}}}function ju(){let r=mo.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 Iu,ts,oh,xe,ss=v(()=>{"use strict";Os();U();B();la();Iu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
515
+ `}let m=Po(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await st.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:w(n),action:"failed"}}}function Yu(){let r=Co.homedir();return{claude:{commands:ve.join(r,".claude","commands"),config:ve.join(r,".claude"),router:ve.join(r,".claude","commands","p.md")},gemini:{commands:ve.join(r,".gemini","commands"),config:ve.join(r,".gemini"),router:ve.join(r,".gemini","commands","p.toml")}}}var Xu,as,vh,je,cs=P(()=>{"use strict";Js();W();B();Pa();Xu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
505
516
  # p/ \u2014 Context layer for AI agents
506
517
 
507
518
  Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
@@ -517,45 +528,45 @@ Data:
517
528
 
518
529
  **Auto-managed by prjct-cli** | https://prjct.app
519
530
  <!-- prjct:end - DO NOT REMOVE THIS MARKER -->
520
- `;l(nh,"installDocs");l(rh,"installGlobalConfig");ts=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=mo.homedir()}async ensureInit(){if(this._initialized)return;let t=await(dt(),at(jt)).getActiveProvider();this.commandsPath=Se.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(dt(),at(jt)).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 Xe.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=Se.join(this.commandsPath,t);try{await Xe.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 Xe.stat(e).catch(()=>null))?.isDirectory())return await Xe.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return rh()}async cleanupAllLegacy(){let e=mo.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 Xe.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 Xe.stat(i).catch(()=>null))?.isDirectory()&&(await Xe.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 Xe.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return nh()}};l(ju,"getProviderPaths");oh=new ts,xe=oh});import{z as je}from"zod";function Ou(r,e="default"){let t=$u[e]||$u.default;return r/1e3*t}function po(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var ih,ah,Mu,_u,$u,go=v(()=>{"use strict";ih=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),ah=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Mu=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(ah),dailyStats:je.array(ih),firstSync:je.string(),lastUpdated:je.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(po,"formatCost")});function Nu(r,e){let t=[];pr("Languages",r.languages,e.languages,t),pr("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)"}),pr("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);pr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);pr("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 ua(r){if(!r.hasChanges)return`## Analysis Diff
531
+ `;u(bh,"installDocs");u(Th,"installGlobalConfig");as=class{static{u(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Co.homedir()}async ensureInit(){if(this._initialized)return;let t=await(mt(),lt(Mt)).getActiveProvider();this.commandsPath=ve.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(mt(),lt(Mt)).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=ve.join(this.commandsPath,t);try{await st.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=ve.join(this.commandsPath,t);try{await st.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=ve.join(this.commandsPath,"p");try{if((await st.stat(e).catch(()=>null))?.isDirectory())return await st.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Th()}async cleanupAllLegacy(){let e=Co.homedir(),t=[],s=[ve.join(e,".claude","commands","p.md"),ve.join(e,".claude","commands","p.toml"),ve.join(e,".gemini","commands","p.md"),ve.join(e,".gemini","commands","p.toml")];for(let i of s)try{await st.unlink(i),t.push(i)}catch{}let n=[ve.join(e,".claude","commands","p"),ve.join(e,".gemini","commands","p")];for(let i of n)try{(await st.stat(i).catch(()=>null))?.isDirectory()&&(await st.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[ve.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await st.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return bh()}};u(Yu,"getProviderPaths");vh=new as,je=vh});import{z as Me}from"zod";function td(r,e="default"){let t=Qu[e]||Qu.default;return r/1e3*t}function xo(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Eh,Ph,Zu,ed,Qu,Ro=P(()=>{"use strict";Eh=Me.object({date:Me.string(),tokensSaved:Me.number(),syncs:Me.number(),avgCompressionRate:Me.number(),totalDuration:Me.number()}),Ph=Me.object({agentName:Me.string(),usageCount:Me.number(),tokensSaved:Me.number()}),Zu=Me.object({totalTokensSaved:Me.number(),avgCompressionRate:Me.number(),syncCount:Me.number(),watchTriggers:Me.number(),avgSyncDuration:Me.number(),totalSyncDuration:Me.number(),agentUsage:Me.array(Ph),dailyStats:Me.array(Eh),firstSync:Me.string(),lastUpdated:Me.string()}),ed={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qu={"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};u(td,"estimateCostSaved");u(xo,"formatCost")});function sd(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,l=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:l},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Ca(r){if(!r.hasChanges)return`## Analysis Diff
521
532
 
522
533
  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(`
523
- `)}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(`
524
- `)}function pr(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 da=v(()=>{"use strict";l(Nu,"generateAnalysisDiff");l(ua,"formatAnalysisDiffMd");l(Lu,"formatAnalysisDiffText");l(pr,"diffStringArray")});var ma,pa,Fu,gr=v(()=>{"use strict";ma=[1,2,3,5,8,13,21],pa={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 ch from"node:fs/promises";import lh from"node:path";function hn(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 uh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...hn(p));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of n){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...hn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...hn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...hn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...hn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Wu.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function dh(r){return r.split(/\s+/).flatMap(e=>hn(e)).filter(e=>e.length>1&&!Wu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function mh(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async a=>{try{let c=await ch.readFile(lh.join(r,a),"utf-8"),u=uh(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function ph(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function gh(r,e){let t=dh(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=ph(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function fh(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]))};$.setDoc(r,Gu,t)}function fo(r){let e=$.getDoc(r,Gu);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 mh(r);return fh(e,t),t}function Bu(r,e,t=15){let s=fo(r);return s?gh(e,s).slice(0,t):[]}var Wu,Gu,ga=v(()=>{"use strict";gr();te();B();Wu=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(hn,"splitIdentifier");l(uh,"tokenizeFile");l(dh,"tokenizeQuery");l(mh,"buildIndex");l(ph,"idf");l(gh,"score");Gu="bm25-index";l(fh,"saveIndex");l(fo,"loadIndex");l(Vu,"indexProject");l(Bu,"queryFiles")});import fa from"node:fs/promises";import hs from"node:path";import{z as K}from"zod";async function Sh(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=hs.join(e,"package.json"),n=await fa.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return D(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 bh(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 Ph(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=kh[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 Th(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=hs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function vh(r,e){let t=Date.now();try{let s=await Ch(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 Eh(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=hs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Ju(r,e){let t=Date.now(),s=await Promise.all([Sh(r,e),bh(r,e),Th(r,e),vh(r,e),Eh(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 Ph(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await fa.readdir(n,{withFileTypes:!0});for(let i of o){let a=hs.join(n,i.name),c=hs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=hs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function Ch(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await fa.readdir(n,{withFileTypes:!0});for(let i of o){let a=hs.join(n,i.name),c=hs.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 hh,yh,wh,ha,CP,kh,qu=v(()=>{"use strict";U();B();Br();hh=K.enum(["draft","verified","sealed"]),yh=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),wh=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),ha=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(yh),antiPatterns:K.array(wh),analyzedAt:K.string(),modelMetadata:un.optional(),status:hh.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),CP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},kh={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(Sh,"verifyFrameworks");l(bh,"verifyLanguages");l(Th,"verifyPatternLocations");l(vh,"verifyFileCount");l(Eh,"verifyAntiPatternFiles");l(Ju,"semanticVerify");l(Ph,"getProjectExtensions");l(Ch,"countProjectFiles")});var ya,ys,wa=v(()=>{"use strict";ye();q();B();ya=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Pe(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Pe(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:S(),success:!0};await le(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Pe(t,null)}},ys=new ya});var Je,ns=v(()=>{"use strict";wa();Rs();q();te();Je=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=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:S(),projectId:e};await ys.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:S()};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 ka,qe,yn=v(()=>{"use strict";qu();da();q();Ms();ns();ka=class extends Je{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"};ha.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:S()})),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=S(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ha.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=S();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 Ju(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 mr(JSON.stringify(t))}},qe=new ka});var Sa,xh,Lt,fr=v(()=>{"use strict";q();te();Sa=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=S();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}})}},xh=new Sa,Lt=xh});import{z as T}from"zod";var Ah,ho,Rh,Dh,Ih,ba,Ku,Xu,Yu,Ta,zu,jh,$h,Mh,Qu,Zu,ed,_h,Oh,QP,va=v(()=>{"use strict";Br();Ah=T.enum(["low","medium","high","critical"]),ho=T.enum(["feature","bug","improvement","chore"]),Rh=T.enum(["active","backlog","previously_active"]),Dh=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ih=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ba=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()}),Ku=T.object({output:T.string().min(1,"Subtask output is required"),summary:ba}),Xu=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Dh,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:ba.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),Yu=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Ta=T.object({id:T.string(),description:T.string(),type:ho.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Xu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:Yu.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:un.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),zu=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:ho.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(Xu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:Yu.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:un.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),jh=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()}),$h=T.object({taskId:T.string(),title:T.string(),classification:ho,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(ba),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:jh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Mh=Ta.extend({workspaceId:T.string(),worktreePath:T.string().optional(),agentSessionId:T.string().optional(),jiraId:T.string().optional(),jiraUuid:T.string().optional(),dispatchedFrom:T.string().optional()}),Qu=T.object({currentTask:Ta.nullable(),previousTask:zu.nullable().optional(),pausedTasks:T.array(zu).optional(),taskHistory:T.array($h).optional(),activeTasks:T.array(Mh).optional(),lastUpdated:T.string()}),Zu=T.object({id:T.string(),description:T.string(),priority:Ah,type:ho,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Rh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),ed=T.object({tasks:T.array(Zu),lastUpdated:T.string()}),_h=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),Oh=T.object({type:Ih,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),QP=T.object({projectId:T.string(),currentTask:Ta.nullable(),queue:T.array(Zu),stats:_h,recentActivity:T.array(Oh),lastSync:T.string()})});var hr,Ea,Ns,Pa=v(()=>{"use strict";hr={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"}},Ea=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=hr[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 hr[e]}getPrompt(e){return hr[e].prompt}getValidCommands(e){return hr[e].transitions}formatNextSteps(e){return hr[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}`}})}},Ns=new Ea});var rs,Ca,Mt,Ls=v(()=>{"use strict";vt();q();te();rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ca=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=J(),n=S();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=S();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(J(),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}},Mt=new Ca});var xa,O,ft=v(()=>{"use strict";vt();va();q();Pa();Ls();ns();xa=class extends Je{static{l(this,"StateStorage")}constructor(){super("state.json",Qu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Ns.getCurrentState(e),n=Ns.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:S()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:S()})),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:S()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=S(),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:S(),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:S()})),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,...m}=i,p={...m,startedAt:S(),sessionId:i.sessionId??J()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:S()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];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:S()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:S()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(p=>p.feedback),n=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:S()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:S()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=S(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:S()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:S()})),{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?S():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:S()})),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=Ku.safeParse(t);if(!s.success){let h=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
534
+ `)}function nd(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(`
535
+ `)}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 xa=P(()=>{"use strict";u(sd,"generateAnalysisDiff");u(Ca,"formatAnalysisDiffMd");u(nd,"formatAnalysisDiffText");u(Cr,"diffStringArray")});var Ra,Aa,rd,xr=P(()=>{"use strict";Ra=[1,2,3,5,8,13,21],Aa={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}},rd={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Ch from"node:fs/promises";import xh from"node:path";function Pn(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 Rh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...Pn(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(...Pn(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(...Pn(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(...Pn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...Pn(g))}}let c=/\/\/\s*(.+)/g,l;for(;(l=c.exec(r))!==null;){let m=l[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&&!ad.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function Ah(r){return r.split(/\s+/).flatMap(e=>Pn(e)).filter(e=>e.length>1&&!ad.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function jh(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async a=>{try{let c=await Ch.readFile(xh.join(r,a),"utf-8"),l=Rh(c,a);return l.length>0?{filePath:a,tokens:l}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let l=new Map;for(let d of c)l.set(d,(l.get(d)||0)+1);for(let[d,p]of l)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 Dh(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Ih(r,e){let t=Ah(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=Dh(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let l=e.documents[a];if(!l)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(l.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 $h(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]))};_.setDoc(r,cd,t)}function Ao(r){let e=_.getDoc(r,cd);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 ld(r,e){let t=await jh(r);return $h(e,t),t}function ud(r,e,t=15){let s=Ao(r);return s?Ih(e,s).slice(0,t):[]}var ad,cd,ja=P(()=>{"use strict";xr();Y();B();ad=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"]);u(Pn,"splitIdentifier");u(Rh,"tokenizeFile");u(Ah,"tokenizeQuery");u(jh,"buildIndex");u(Dh,"idf");u(Ih,"score");cd="bm25-index";u($h,"saveIndex");u(Ao,"loadIndex");u(ld,"indexProject");u(ud,"queryFiles")});import Da from"node:fs/promises";import vs from"node:path";import{z as Q}from"zod";async function Lh(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=vs.join(e,"package.json"),n=await Da.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let l of r.frameworks){let d=l.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(l):a.push(l)}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 j(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 Fh(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 qh(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=Nh[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 Uh(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=vs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Hh(r,e){let t=Date.now();try{let s=await Gh(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 Wh(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=vs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function dd(r,e){let t=Date.now(),s=await Promise.all([Lh(r,e),Fh(r,e),Uh(r,e),Hh(r,e),Wh(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 qh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Da.readdir(n,{withFileTypes:!0});for(let i of o){let a=vs.join(n,i.name),c=vs.relative(r,a);if(!t.some(l=>l.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let l=vs.extname(i.name);l&&e.add(l)}}}}catch{}}return u(s,"scanDir"),await s(r),Array.from(e)}async function Gh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Da.readdir(n,{withFileTypes:!0});for(let i of o){let a=vs.join(n,i.name),c=vs.relative(r,a);t.some(l=>l.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return u(s,"scanDir"),await s(r),e}var _h,Mh,Oh,Ia,GP,Nh,pd=P(()=>{"use strict";W();B();oo();_h=Q.enum(["draft","verified","sealed"]),Mh=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()}),Oh=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()}),Ia=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(Mh),antiPatterns:Q.array(Oh),analyzedAt:Q.string(),modelMetadata:kn.optional(),status:_h.default("draft"),commitHash:Q.string().optional(),signature:Q.string().optional(),sealedAt:Q.string().optional(),verifiedAt:Q.string().optional()}),GP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Nh={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"]};u(Lh,"verifyFrameworks");u(Fh,"verifyLanguages");u(Uh,"verifyPatternLocations");u(Hh,"verifyFileCount");u(Wh,"verifyAntiPatternFiles");u(dd,"semanticVerify");u(qh,"getProjectExtensions");u(Gh,"countProjectFiles")});var $a,Es,_a=P(()=>{"use strict";Se();K();B();$a=class{static{u(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await Te(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await Te(t,[])??[]}async clearPending(e){let t=R.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=R.getLastSyncPath(e),s={timestamp:b(),success:!0};await le(t,s)}async getLastSync(e){let t=R.getLastSyncPath(e);return await Te(t,null)}},Es=new $a});var Ye,ls=P(()=>{"use strict";_a();Us();K();Y();Ye=class{static{u(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Sn({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=T.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){T.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 Es.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 T.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Ma,Qe,Cn=P(()=>{"use strict";pd();xa();K();Bs();ls();Ma=class extends Ye{static{u(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"};Ia.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 Ia.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:sd(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 dd(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 Pr(JSON.stringify(t))}},Qe=new Ma});var Oa,jo,Wt,xn=P(()=>{"use strict";K();Y();Oa=class{static{u(this,"LLMAnalysisStorage")}save(e,t){let s=T.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=T.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?T.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return T.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}})}},jo=new Oa,Wt=jo});import{z as v}from"zod";var Bh,Do,Vh,Jh,zh,Na,gd,fd,hd,La,md,Kh,Xh,Yh,yd,wd,kd,Qh,Zh,hC,Fa=P(()=>{"use strict";oo();Bh=v.enum(["low","medium","high","critical"]),Do=v.enum(["feature","bug","improvement","chore"]),Vh=v.enum(["active","backlog","previously_active"]),Jh=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),zh=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Na=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),gd=v.object({output:v.string().min(1,"Subtask output is required"),summary:Na}),fd=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:Jh,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Na.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),hd=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),La=v.object({id:v.string(),description:v.string(),type:Do.optional(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(fd).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:hd.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:kn.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional(),parentDescription:v.string().optional(),branch:v.string().optional(),prUrl:v.string().optional()}),md=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional(),type:Do.optional(),sessionId:v.string().optional(),featureId:v.string().optional(),subtasks:v.array(fd).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:hd.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:kn.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional()}),Kh=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),Xh=v.object({taskId:v.string(),title:v.string(),classification:Do,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Na),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:Kh.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional()}),Yh=La.extend({workspaceId:v.string(),worktreePath:v.string().optional(),agentSessionId:v.string().optional(),jiraId:v.string().optional(),jiraUuid:v.string().optional(),dispatchedFrom:v.string().optional()}),yd=v.object({currentTask:La.nullable(),previousTask:md.nullable().optional(),pausedTasks:v.array(md).optional(),taskHistory:v.array(Xh).optional(),activeTasks:v.array(Yh).optional(),lastUpdated:v.string()}),wd=v.object({id:v.string(),description:v.string(),body:v.string().optional(),priority:Bh,type:Do,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:Vh,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),kd=v.object({tasks:v.array(wd),lastUpdated:v.string()}),Qh=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),Zh=v.object({type:zh,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),hC=v.object({projectId:v.string(),currentTask:La.nullable(),queue:v.array(wd),stats:Qh,recentActivity:v.array(Zh),lastSync:v.string()})});var Rr,Ua,zs,Ha=P(()=>{"use strict";Rr={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"}},Ua=class{static{u(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=Rr[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 Rr[e]}getPrompt(e){return Rr[e].prompt}getValidCommands(e){return Rr[e].transitions}formatNextSteps(e){return Rr[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}`}})}},zs=new Ua});var us,Wa,gt,Ps=P(()=>{"use strict";xt();K();Y();us={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Wa=class{static{u(this,"ArchiveStorage")}archive(e,t){let s=z(),n=b();return T.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 T.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?T.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):T.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=T.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=T.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(T.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);T.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return T.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},gt=new Wa});var qa,M,ft=P(()=>{"use strict";xt();Fa();K();Ha();Ps();ls();qa=class extends Ye{static{u(this,"StateStorage")}constructor(){super("state.json",yd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=zs.getCurrentState(e),n=zs.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,l=>({...l,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:l,pauseReason:d,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??z()};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[];gt.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:[],activeTasks:[],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;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],l=[...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:l,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:b()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=b(),c=this.createTaskHistoryEntry(i,a,s),l=this.getTaskHistoryFromState(n),d=[c,...l].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let l=[...c.activeTasks||[]];return l[i]=a,{...c,activeTasks:l,lastUpdated:b()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated: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=gd.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:
525
536
  ${h.join(`
526
- `)}`)}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:S(),output:n,summary:o};let d=u.filter(h=>h.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:S()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:S()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:S(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),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:S(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),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:S()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:S()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},O=new xa});import td from"node:fs/promises";import sd from"node:path";async function Ra(r,e,t,s){let[n,o,i,a]=await Promise.all([Fh(r,e,s),Uh(r),Hh(r),Wh(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,Nh).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 Fh(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,Aa*2);for(let a of o){if(s.length>=Aa)break;try{let c=sd.join(e,a.path),u=await td.readFile(c,"utf-8");u.length>yo*3?s.push({path:a.path,content:`${u.slice(0,yo)}
527
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,yo),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>=Aa)break;if(!s.some(c=>c.path===a))try{let c=sd.join(e,a),u=await td.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,yo),reason:"entry point"})}catch{}}return s}async function Uh(r){try{let e=await qe.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 Hh(r){try{return(await O.getTaskHistory(r)).slice(0,Lh).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Wh(r){try{let e=Lt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var yo,Aa,Nh,Lh,nd=v(()=>{"use strict";ga();yn();fr();ft();es();yo=3e3,Aa=15,Nh=15,Lh=10;l(Ra,"buildAnalysisPayload");l(Fh,"selectCodeSamples");l(Uh,"getExistingPatterns");l(Hh,"getTaskHistory");l(Wh,"getPreviousAnalysisSummary")});var wo=v(()=>{"use strict"});import os from"chalk";function rd(r){return Math.ceil(r.length/4)}function od(r){let e=r.split(`
537
+ `)}`)}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 l=[...i.currentTask.subtasks];l[a]={...c,status:"completed",completedAt:b(),output:n,summary:o};let d=l.filter(h=>h.status==="completed").length,p=l.length,m=Math.round(d/p*100),g=a+1;return g<l.length&&(l[g]={...l[g],status:"in_progress",startedAt:b()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:l,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?l[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 l=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(l/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:l,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 l=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(l/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:l,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,l=>({...l,currentTask:{...l.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}},M=new qa});import Sd from"node:fs/promises";import bd from"node:path";async function Ba(r,e,t,s){let[n,o,i,a]=await Promise.all([sy(r,e,s),ny(r),ry(r),oy(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,ey).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 sy(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=ud(r,n,Ga*2);for(let a of o){if(s.length>=Ga)break;try{let c=bd.join(e,a.path),l=await Sd.readFile(c,"utf-8");l.length>Io*3?s.push({path:a.path,content:`${l.slice(0,Io)}
538
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${l.length} chars)`}):s.push({path:a.path,content:l.slice(0,Io),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>=Ga)break;if(!s.some(c=>c.path===a))try{let c=bd.join(e,a),l=await Sd.readFile(c,"utf-8");s.push({path:a,content:l.slice(0,Io),reason:"entry point"})}catch{}}return s}async function ny(r){try{let e=await Qe.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 ry(r){try{return(await M.getTaskHistory(r)).slice(0,ty).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function oy(r){try{let e=Wt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return q.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Io,Ga,ey,ty,Td=P(()=>{"use strict";ja();Cn();xn();ft();is();Io=800,Ga=6,ey=8,ty=5;u(Ba,"buildAnalysisPayload");u(sy,"selectCodeSamples");u(ny,"getExistingPatterns");u(ry,"getTaskHistory");u(oy,"getPreviousAnalysisSummary")});var $o=P(()=>{"use strict"});import ds from"chalk";function vd(r){return Math.ceil(r.length/4)}function Ed(r){let e=r.split(`
528
539
  `),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+=`
529
- ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Da(r){return r.includes("<!-- prjct:preserve")}function id(r,e){let t=od(r),s=od(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:rd(r),tokensAfter:rd(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)Da(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
530
- `).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Da(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
540
+ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Va(r){return r.includes("<!-- prjct:preserve")}function Pd(r,e){let t=Ed(r),s=Ed(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:vd(r),tokensAfter:vd(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)Va(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
541
+ `).length});for(let a of s){let c=a.name.toLowerCase(),l=o.get(c);l?l.content.trim()!==a.content.trim()&&(Va(l.content)||(n.modified.push({name:a.name,type:"modified",before:l.content,after:a.content,lineCount:a.content.split(`
531
542
  `).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
532
- `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Da(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
533
- `).length}),n.hasChanges=!0)}return n}function ad(r,e={}){let{colorize:t=!0}=e,s=[],n=t?os.green:p=>p,o=t?os.red:p=>p,i=t?os.yellow:p=>p,a=t?os.dim:p=>p,c=t?os.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
534
- `);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let p of r.added)s.push(n(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of r.preserved)s.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
535
- `)}function cd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?os.green:c=>c,o=t?os.red:c=>c,i=t?os.cyan:c=>c,a=t?os.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
536
- `))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(`
537
- `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
543
+ `).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Va(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
544
+ `).length}),n.hasChanges=!0)}return n}function Cd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?ds.green:m=>m,o=t?ds.red:m=>m,i=t?ds.yellow:m=>m,a=t?ds.dim:m=>m,c=t?ds.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
545
+ `);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 l=[];r.added.length>0&&l.push(n(`+${r.added.length} added`)),r.modified.length>0&&l.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&l.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${l.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(`
546
+ `)}function xd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?ds.green:c=>c,o=t?ds.red:c=>c,i=t?ds.cyan:c=>c,a=t?ds.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let l of c.after.split(`
547
+ `))s.push(n(`+ ${l}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let l of c.before.split(`
548
+ `).slice(0,5))s.push(o(`- ${l}`));c.before.split(`
538
549
  `).length>5&&s.push(a(` ... ${c.before.split(`
539
- `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
540
- `).slice(0,5))s.push(n(`+ ${u}`));c.after.split(`
550
+ `).length-5} more lines`))}if(c.after){for(let l of c.after.split(`
551
+ `).slice(0,5))s.push(n(`+ ${l}`));c.after.split(`
541
552
  `).length>5&&s.push(a(` ... ${c.after.split(`
542
- `).length-5} more lines`))}s.push("")}for(let c of r.removed){if(s.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
543
- `).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
553
+ `).length-5} more lines`))}s.push("")}for(let c of r.removed){if(s.push(i(`@@ -${c.name} @@`)),c.before){for(let l of c.before.split(`
554
+ `).slice(0,5))s.push(o(`- ${l}`));c.before.split(`
544
555
  `).length>5&&s.push(a(` ... ${c.before.split(`
545
556
  `).length-5} more lines`))}s.push("")}return s.join(`
546
- `)}var ld=v(()=>{"use strict";wo();l(rd,"estimateTokens");l(od,"parseMarkdownSections");l(Da,"isPreservedSection");l(id,"generateSyncDiff");l(ad,"formatDiffPreview");l(cd,"formatFullDiff")});var ud,dd,Ia,md,pd=v(()=>{"use strict";ar();te();Rs();q();ud=50,dd=200,Ia=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 gs(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=S();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=S();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>ud&&(n.current.commands=n.current.commands.slice(-ud)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=S();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>dd&&(n.current.files=n.current.files.slice(-dd)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:ct(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:ct(u),commandCount:s.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},md=new Ia});var Vh,ja,ko,$a=v(()=>{"use strict";te();U();Le();pd();Vh={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ja=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Vh,...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 _("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([_(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),_(`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(`
547
- `).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(`
548
- `)}async getSessionInfo(e){return md.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
557
+ `)}var Rd=P(()=>{"use strict";$o();u(vd,"estimateTokens");u(Ed,"parseMarkdownSections");u(Va,"isPreservedSection");u(Pd,"generateSyncDiff");u(Cd,"formatDiffPreview");u(xd,"formatFullDiff")});var Ad,jd,Ja,Dd,Id=P(()=>{"use strict";Sr();Y();Us();K();Ad=50,jd=200,Ja=class{static{u(this,"SessionTracker")}async read(e){try{return T.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){T.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return bs(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>Ad&&(n.current.commands=n.current.commands.slice(-Ad)),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>jd&&(n.current.files=n.current.files.slice(-jd)),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,l=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:ut(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:ut(l),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}},Dd=new Ja});var ay,za,_o,Ka=P(()=>{"use strict";Y();W();We();Id();ay={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},za=class{static{u(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ay,...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=T.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(`
558
+ `).filter(Boolean):[],n){let c=new Date(n),l=new Date;t.daysSinceSync=Math.floor((l.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(l=>c.endsWith(l)||c.includes(l))),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(`
559
+ `)}async getSessionInfo(e){return Dd.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
549
560
  `);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(`
550
- `)}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}},ko=l((r,e)=>new ja(r,e),"createStalenessChecker")});import gd from"node:fs/promises";import kn from"node:path";function Bh(r){let e=[],t,s=new RegExp(zl.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function Jh(r,e,t){let s;if(r.startsWith("@/"))s=kn.join(t,"src",r.slice(2));else{let n=kn.dirname(kn.join(t,e));s=kn.resolve(n,r)}for(let n of ql){let o=s+n;try{if((await gd.stat(o)).isFile())return kn.relative(t,o)}catch{}}return null}async function qh(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async i=>{try{let a=await gd.readFile(kn.join(r,i),"utf-8"),c=Bh(a),u=[];for(let d of c){let m=await Jh(d,i,r);m&&m!==i&&u.push(m)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function zh(r,e){$.setDoc(r,fd,e)}function So(r){return $.getDoc(r,fd)}async function hd(r,e){let t=await qh(r);return zh(e,t),t}var fd,Ma=v(()=>{"use strict";Ni();te();B();l(Bh,"extractImportSources");l(Jh,"resolveImport");l(qh,"buildGraph");fd="import-graph";l(zh,"saveGraph");l(So,"loadGraph");l(hd,"indexImports")});function yd(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=So(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 wd(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 kd=v(()=>{"use strict";Ma();l(yd,"propagateChanges");l(wd,"affectedDomains")});import Sd from"node:fs/promises";import Kh from"node:path";function Xh(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 Yh(r){let e=await an(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await cn(e,100,async n=>{try{let o=Kh.join(r,n),[i,a]=await Promise.all([Sd.readFile(o,"utf-8"),Sd.stat(o)]);return{path:n,hash:Xh(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function Qh(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 _a(r,e){let t=$.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)})(),$.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Zh(r){let e=new Map;try{let t=$.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 Oa(r,e){let[t,s]=await Promise.all([Yh(r),Promise.resolve(Zh(e))]);return{diff:Qh(t,s),currentHashes:t}}function bd(r){return $.hasDoc(r,"file-hashes-meta")}var Td=v(()=>{"use strict";te();B();l(Xh,"hashContent");l(Yh,"computeHashes");l(Qh,"diffHashes");l(_a,"saveHashes");l(Zh,"loadHashes");l(Oa,"detectChanges");l(bd,"hasHashRegistry")});async function ty(r,e=100){try{let{stdout:t}=await _(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
551
- `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&sy(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function sy(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 ny(r,e=100){let t=await ty(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=ry(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<2||m<2)continue;let p=d+m-a,g=p>0?a/p:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function ry(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function oy(r,e){$.setDoc(r,Pd,e)}function Cd(r){return $.getDoc(r,Pd)}async function xd(r,e,t=100){let s=await ny(r,t);return oy(e,s),s}var Pd,Ad=v(()=>{"use strict";gr();te();Le();l(ty,"parseGitLog");l(sy,"isSourceFile");l(ny,"buildMatrix");l(ry,"pairKey");Pd="cochange-index";l(oy,"saveMatrix");l(Cd,"loadMatrix");l(xd,"indexCoChanges")});import jd from"node:fs/promises";import Rd from"node:os";import Na from"node:path";function ay(){let r=gt("mcp-config.json");if(!r)return{mcpServers:{context7:La}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:La}}}}function $d(){return ay().mcpServers?.context7||La}function Dd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Na.join(Rd.tmpdir(),"prjct-context7-test","mcp.json"):Na.join(Rd.homedir(),".claude","mcp.json")}async function Id(r){try{let e=await jd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e))return{};throw e}}async function cy(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=$d(),e=[...r.args||[],"--help"];await As(r.command||"npx",e,{timeout:15e3})}var La,Sn,Fa,ly,is,yr=v(()=>{"use strict";Os();ar();U();Le();B();La={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Sn=null;l(ay,"parseTemplateConfig");l($d,"getContext7Config");l(Dd,"getConfigPath");l(Id,"readConfig");l(cy,"runSmokeCheck");Fa=class{static{l(this,"Context7Service")}async install(){let e=Dd(),t=Na.dirname(e);await jd.mkdir(t,{recursive:!0});let s=await Id(e),n=s.mcpServers||{};return n.context7=$d(),s.mcpServers=n,await le(e,s),Sn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Sn&&Date.now()-Sn.at<3e5)return Sn.status;let e=Dd(),n=((await Id(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 cy();let o={installed:!0,verified:!0,configPath:e};return Sn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return Sn={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}},ly=new Fa,is=ly});var bo,Ua=v(()=>{"use strict";bo={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 Ha(r,e){return{...bo[r],...e}}function wr(r,e,t){return{message:r,hint:e,...t}}var To=v(()=>{"use strict";Ua();Ua();l(Ha,"getError");l(wr,"createError")});import{execFileSync as Md,execSync as uy}from"node:child_process";var vo,Wa,Eo,_d,Od=v(()=>{"use strict";Rs();To();vo={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"}},Wa=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=vo[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=vo[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=vo[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
552
- `);throw new Eo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
553
- ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(vo),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=uy(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:wr(`${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:wr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Md(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Md(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:wr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?gs(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},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}},_d=new Wa});function bn(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 dy[r]}var re,Ga,Va,Po,dy,Ft,Nd,Fs=v(()=>{"use strict";re={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"],Va=["ship","cleanup","git","migrate"],Po=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],dy={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bn,"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},Nd={HISTORY_MAX:100}});import Ba from"node:fs/promises";import my from"node:os";import Ld from"node:path";var Ja,py,Co,qa=v(()=>{"use strict";U();B();Ja=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=my.homedir(),this.configDir=Ld.join(this.homeDir,".prjct-cli","config"),this.configFile=Ld.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ba.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Ba.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 le(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 le(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Ba.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},py=new Ja,Co=py});var Ka={};Jt(Ka,{installAntigravitySkill:()=>Gd,installCodexSkill:()=>za,needsAntigravityInstallation:()=>wy,run:()=>Wd,verifyCodexPRouterReady:()=>Ao});import{execFileSync as gy}from"node:child_process";import Q from"node:fs/promises";import Us from"node:os";import oe from"node:path";import me from"chalk";async function fy(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_d.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${r.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gy("npm",["install","-g",e],{stdio:"inherit",timeout:bn("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Wd(){let r=await cr(),e=await Ji(),t=ut[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=ut[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await fy(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await xe.detectActiveProvider()){let p=await xe.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await xe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await xe.installDocs(),await Ty(),await is.ensureReady()}}else if(a==="gemini"){await hy()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await yy();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Kr()).installed&&(await Gd()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await Ds()).installed){if(!(await za()).success)throw new Error("Codex skill installation failed");let c=await Ao({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${me.green("\u2713")} Codex skill installed`),console.log(` ${me.green("\u2713")} Codex p. router ready`)}await Co.saveConfig(Ee,await xe.getInstallPath(),e.provider),await by();for(let a of s.providers)vy(a,ut[a.provider]);return s}async function hy(){try{let r=oe.join(Us.homedir(),".gemini","commands"),e=oe.join(r,"p.toml");try{return await Q.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return H.warn(`Gemini router cleanup warning: ${y(r)}`),!1}}async function yy(){try{let r=oe.join(Us.homedir(),".gemini"),e=oe.join(r,"GEMINI.md");await Q.mkdir(r,{recursive:!0});let t=gt("global/GEMINI.md");if(!t){let c=oe.join(lt,"templates","global","GEMINI.md");t=await Q.readFile(c,"utf-8")}let s="",n=!1;try{s=await Q.readFile(e,"utf-8"),n=!0}catch(c){if(D(c))n=!1;else throw c}let a=uo(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Q.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return H.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function Gd(){try{let r=oe.join(Us.homedir(),".gemini","antigravity","skills"),e=oe.join(r,"prjct"),t=oe.join(e,"SKILL.md");await Q.mkdir(e,{recursive:!0});let s=await C(t),n=gt("antigravity/SKILL.md");if(!n){let o=oe.join(lt,"templates","antigravity","SKILL.md");if(!await C(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await Q.readFile(o,"utf-8")}return await Q.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function wy(){let r=await Kr();return r.installed&&!r.skillInstalled}function Bd(){return oe.join(Us.homedir(),".codex","skills","prjct","SKILL.md")}function ky(r){return`<!-- ${Vd}: ${JSON.stringify({version:Ee,templateHash:r})} -->`}function Fd(r){let e=r.match(new RegExp(`<!--\\s*${Vd}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Sy(r){return mr(r)}async function Jd(){let r=gt("codex/SKILL.md");if(r)return r;let e=oe.join(lt,"templates","codex","SKILL.md");return await C(e)?Q.readFile(e,"utf-8"):null}function qd(r){let e=r.trimEnd(),t=Sy(e),s=ky(t);return{content:`${e}
561
+ `)}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}},_o=u((r,e)=>new za(r,e),"createStalenessChecker")});import $d from"node:fs/promises";import An from"node:path";function cy(r){let e=[],t,s=new RegExp(mu.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function ly(r,e,t){let s;if(r.startsWith("@/"))s=An.join(t,"src",r.slice(2));else{let n=An.dirname(An.join(t,e));s=An.resolve(n,r)}for(let n of pu){let o=s+n;try{if((await $d.stat(o)).isFile())return An.relative(t,o)}catch{}}return null}async function uy(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async i=>{try{let a=await $d.readFile(An.join(r,i),"utf-8"),c=cy(a),l=[];for(let d of c){let p=await ly(d,i,r);p&&p!==i&&l.push(p)}return l.length>0?{filePath:i,imports:l}: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 dy(r,e){_.setDoc(r,_d,e)}function Mo(r){return _.getDoc(r,_d)}async function Md(r,e){let t=await uy(r);return dy(e,t),t}var _d,Xa=P(()=>{"use strict";Zi();Y();B();u(cy,"extractImportSources");u(ly,"resolveImport");u(uy,"buildGraph");_d="import-graph";u(dy,"saveGraph");u(Mo,"loadGraph");u(Md,"indexImports")});function Od(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Mo(e);if(o)for(let c of t){let l=o.reverse[c];if(l)for(let d of l)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 Nd(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 Ld=P(()=>{"use strict";Xa();u(Od,"propagateChanges");u(Nd,"affectedDomains")});import Fd from"node:fs/promises";import py from"node:path";function my(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 gy(r){let e=await hn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await yn(e,100,async n=>{try{let o=py.join(r,n),[i,a]=await Promise.all([Fd.readFile(o,"utf-8"),Fd.stat(o)]);return{path:n,hash:my(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function fy(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 Ya(r,e){let t=_.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)})(),_.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function hy(r){let e=new Map;try{let t=_.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 Qa(r,e){let[t,s]=await Promise.all([gy(r),Promise.resolve(hy(e))]);return{diff:fy(t,s),currentHashes:t}}function Ud(r){return _.hasDoc(r,"file-hashes-meta")}var Hd=P(()=>{"use strict";Y();B();u(my,"hashContent");u(gy,"computeHashes");u(fy,"diffHashes");u(Ya,"saveHashes");u(hy,"loadHashes");u(Qa,"detectChanges");u(Ud,"hasHashRegistry")});async function wy(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(`
562
+ `)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&ky(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function ky(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 Sy(r,e=100){let t=await wy(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 l=c+1;l<a.length;l++){let d=by(a[c],a[l]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,l]=i.split("\0"),d=s.get(c)||0,p=s.get(l)||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[l]||(o[l]={}),o[c][l]=g,o[l][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function by(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Ty(r,e){_.setDoc(r,Gd,e)}function Bd(r){return _.getDoc(r,Gd)}async function Vd(r,e,t=100){let s=await Sy(r,t);return Ty(e,s),s}var Gd,Jd=P(()=>{"use strict";xr();Y();We();u(wy,"parseGitLog");u(ky,"isSourceFile");u(Sy,"buildMatrix");u(by,"pairKey");Gd="cochange-index";u(Ty,"saveMatrix");u(Bd,"loadMatrix");u(Vd,"indexCoChanges")});import Yd from"node:fs/promises";import zd from"node:os";import Za from"node:path";function Ey(){let r=kt("mcp-config.json");if(!r)return{mcpServers:{context7:ec}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:ec}}}}function Qd(){return Ey().mcpServers?.context7||ec}function Kd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Za.join(zd.tmpdir(),"prjct-context7-test","mcp.json"):Za.join(zd.homedir(),".claude","mcp.json")}async function Xd(r){try{let e=await Yd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(j(e))return{};throw e}}async function Py(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Qd(),e=[...r.args||[],"--help"];await Fs(r.command||"npx",e,{timeout:15e3})}var ec,jn,tc,Cy,ps,Ar=P(()=>{"use strict";Js();Sr();W();We();B();ec={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},jn=null;u(Ey,"parseTemplateConfig");u(Qd,"getContext7Config");u(Kd,"getConfigPath");u(Xd,"readConfig");u(Py,"runSmokeCheck");tc=class{static{u(this,"Context7Service")}async install(){let e=Kd(),t=Za.dirname(e);await Yd.mkdir(t,{recursive:!0});let s=await Xd(e),n=s.mcpServers||{};return n.context7=Qd(),s.mcpServers=n,await le(e,s),jn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(jn&&Date.now()-jn.at<3e5)return jn.status;let e=Kd(),n=((await Xd(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 Py();let o={installed:!0,verified:!0,configPath:e};return jn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${w(o)}`};return jn={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}},Cy=new tc,ps=Cy});var Oo,sc=P(()=>{"use strict";Oo={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 nc(r,e){return{...Oo[r],...e}}function jr(r,e,t){return{message:r,hint:e,...t}}var No=P(()=>{"use strict";sc();sc();u(nc,"getError");u(jr,"createError")});import{execFileSync as Zd,execSync as xy}from"node:child_process";var Lo,rc,Fo,ep,tp=P(()=>{"use strict";Us();No();Lo={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"}},rc=class{static{u(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=Lo[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=Lo[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Fo(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=Lo[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
563
+ `);throw new Fo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
564
+ ${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Lo),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=xy(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:jr(`${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:jr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Zd(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Zd(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:jr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?bs(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())}},Fo=class extends Error{static{u(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},ep=new rc});function Dn(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 Ry[r]}var ae,oc,ic,Uo,Ry,qt,sp,Ks=P(()=>{"use strict";ae={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},oc=["feature","spec","design","refactor","migrate"],ic=["ship","cleanup","git","migrate"],Uo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ry={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};u(Dn,"getTimeout");qt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},sp={HISTORY_MAX:100}});import ac from"node:fs/promises";import Ay from"node:os";import np from"node:path";var cc,jy,Ho,lc=P(()=>{"use strict";W();B();cc=class{static{u(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Ay.homedir(),this.configDir=np.join(this.homeDir,".prjct-cli","config"),this.configFile=np.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await ac.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await ac.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 C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await ac.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},jy=new cc,Ho=jy});var dc={};Lt(dc,{installAntigravitySkill:()=>cp,installCodexSkill:()=>uc,needsAntigravityInstallation:()=>My,run:()=>ap,verifyCodexPRouterReady:()=>qo});import{execFileSync as Dy}from"node:child_process";import ee from"node:fs/promises";import Xs from"node:os";import ce from"node:path";import fe from"chalk";async function Iy(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!ep.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(""),Dy("npm",["install","-g",e],{stdio:"inherit",timeout:Dn("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 ap(){let r=await br(),e=await ca(),t=pt[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=pt[a],l=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!l.installed)if(a===e.provider)if(await Iy(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await je.detectActiveProvider()){let m=await je.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await je.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await je.installDocs(),await Fy(),await ps.ensureReady()}}else if(a==="gemini"){await $y()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await _y();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await lo()).installed&&(await cp()).success&&console.log(` ${fe.green("\u2713")} Antigravity skill installed`),(await Hs()).installed){if(!(await uc()).success)throw new Error("Codex skill installation failed");let c=await qo({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 Ho.saveConfig(Re,await je.getInstallPath(),e.provider),await Ly();for(let a of s.providers)Uy(a,pt[a.provider]);return s}async function $y(){try{let r=ce.join(Xs.homedir(),".gemini","commands"),e=ce.join(r,"p.toml");try{return await ee.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return q.warn(`Gemini router cleanup warning: ${w(r)}`),!1}}async function _y(){try{let r=ce.join(Xs.homedir(),".gemini"),e=ce.join(r,"GEMINI.md");await ee.mkdir(r,{recursive:!0});let t=kt("global/GEMINI.md");if(!t){let c=ce.join(dt,"templates","global","GEMINI.md");t=await ee.readFile(c,"utf-8")}let s="",n=!1;try{s=await ee.readFile(e,"utf-8"),n=!0}catch(c){if(j(c))n=!1;else throw c}let a=Po(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await ee.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return q.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function cp(){try{let r=ce.join(Xs.homedir(),".gemini","antigravity","skills"),e=ce.join(r,"prjct"),t=ce.join(e,"SKILL.md");await ee.mkdir(e,{recursive:!0});let s=await C(t),n=kt("antigravity/SKILL.md");if(!n){let o=ce.join(dt,"templates","antigravity","SKILL.md");if(!await C(o))return q.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await ee.readFile(o,"utf-8")}return await ee.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return q.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function My(){let r=await lo();return r.installed&&!r.skillInstalled}function up(){return ce.join(Xs.homedir(),".codex","skills","prjct","SKILL.md")}function Oy(r){return`<!-- ${lp}: ${JSON.stringify({version:Re,templateHash:r})} -->`}function rp(r){let e=r.match(new RegExp(`<!--\\s*${lp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Ny(r){return Pr(r)}async function dp(){let r=kt("codex/SKILL.md");if(r)return r;let e=ce.join(dt,"templates","codex","SKILL.md");return await C(e)?ee.readFile(e,"utf-8"):null}function pp(r){let e=r.trimEnd(),t=Ny(e),s=Oy(t);return{content:`${e}
554
565
 
555
566
  ${s}
556
- `,templateHash:t}}async function za(){try{let r=Bd(),e=oe.dirname(r);await Q.mkdir(e,{recursive:!0});let t=await C(r),s=await Jd();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=qd(s);return t&&await Q.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await Q.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return H.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ao(r={}){let e=Bd();if(!(await Ds()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Jd();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=qd(s),o=l(async()=>r.autoRepair?(await za()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Q.readFile(e,"utf-8").catch(()=>"");let a=Fd(i);if(!(a?.version===Ee&&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 Q.readFile(e,"utf-8").catch(()=>""),a=Fd(i),!(a?.version===Ee&&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 by(){try{let r=oe.join(Us.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await Q.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!==Ee&&(n.cliVersion=Ee,P.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${Ee}`)}catch(r){D(r)||H.warn(`Migration warning: ${y(r)}`)}}async function Ud(r,e){let t={};if(await C(r))try{t=await Pe(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function Ty(){try{let r=oe.join(Us.homedir(),".claude"),e=oe.join(r,"settings.json"),t=oe.join(r,"prjct-statusline.sh"),s=oe.join(Us.homedir(),".prjct-cli","statusline"),n=oe.join(s,"statusline.sh"),o=oe.join(s,"themes"),i=oe.join(s,"lib"),a=oe.join(s,"components"),c=oe.join(s,"config.json"),u=oe.join(lt,"assets","statusline"),d=oe.join(u,"statusline.sh"),m=oe.join(u,"themes"),p=oe.join(u,"lib"),g=oe.join(u,"components"),h=oe.join(u,"default-config.json");if(await C(r)||await Q.mkdir(r,{recursive:!0}),await C(s)||await Q.mkdir(s,{recursive:!0}),await C(o)||await Q.mkdir(o,{recursive:!0}),await C(i)||await Q.mkdir(i,{recursive:!0}),await C(a)||await Q.mkdir(a,{recursive:!0}),await C(n)){let b=await Q.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let k=b.match(/CLI_VERSION="([^"]*)"/);if(k&&k[1]!==Ee){let E=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ee}"`);await Q.writeFile(n,E,{mode:493})}await xo(p,i),await xo(g,a),await Hd(t,n),await Ud(e,t);return}}if(await C(d)){let b=await Q.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ee}"`),await Q.writeFile(n,b,{mode:493}),await xo(p,i),await xo(g,a),await C(m)){let k=await Q.readdir(m);for(let E of k){let R=oe.join(m,E),W=oe.join(o,E);await Q.copyFile(R,W)}}!await C(c)&&await C(h)&&await Q.copyFile(h,c)}else{let b=`#!/bin/bash
567
+ `,templateHash:t}}async function uc(){try{let r=up(),e=ce.dirname(r);await ee.mkdir(e,{recursive:!0});let t=await C(r),s=await dp();if(!s)return q.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=pp(s);return t&&await ee.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await ee.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return q.warn(`Codex skill warning: ${w(r)}`),{success:!1,action:null}}}async function qo(r={}){let e=up();if(!(await Hs()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await dp();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=pp(s),o=u(async()=>r.autoRepair?(await uc()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await ee.readFile(e,"utf-8").catch(()=>"");let a=rp(i);if(!(a?.version===Re&&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 ee.readFile(e,"utf-8").catch(()=>""),a=rp(i),!(a?.version===Re&&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 Ly(){try{let r=ce.join(Xs.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await ee.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=T.getDoc(s,"project");if(!n)continue;n.cliVersion!==Re&&(n.cliVersion=Re,T.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${fe.green("\u2713")} Updated ${t} project(s) to v${Re}`)}catch(r){j(r)||q.warn(`Migration warning: ${w(r)}`)}}async function op(r,e){let t={};if(await C(r))try{t=await Te(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function Fy(){try{let r=ce.join(Xs.homedir(),".claude"),e=ce.join(r,"settings.json"),t=ce.join(r,"prjct-statusline.sh"),s=ce.join(Xs.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"),l=ce.join(dt,"assets","statusline"),d=ce.join(l,"statusline.sh"),p=ce.join(l,"themes"),m=ce.join(l,"lib"),g=ce.join(l,"components"),h=ce.join(l,"default-config.json");if(await C(r)||await ee.mkdir(r,{recursive:!0}),await C(s)||await ee.mkdir(s,{recursive:!0}),await C(o)||await ee.mkdir(o,{recursive:!0}),await C(i)||await ee.mkdir(i,{recursive:!0}),await C(a)||await ee.mkdir(a,{recursive:!0}),await C(n)){let S=await ee.readFile(n,"utf8");if(S.includes("CLI_VERSION=")){let y=S.match(/CLI_VERSION="([^"]*)"/);if(y&&y[1]!==Re){let E=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Re}"`);await ee.writeFile(n,E,{mode:493})}await Wo(m,i),await Wo(g,a),await ip(t,n),await op(e,t);return}}if(await C(d)){let S=await ee.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Re}"`),await ee.writeFile(n,S,{mode:493}),await Wo(m,i),await Wo(g,a),await C(p)){let y=await ee.readdir(p);for(let E of y){let A=ce.join(p,E),F=ce.join(o,E);await ee.copyFile(A,F)}}!await C(c)&&await C(h)&&await ee.copyFile(h,c)}else{let S=`#!/bin/bash
557
568
  # prjct Status Line for Claude Code
558
- CLI_VERSION="${Ee}"
569
+ CLI_VERSION="${Re}"
559
570
  input=$(cat)
560
571
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
561
572
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -584,7 +595,7 @@ if [ -f "$CONFIG" ]; then
584
595
  fi
585
596
  fi
586
597
  echo "prjct"
587
- `;await Q.writeFile(n,b,{mode:493})}await Hd(t,n),await Ud(e,t)}catch(r){D(r)||H.warn(`Status line warning: ${y(r)}`)}}async function xo(r,e){if(!await C(r))return;let t=await Q.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=oe.join(r,s),o=oe.join(e,s);await Q.copyFile(n,o),await Q.chmod(o,493)}}async function Hd(r,e){try{if(await C(r)){if((await Q.lstat(r)).isSymbolicLink()&&await Q.readlink(r)===e)return;await Q.unlink(r)}await Q.symlink(e,r)}catch{try{await C(e)&&(await Q.copyFile(e,r),await Q.chmod(r,493))}catch(s){D(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function vy(r,e){if(console.log(""),r.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.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(` ${me.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Vd,Ey,Ro=v(()=>{"use strict";Os();yr();Od();te();U();Fs();B();Ms();es();It();dt();ss();qa();la();l(fy,"installAICLI");l(Wd,"run");l(hy,"installGeminiRouter");l(yy,"installGeminiGlobalConfig");l(Gd,"installAntigravitySkill");l(wy,"needsAntigravityInstallation");Vd="prjct-codex-router";l(Bd,"getCodexSkillPath");l(ky,"getCodexSkillMetadata");l(Fd,"parseCodexSkillMetadata");l(Sy,"hashContent");l(Jd,"loadCodexSkillTemplate");l(qd,"buildCodexSkillContent");l(za,"installCodexSkill");l(Ao,"verifyCodexPRouterReady");l(by,"migrateProjectsCliVersion");l(Ud,"ensureStatusLineSettings");l(Ty,"installStatusLine");l(xo,"installStatusLineModules");l(Hd,"ensureStatusLineSymlink");l(vy,"showResults");Ey=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Ey&&Wd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as G}from"zod";var Py,Cy,zd,xy,Ay,Ry,Dy,Iy,Kd,oA,Xd=v(()=>{"use strict";Py=G.enum(["low","medium","high"]),Cy=G.enum(["pending","converted","completed","archived","dormant"]),zd=G.enum(["high","medium","low"]),xy=G.object({impact:zd,effort:zd}),Ay=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),Ry=G.object({name:G.string(),description:G.string()}),Dy=G.object({name:G.string(),description:G.string().optional()}),Iy=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:Py,status:Cy,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:xy.optional(),implementationNotes:G.string().optional(),stack:Ay.optional(),modules:G.array(Ry).optional(),roles:G.array(Dy).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),Kd=G.object({ideas:G.array(Iy),lastUpdated:G.string()}),oA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Xa,Ue,ws=v(()=>{"use strict";Xd();vt();q();Ls();ns();Xa=class extends Je{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:J(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:S()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:S()})),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:S()})),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:S()})),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:S()}))}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:S()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:S()}))}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:S()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=ds(rs.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:S()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Ue=new Xa});var Ya,Tn,Qa=v(()=>{"use strict";go();q();ns();Ya=class extends Je{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,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],p=m.findIndex(E=>E.date===o);if(p>=0){let E=m[p];m[p]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+n)/(E.syncs+1),totalDuration:E.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],b=m.filter(E=>E.date>=h),k=[...i.agentUsage];if(t.agents)for(let E of t.agents){let R=k.findIndex(W=>W.agentName===E);R>=0?k[R]={...k[R],usageCount:k[R].usageCount+1,tokensSaved:k[R].tokensSaved+Math.floor(s/t.agents.length)}:k.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:k,dailyStats:b,firstSync:i.firstSync||S(),lastUpdated:S()}})}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)}},Tn=new Ya});import Z from"node:fs/promises";import X from"node:path";async function Do(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=A.getGlobalProjectPath(r),n=X.join(s,"storage"),o=X.join(s,"index"),i=X.join(s,"memory");t.backupDir=await jy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of tc){let d=X.join(n,c),m=await Ut(d);if(m===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,m),Yd(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of ec){let d=X.join(o,c),m=await Ut(d);if(m===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(m),new Date().toISOString()),Qd(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Uy(r,o,t),await Hy(r,o,t),await Wy(r,i,t),await Gy(r,i,t);let a=X.join(s,"sessions");return await Vy(r,a,t),t.errors.length===0&&await By(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 jy(r,e,t){let s=X.join(r,"backup");return await Z.mkdir(s,{recursive:!0}),await Z.mkdir(X.join(s,"index"),{recursive:!0}),await Z.mkdir(X.join(s,"memory"),{recursive:!0}),await Za(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Za(e,X.join(s,"index")),await Za(t,X.join(s,"memory")),s}async function Za(r,e,t){try{let s=await Z.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=X.join(r,n.name),i=X.join(e,n.name);await Z.copyFile(o,i)}}catch(s){if(!D(s))throw s}}function Yd(r,e,t){switch(e){case"state":$y(r,t);break;case"queue":My(r,t);break;case"ideas":_y(r,t);break;case"shipped":Oy(r,t);break;case"metrics":Ny(r,t);break;case"analysis":Ly(r,t);break}}function $y(r,e){let t=P.getDb(r),s=t.prepare(`
598
+ `;await ee.writeFile(n,S,{mode:493})}await ip(t,n),await op(e,t)}catch(r){j(r)||q.warn(`Status line warning: ${w(r)}`)}}async function Wo(r,e){if(!await C(r))return;let t=await ee.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ce.join(r,s),o=ce.join(e,s);await ee.copyFile(n,o),await ee.chmod(o,493)}}async function ip(r,e){try{if(await C(r)){if((await ee.lstat(r)).isSymbolicLink()&&await ee.readlink(r)===e)return;await ee.unlink(r)}await ee.symlink(e,r)}catch{try{await C(e)&&(await ee.copyFile(e,r),await ee.chmod(r,493))}catch(s){j(s)||q.warn(`Symlink fallback warning: ${s.message}`)}}}function Uy(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 lp,Hy,Go=P(()=>{"use strict";Js();Ar();tp();Y();W();Ks();B();Bs();is();_t();mt();cs();lc();Pa();u(Iy,"installAICLI");u(ap,"run");u($y,"installGeminiRouter");u(_y,"installGeminiGlobalConfig");u(cp,"installAntigravitySkill");u(My,"needsAntigravityInstallation");lp="prjct-codex-router";u(up,"getCodexSkillPath");u(Oy,"getCodexSkillMetadata");u(rp,"parseCodexSkillMetadata");u(Ny,"hashContent");u(dp,"loadCodexSkillTemplate");u(pp,"buildCodexSkillContent");u(uc,"installCodexSkill");u(qo,"verifyCodexPRouterReady");u(Ly,"migrateProjectsCliVersion");u(op,"ensureStatusLineSettings");u(Fy,"installStatusLine");u(Wo,"installStatusLineModules");u(ip,"ensureStatusLineSymlink");u(Uy,"showResults");Hy=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Hy&&ap().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as G}from"zod";var Wy,qy,mp,Gy,By,Vy,Jy,zy,gp,vR,fp=P(()=>{"use strict";Wy=G.enum(["low","medium","high"]),qy=G.enum(["pending","converted","completed","archived","dormant"]),mp=G.enum(["high","medium","low"]),Gy=G.object({impact:mp,effort:mp}),By=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),Vy=G.object({name:G.string(),description:G.string()}),Jy=G.object({name:G.string(),description:G.string().optional()}),zy=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:Wy,status:qy,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:Gy.optional(),implementationNotes:G.string().optional(),stack:By.optional(),modules:G.array(Vy).optional(),roles:G.array(Jy).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),gp=G.object({ideas:G.array(zy),lastUpdated:G.string()}),vR={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var pc,Pe,Cs=P(()=>{"use strict";fp();xt();K();Ps();ls();pc=class extends Ye{static{u(this,"IdeasStorage")}constructor(){super("ideas.json",gp)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt: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=ws(us.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;gt.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}},Pe=new pc});var mc,ms,Bo=P(()=>{"use strict";Ro();K();ls();mc=class extends Ye{static{u(this,"MetricsStorage")}constructor(){super("metrics.json",Zu)}getDefault(){return{...ed}}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,l=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),y=[...i.agentUsage];if(t.agents)for(let E of t.agents){let A=y.findIndex(F=>F.agentName===E);A>=0?y[A]={...y[A],usageCount:y[A].usageCount+1,tokensSaved:y[A].tokensSaved+Math.floor(s/t.agents.length)}:y.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:l/a,totalSyncDuration:l,agentUsage:y,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,l)=>c+l.tokensSaved,0),i=n.reduce((c,l)=>c+l.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:td(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,l)=>l.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)}},ms=new mc});import te from"node:fs/promises";import Z from"node:path";async function Vo(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(T.exists(r)&&T.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=R.getGlobalProjectPath(r),n=Z.join(s,"storage"),o=Z.join(s,"index"),i=Z.join(s,"memory");t.backupDir=await Ky(n,o,i),T.getDb(r);for(let{filename:c,key:l}of hc){let d=Z.join(n,c),p=await Gt(d);if(p===null){t.skippedFiles.push(c);continue}try{T.setDoc(r,l,p),hp(r,l,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:l}of fc){let d=Z.join(o,c),p=await Gt(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{T.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",l,JSON.stringify(p),new Date().toISOString()),yp(r,l,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await nw(r,o,t),await rw(r,o,t),await ow(r,i,t),await iw(r,i,t);let a=Z.join(s,"sessions");return await aw(r,a,t),t.errors.length===0&&await cw(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 Ky(r,e,t){let s=Z.join(r,"backup");return await te.mkdir(s,{recursive:!0}),await te.mkdir(Z.join(s,"index"),{recursive:!0}),await te.mkdir(Z.join(s,"memory"),{recursive:!0}),await gc(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await gc(e,Z.join(s,"index")),await gc(t,Z.join(s,"memory")),s}async function gc(r,e,t){try{let s=await te.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Z.join(r,n.name),i=Z.join(e,n.name);await te.copyFile(o,i)}}catch(s){if(!j(s))throw s}}function hp(r,e,t){switch(e){case"state":Xy(r,t);break;case"queue":Yy(r,t);break;case"ideas":Qy(r,t);break;case"shipped":Zy(r,t);break;case"metrics":ew(r,t);break;case"analysis":tw(r,t);break}}function Xy(r,e){let t=T.getDb(r),s=t.prepare(`
588
599
  INSERT OR REPLACE INTO tasks
589
600
  (id, description, type, status, parent_description, branch, linear_id,
590
601
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -595,94 +606,94 @@ echo "prjct"
595
606
  (id, task_id, description, status, domain, agent, sort_order,
596
607
  depends_on, started_at, completed_at, output, summary)
597
608
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
598
- `),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 d=0;d<u.length;d++){let m=u[d];n.run(I(m.id)??`subtask-${d}`,I(a.id),I(m.description)??"",I(m.status)??"pending",I(m.domain),I(m.agent),d,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 My(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
609
+ `),o=u((a,c)=>{if(!a||!a.id)return;s.run($(a.id)??`task-${Date.now()}`,$(a.description??a.parentDescription)??"",$(a.type),$(c??a.status)??"unknown",$(a.parentDescription),$(a.branch),$(a.linearId),$(a.linearUuid),$(a.sessionId),$(a.featureId),$(a.startedAt)??new Date().toISOString(),$(a.completedAt),$(a.shippedAt),$(a.pausedAt),$(a.pauseReason),$(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let l=a.subtasks;if(l&&Array.isArray(l))for(let d=0;d<l.length;d++){let p=l[d];n.run($(p.id)??`subtask-${d}`,$(a.id),$(p.description)??"",$(p.status)??"pending",$(p.domain),$(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,$(p.startedAt),$(p.completedAt),$(p.output),p.summary?JSON.stringify(p.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Yy(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=T.getDb(r).prepare(`
599
610
  INSERT OR REPLACE INTO queue_tasks
600
611
  (id, description, type, priority, section, created_at, completed, completed_at,
601
612
  feature_id, feature_name)
602
613
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
603
- `);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 _y(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
614
+ `);for(let o of t)n.run($(o.id)??`queue-${Date.now()}`,$(o.description)??"",$(o.type),$(o.priority),$(o.section),$(o.createdAt)??new Date().toISOString(),o.completed?1:0,$(o.completedAt),$(o.featureId),$(o.featureName))}function Qy(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=T.getDb(r).prepare(`
604
615
  INSERT OR REPLACE INTO ideas
605
616
  (id, text, status, priority, tags, added_at, converted_to, details, data)
606
617
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
607
- `);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 Oy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
618
+ `);for(let o of t)n.run($(o.id)??`idea-${Date.now()}`,$(o.text)??"",$(o.status)??"pending",$(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,$(o.addedAt)??new Date().toISOString(),$(o.convertedTo),$(o.details),JSON.stringify(o))}function Zy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=T.getDb(r).prepare(`
608
619
  INSERT OR REPLACE INTO shipped_features
609
620
  (id, name, shipped_at, version, description, type, duration, data)
610
621
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
611
- `);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 Ny(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
622
+ `);for(let o of t)n.run($(o.id)??`ship-${Date.now()}`,$(o.name)??"",$(o.shippedAt)??new Date().toISOString(),$(o.version)??"0.0.0",$(o.description),$(o.type),$(o.duration),JSON.stringify(o))}function ew(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=T.getDb(r).prepare(`
612
623
  INSERT OR REPLACE INTO metrics_daily
613
624
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
614
625
  VALUES (?, ?, ?, ?, ?)
615
- `);for(let o of t)n.run(I(o.date)??new Date().toISOString().slice(0,10),ks(o.tokensSaved)??0,ks(o.syncs)??0,ks(o.avgCompressionRate)??0,ks(o.totalDuration)??0)}function Ly(r,e){let s=P.getDb(r).prepare(`
626
+ `);for(let o of t)n.run($(o.date)??new Date().toISOString().slice(0,10),xs(o.tokensSaved)??0,xs(o.syncs)??0,xs(o.avgCompressionRate)??0,xs(o.totalDuration)??0)}function tw(r,e){let s=T.getDb(r).prepare(`
616
627
  INSERT OR REPLACE INTO analysis
617
628
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
618
629
  VALUES (?, ?, ?, ?, ?, ?, ?)
619
- `),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 Qd(r,e,t){e==="categories-cache"&&Fy(r,t)}function Fy(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
630
+ `),n=u((o,i)=>{o&&s.run(i,$(o.status)??"unknown",$(o.commitHash),$(o.signature),$(o.sealedAt),$(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function yp(r,e,t){e==="categories-cache"&&sw(r,t)}function sw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=T.getDb(r).prepare(`
620
631
  INSERT OR REPLACE INTO index_files
621
632
  (path, categories, domain, score, size, mtime, language)
622
633
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
623
- `);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 Uy(r,e,t){let s=X.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=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 Hy(r,e,t){let s=X.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=P.getDb(r),a=i.prepare(`
634
+ `);for(let o of t){let i=$(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,$(o.primaryDomain),i)}}async function nw(r,e,t){let s=Z.join(e,"checksums.json"),n=await Gt(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=T.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,l]of Object.entries(o))a.run(c,l)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function rw(r,e,t){let s=Z.join(e,"file-scores.json"),n=await Gt(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=T.getDb(r),a=i.prepare(`
624
635
  INSERT OR REPLACE INTO index_files
625
636
  (path, score, size, mtime, language, categories, domain)
626
637
  VALUES (?, ?, ?, ?, NULL,
627
638
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
628
639
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
629
- `);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,ks(c.score)??0,ks(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 Wy(r,e,t){let s=X.join(e,"events.jsonl");try{let o=(await Z.readFile(s,"utf-8")).split(`
630
- `).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=I(u.type??u.action)??"unknown",m=I(u.taskId??u.task_id),p=I(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){D(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Gy(r,e,t){let s=X.join(e,"learnings.jsonl");try{let o=(await Z.readFile(s,"utf-8")).split(`
631
- `).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:${I(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?I(m[0]):null;a.run(d,p,c,1,I(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){D(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function Vy(r,e,t){let n=P.getDb(r).prepare(`
640
+ `);i.transaction(()=>{for(let c of o){let l=$(c.path);l&&a.run(l,xs(c.score)??0,xs(c.size),$(c.mtime),l,l)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function ow(r,e,t){let s=Z.join(e,"events.jsonl");try{let o=(await te.readFile(s,"utf-8")).split(`
641
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=T.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let l=JSON.parse(c),d=$(l.type??l.action)??"unknown",p=$(l.taskId??l.task_id),m=$(l.timestamp??l.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){j(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function iw(r,e,t){let s=Z.join(e,"learnings.jsonl");try{let o=(await te.readFile(s,"utf-8")).split(`
642
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=T.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 l=JSON.parse(c),d=`learning:${$(l.taskId??l.timestamp)??Date.now()}`,p=l.tags,m=p&&p.length>0?$(p[0]):null;a.run(d,m,c,1,$(l.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){j(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function aw(r,e,t){let n=T.getDb(r).prepare(`
632
643
  INSERT OR IGNORE INTO sessions
633
644
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
634
645
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
635
- `),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),ks(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=X.join(e,"current.json"),a=await Ut(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Z.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=X.join(e,"archive");try{let u=await Z.readdir(c);for(let m of u){let p=X.join(c,m);try{if(!(await Z.stat(p)).isDirectory())continue;let h=await Z.readdir(p);for(let k of h){if(!k.endsWith(".json"))continue;let E=X.join(p,k),R=await Ut(E);if(R!==null)try{o(R),t.migratedFiles.push(`sessions/archive/${m}/${k}`),await Z.unlink(E).catch(()=>{})}catch(W){t.errors.push({file:`sessions/archive/${m}/${k}`,error:String(W)})}}(await Z.readdir(p)).length===0&&await Z.rmdir(p).catch(()=>{})}catch{}}(await Z.readdir(c).catch(()=>[])).length===0&&await Z.rmdir(c).catch(()=>{})}catch{}try{(await Z.readdir(e)).length===0&&await Z.rmdir(e).catch(()=>{})}catch{}}async function By(r,e,t,s){let n=l(async(i,a)=>{try{await Z.unlink(i)}catch(c){D(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of tc)await n(X.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(X.join(e,i),`cleanup:index/${i}`);await n(X.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(X.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 ks(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 Z.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e)||e instanceof SyntaxError)return null;throw e}}async function Io(r){let e=A.getGlobalProjectPath(r),t=X.join(e,"storage"),s=0;P.getDb(r);for(let{filename:h,key:b}of tc){let k=X.join(t,h),E=await Ut(k);if(E!==null){P.setDoc(r,b,E),Yd(r,b,E);try{await Z.unlink(k)}catch{}s++}}let n=X.join(e,"project.json"),o=await Ut(n);if(o!==null){P.setDoc(r,"project",o);try{await Z.unlink(n)}catch{}s++}let i=X.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let b=X.join(i,h);try{let E=(await Z.readFile(b,"utf-8")).split(`
636
- `).filter(W=>W.trim());if(E.length===0){await Z.unlink(b),s++;continue}let R=P.getDb(r);if(h==="events.jsonl"){let W=R.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");R.transaction(()=>{for(let z of E)try{let w=JSON.parse(z);W.run(I(w.type??w.action)??"unknown",I(w.taskId??w.task_id),z,I(w.timestamp??w.ts)??new Date().toISOString())}catch{}})()}else{let W=R.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");R.transaction(()=>{for(let z of E)try{let w=JSON.parse(z),M=`learning:${I(w.taskId??w.timestamp)??Date.now()}`,N=w.tags;W.run(M,I(N?.[0]),z,1,I(w.timestamp)??new Date().toISOString())}catch{}})()}await Z.unlink(b),s++}catch{}}let a=X.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;P.getDb(r).prepare(`
646
+ `),o=u(l=>{!l||!l.id||n.run($(l.id),$(l.projectId)??r,$(l.task)??"",$(l.status)??"completed",$(l.startedAt)??new Date().toISOString(),$(l.pausedAt),$(l.completedAt),xs(l.duration)??0,l.metrics?JSON.stringify(l.metrics):"{}",l.timeline?JSON.stringify(l.timeline):"[]")},"insertSession"),i=Z.join(e,"current.json"),a=await Gt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await te.unlink(i).catch(()=>{})}catch(l){t.errors.push({file:"sessions/current.json",error:String(l)})}let c=Z.join(e,"archive");try{let l=await te.readdir(c);for(let p of l){let m=Z.join(c,p);try{if(!(await te.stat(m)).isDirectory())continue;let h=await te.readdir(m);for(let y of h){if(!y.endsWith(".json"))continue;let E=Z.join(m,y),A=await Gt(E);if(A!==null)try{o(A),t.migratedFiles.push(`sessions/archive/${p}/${y}`),await te.unlink(E).catch(()=>{})}catch(F){t.errors.push({file:`sessions/archive/${p}/${y}`,error:String(F)})}}(await te.readdir(m)).length===0&&await te.rmdir(m).catch(()=>{})}catch{}}(await te.readdir(c).catch(()=>[])).length===0&&await te.rmdir(c).catch(()=>{})}catch{}try{(await te.readdir(e)).length===0&&await te.rmdir(e).catch(()=>{})}catch{}}async function cw(r,e,t,s){let n=u(async(i,a)=>{try{await te.unlink(i)}catch(c){j(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of hc)await n(Z.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(Z.join(e,i),`cleanup:index/${i}`);await n(Z.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(Z.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function $(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function xs(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 Gt(r){try{let e=await te.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(j(e)||e instanceof SyntaxError)return null;throw e}}async function Jo(r){let e=R.getGlobalProjectPath(r),t=Z.join(e,"storage"),s=0;T.getDb(r);for(let{filename:h,key:S}of hc){let y=Z.join(t,h),E=await Gt(y);if(E!==null){T.setDoc(r,S,E),hp(r,S,E);try{await te.unlink(y)}catch{}s++}}let n=Z.join(e,"project.json"),o=await Gt(n);if(o!==null){T.setDoc(r,"project",o);try{await te.unlink(n)}catch{}s++}let i=Z.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let S=Z.join(i,h);try{let E=(await te.readFile(S,"utf-8")).split(`
647
+ `).filter(F=>F.trim());if(E.length===0){await te.unlink(S),s++;continue}let A=T.getDb(r);if(h==="events.jsonl"){let F=A.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");A.transaction(()=>{for(let J of E)try{let k=JSON.parse(J);F.run($(k.type??k.action)??"unknown",$(k.taskId??k.task_id),J,$(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let F=A.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");A.transaction(()=>{for(let J of E)try{let k=JSON.parse(J),D=`learning:${$(k.taskId??k.timestamp)??Date.now()}`,N=k.tags;F.run(D,$(N?.[0]),J,1,$(k.timestamp)??new Date().toISOString())}catch{}})()}await te.unlink(S),s++}catch{}}let a=Z.join(e,"sessions"),c=u(h=>{if(!h||!h.id)return;T.getDb(r).prepare(`
637
648
  INSERT OR IGNORE INTO sessions
638
649
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
639
650
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
640
- `).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),ks(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=X.join(a,"current.json"),d=await Ut(u);d!==null&&(c(d),await Z.unlink(u).catch(()=>{}),s++);let m=X.join(a,"archive");try{let h=await Z.readdir(m);for(let k of h){let E=X.join(m,k);try{if(!(await Z.stat(E)).isDirectory())continue;let W=await Z.readdir(E);for(let w of W){if(!w.endsWith(".json"))continue;let M=await Ut(X.join(E,w));M!==null&&(c(M),await Z.unlink(X.join(E,w)).catch(()=>{}),s++)}(await Z.readdir(E)).length===0&&await Z.rmdir(E).catch(()=>{})}catch{}}(await Z.readdir(m).catch(()=>[])).length===0&&await Z.rmdir(m).catch(()=>{})}catch{}try{(await Z.readdir(a)).length===0&&await Z.rmdir(a).catch(()=>{})}catch{}let p=X.join(e,"index"),g=[...ec.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let b=X.join(p,h),k=await Ut(b);if(k===null)continue;let E=ec.find(R=>R.filename===h);E&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(k),new Date().toISOString()),Qd(r,E.key,k));try{await Z.unlink(b)}catch{}s++}return s}var tc,ec,sc=v(()=>{"use strict";ye();U();te();tc=[{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"}],ec=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Do,"migrateJsonToSqlite");l(jy,"createBackup");l(Za,"copyFiles");l(Yd,"populateNormalized");l($y,"populateTasksFromState");l(My,"populateQueueTasks");l(_y,"populateIdeas");l(Oy,"populateShippedFeatures");l(Ny,"populateMetricsDaily");l(Ly,"populateAnalysis");l(Qd,"populateIndexTables");l(Fy,"populateCategoriesIndex");l(Uy,"migrateChecksums");l(Hy,"migrateFileScores");l(Wy,"migrateEventsJsonl");l(Gy,"migrateLearningsJsonl");l(Vy,"migrateSessionFiles");l(By,"cleanupJsonFiles");l(I,"toStr");l(ks,"toNum");l(Ut,"readJsonSafe");l(Io,"sweepLegacyJson")});function jo(r){return[...r].sort((e,t)=>{let s=em[e.section]-em[t.section];return s!==0?s:Zd[e.priority]-Zd[t.priority]})}function nc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Zd,em,$o=v(()=>{"use strict";Zd={critical:0,high:1,medium:2,low:3},em={active:0,previously_active:1,backlog:2};l(jo,"sortBySectionAndPriority");l(nc,"uniqueBy")});var rc,pe,Ht=v(()=>{"use strict";vt();va();$o();q();Ls();ns();rc=class extends Je{static{l(this,"QueueStorage")}constructor(){super("queue.json",ed)}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 jo(t)[0]||null}async addTask(e,t){let s={...t,id:J(),createdAt:S(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:S()})),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=S(),n=t.map(o=>({...o,id:J(),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:S()})),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:S()},s):i),lastUpdated:S()})),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:S()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:S()}))}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:S()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=ds(rs.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:S()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},pe=new rc});import{z as ee}from"zod";var Jy,tm,qy,zy,Ky,Xy,Yy,Qy,Zy,sm,nm=v(()=>{"use strict";Jy=ee.enum(["feature","fix","improvement","refactor"]),tm=ee.enum(["pass","warning","fail","skipped"]),qy=ee.enum(["added","changed","fixed","removed"]),zy=ee.object({hours:ee.number(),minutes:ee.number(),totalMinutes:ee.number()}),Ky=ee.object({filesChanged:ee.number().nullable().optional(),linesAdded:ee.number().nullable().optional(),linesRemoved:ee.number().nullable().optional(),commits:ee.number().nullable().optional()}),Xy=ee.object({description:ee.string(),type:qy.optional()}),Yy=ee.object({lintStatus:tm.nullable().optional(),lintDetails:ee.string().optional(),testStatus:tm.nullable().optional(),testDetails:ee.string().optional()}),Qy=ee.object({hash:ee.string().optional(),message:ee.string().optional(),branch:ee.string().optional()}),Zy=ee.object({id:ee.string(),name:ee.string(),version:ee.string().nullable().optional(),type:Jy,agent:ee.string().optional(),description:ee.string().optional(),changes:ee.array(Xy).optional(),codeSnippets:ee.array(ee.string()).optional(),commit:Qy.optional(),codeMetrics:Ky.optional(),qualityMetrics:Yy.optional(),quantitativeImpact:ee.string().optional(),duration:zy.optional(),tasksCompleted:ee.number().nullable().optional(),shippedAt:ee.string(),featureId:ee.string().optional()}),sm=ee.object({shipped:ee.array(Zy),lastUpdated:ee.string()})});var oc,Ye,Hs=v(()=>{"use strict";vt();nm();q();Ls();ns();oc=class extends Je{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",sm)}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:J(),shippedAt:S()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:S()})),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=ds(rs.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:S()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},Ye=new oc});import{z as ue}from"zod";var ew,tw,rm,zA,KA,XA,Ss,om,kr=v(()=>{"use strict";ew=ue.enum(["improving","stable","declining"]),tw=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),rm=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),zA=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),KA=ue.object({sprints:ue.array(tw),averageVelocity:ue.number(),velocityTrend:ew,estimationAccuracy:ue.number(),overEstimated:ue.array(rm),underEstimated:ue.array(rm),lastUpdated:ue.string()}),XA=ue.object({sprintLengthDays:ue.number().min(1).max(90).default(7),startDay:ue.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ue.number().min(1).max(52).default(6),accuracyTolerance:ue.number().min(0).max(100).default(20)}),Ss={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var ic,Mo,ac=v(()=>{"use strict";kr();ns();ic=class extends Je{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:om,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}},Mo=new ic});var Sr,cc,lc,im=v(()=>{"use strict";dr();q();Sr=3,cc=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>=Sr){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}/${Sr} 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>=Sr){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}/${Sr} 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>=Sr&&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:[Fe.FILE_STRUCTURE,Fe.ARCHITECTURE],tech_stack:[Fe.TECH_STACK],architecture:[Fe.ARCHITECTURE,Fe.CODE_STYLE],estimation:[Fe.SHIP_WORKFLOW],workflow:[Fe.SHIP_WORKFLOW,Fe.CODE_STYLE],gotcha:[Fe.TEST_BEHAVIOR,Fe.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: ${S()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
641
- `)}},lc=new cc});import{z as x}from"zod";var am,sw,nw,cm,rw,ow,iw,aw,cw,lw,uw,lm,dw,mw,cR,um,dm,mm,pm,pw,_o,gm=v(()=>{"use strict";am=x.number().min(1).max(5),sw=x.enum(["exceeded","met","partial","failed"]),nw=x.enum(["definitely","probably","maybe","no"]),cm=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),rw=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:cm.optional(),explanation:x.string().optional()})}),ow=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),iw=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),aw=x.object({metrics:x.array(ow),acceptanceCriteria:x.array(iw),overallSuccess:sw,successScore:x.number().min(0).max(100)}),cw=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),lw=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(cw)}),uw=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:nw,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),lm=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:am,blockers:x.array(x.string()),agentUsed:x.string().optional(),skillsUsed:x.array(x.string()).optional(),startedAt:x.string(),completedAt:x.string()}),dw=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:rw,success:aw.optional(),learnings:lw,roi:uw,rating:am,taskOutcomes:x.array(lm).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),mw=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:cm,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),cR=x.object({outcomes:x.array(dw),taskOutcomes:x.array(lm).optional(),aggregates:mw.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),um={outcomes:[],taskOutcomes:[],lastUpdated:""},dm=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"),mm=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),pm=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),pw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),_o=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=>pw(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(s.reduce((d,m)=>d+m,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var uc,fm,hm=v(()=>{"use strict";gm();ns();q();uc=class extends Je{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...um,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:_o([t,...s.outcomes]),lastUpdated:S()})),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:S()}))}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?_o(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:_o(t.outcomes),lastAggregated:S(),lastUpdated:S()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&St(e.duration)||60,s=t/60,n=t/60,o=dm(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=mm(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:pm(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}}},fm=new uc});import dc from"node:fs/promises";import Oo from"node:path";var mc,pc,ym,wm=v(()=>{"use strict";U();B();mc=".prjct/.prjct-state.md",pc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Oo.join(e,mc);await dc.mkdir(Oo.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await dc.writeFile(s,n,"utf-8")}async remove(e){try{await dc.unlink(Oo.join(e,mc))}catch(t){if(!D(t))throw t}}async exists(e){let t=Oo.join(e,mc);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
642
- `)}},ym=new pc});var gc,Et,Ws=v(()=>{"use strict";Ce();Ls();te();gc=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await j.getProjectId(e);if(!o)return;$.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 j.getProjectId(e);return s?$.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 j.getProjectId(e);return 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 j.getProjectId(e);if(!t)return;$.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 $.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=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=rs.MEMORY_MAX_ENTRIES)return 0;let n=s-rs.MEMORY_MAX_ENTRIES,o=$.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&&$.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}}},Et=new gc});import gw from"node:path";function fw(r){return $s(gw.resolve(r))}function br(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function hw(r){return nc(r,e=>`${br(e.name)}::${br(e.source)}`)}function yw(r){return nc(r,e=>`${br(e.issue)}::${br(e.file)}::${br(e.source)}`)}var fc,ww,km,Sm=v(()=>{"use strict";te();$o();Ms();l(fw,"repoHash");l(br,"normalizeKey");l(hw,"dedupePatterns");l(yw,"dedupeAntiPatterns");fc=class{static{l(this,"PatternExtractor")}async extract(e){let t=fw(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=hw([...s,...n]),a=yw([...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}}},ww=new fc,km=ww});import Tr from"node:fs/promises";import kw from"node:os";import vr from"node:path";function Sw(r){return`# ${r.projectName}
643
- ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function bw(r){return r.patterns.length===0?"":`
651
+ `).run($(h.id),$(h.projectId)??r,$(h.task)??"",$(h.status)??"completed",$(h.startedAt)??new Date().toISOString(),$(h.pausedAt),$(h.completedAt),xs(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),l=Z.join(a,"current.json"),d=await Gt(l);d!==null&&(c(d),await te.unlink(l).catch(()=>{}),s++);let p=Z.join(a,"archive");try{let h=await te.readdir(p);for(let y of h){let E=Z.join(p,y);try{if(!(await te.stat(E)).isDirectory())continue;let F=await te.readdir(E);for(let k of F){if(!k.endsWith(".json"))continue;let D=await Gt(Z.join(E,k));D!==null&&(c(D),await te.unlink(Z.join(E,k)).catch(()=>{}),s++)}(await te.readdir(E)).length===0&&await te.rmdir(E).catch(()=>{})}catch{}}(await te.readdir(p).catch(()=>[])).length===0&&await te.rmdir(p).catch(()=>{})}catch{}try{(await te.readdir(a)).length===0&&await te.rmdir(a).catch(()=>{})}catch{}let m=Z.join(e,"index"),g=[...fc.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=Z.join(m,h),y=await Gt(S);if(y===null)continue;let E=fc.find(A=>A.filename===h);E&&(T.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(y),new Date().toISOString()),yp(r,E.key,y));try{await te.unlink(S)}catch{}s++}return s}var hc,fc,yc=P(()=>{"use strict";Se();W();Y();hc=[{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"}],fc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];u(Vo,"migrateJsonToSqlite");u(Ky,"createBackup");u(gc,"copyFiles");u(hp,"populateNormalized");u(Xy,"populateTasksFromState");u(Yy,"populateQueueTasks");u(Qy,"populateIdeas");u(Zy,"populateShippedFeatures");u(ew,"populateMetricsDaily");u(tw,"populateAnalysis");u(yp,"populateIndexTables");u(sw,"populateCategoriesIndex");u(nw,"migrateChecksums");u(rw,"migrateFileScores");u(ow,"migrateEventsJsonl");u(iw,"migrateLearningsJsonl");u(aw,"migrateSessionFiles");u(cw,"cleanupJsonFiles");u($,"toStr");u(xs,"toNum");u(Gt,"readJsonSafe");u(Jo,"sweepLegacyJson")});function zo(r){return[...r].sort((e,t)=>{let s=kp[e.section]-kp[t.section];return s!==0?s:wp[e.priority]-wp[t.priority]})}function wc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var wp,kp,Ko=P(()=>{"use strict";wp={critical:0,high:1,medium:2,low:3},kp={active:0,previously_active:1,backlog:2};u(zo,"sortBySectionAndPriority");u(wc,"uniqueBy")});var kc,re,Nt=P(()=>{"use strict";xt();Fa();Ko();K();Ps();ls();kc=class extends Ye{static{u(this,"QueueStorage")}constructor(){super("queue.json",kd)}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 zo(t)[0]||null}async addTask(e,t){let s={...t,id:z(),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:z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated: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 getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:b()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=ws(us.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;gt.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}},re=new kc});import{z as se}from"zod";var lw,Sp,uw,dw,pw,mw,gw,fw,hw,bp,Tp=P(()=>{"use strict";lw=se.enum(["feature","fix","improvement","refactor"]),Sp=se.enum(["pass","warning","fail","skipped"]),uw=se.enum(["added","changed","fixed","removed"]),dw=se.object({hours:se.number(),minutes:se.number(),totalMinutes:se.number()}),pw=se.object({filesChanged:se.number().nullable().optional(),linesAdded:se.number().nullable().optional(),linesRemoved:se.number().nullable().optional(),commits:se.number().nullable().optional()}),mw=se.object({description:se.string(),type:uw.optional()}),gw=se.object({lintStatus:Sp.nullable().optional(),lintDetails:se.string().optional(),testStatus:Sp.nullable().optional(),testDetails:se.string().optional()}),fw=se.object({hash:se.string().optional(),message:se.string().optional(),branch:se.string().optional()}),hw=se.object({id:se.string(),name:se.string(),version:se.string().nullable().optional(),type:lw,agent:se.string().optional(),description:se.string().optional(),changes:se.array(mw).optional(),codeSnippets:se.array(se.string()).optional(),commit:fw.optional(),codeMetrics:pw.optional(),qualityMetrics:gw.optional(),quantitativeImpact:se.string().optional(),duration:dw.optional(),tasksCompleted:se.number().nullable().optional(),shippedAt:se.string(),featureId:se.string().optional()}),bp=se.object({shipped:se.array(hw),lastUpdated:se.string()})});var Sc,Je,Rs=P(()=>{"use strict";xt();Tp();K();Ps();ls();Sc=class extends Ye{static{u(this,"ShippedStorage")}constructor(){super("shipped.json",bp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:z(),shippedAt: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=ws(us.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;gt.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}},Je=new Sc});import{z as ge}from"zod";var yw,ww,vp,pA,mA,gA,As,Ep,Dr=P(()=>{"use strict";yw=ge.enum(["improving","stable","declining"]),ww=ge.object({sprintNumber:ge.number(),startDate:ge.string(),endDate:ge.string(),pointsCompleted:ge.number(),tasksCompleted:ge.number(),avgVariance:ge.number(),estimationAccuracy:ge.number()}),vp=ge.object({category:ge.string(),avgVariance:ge.number(),taskCount:ge.number()}),pA=ge.object({totalPoints:ge.number(),sprints:ge.number(),estimatedDate:ge.string()}),mA=ge.object({sprints:ge.array(ww),averageVelocity:ge.number(),velocityTrend:yw,estimationAccuracy:ge.number(),overEstimated:ge.array(vp),underEstimated:ge.array(vp),lastUpdated:ge.string()}),gA=ge.object({sprintLengthDays:ge.number().min(1).max(90).default(7),startDay:ge.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ge.number().min(1).max(52).default(6),accuracyTolerance:ge.number().min(0).max(100).default(20)}),As={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Ep={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var bc,In,Xo=P(()=>{"use strict";Dr();ls();bc=class extends Ye{static{u(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Ep,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}},In=new bc});var Ir,Tc,vc,Pp=P(()=>{"use strict";Er();K();Ir=3,Tc=class{static{u(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>=Ir){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}/${Ir} 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>=Ir){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}/${Ir} 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 l=`${i[a]}|${i[c]}`,d=t.get(l)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(l,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>=Ir&&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(l=>l.title.startsWith("[auto-learned]")&&l.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:[qe.FILE_STRUCTURE,qe.ARCHITECTURE],tech_stack:[qe.TECH_STACK],architecture:[qe.ARCHITECTURE,qe.CODE_STYLE],estimation:[qe.SHIP_WORKFLOW],workflow:[qe.SHIP_WORKFLOW,qe.CODE_STYLE],gotcha:[qe.TEST_BEHAVIOR,qe.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(`
652
+ `)}},vc=new Tc});import{z as x}from"zod";var Cp,kw,Sw,xp,bw,Tw,vw,Ew,Pw,Cw,xw,Rp,Rw,Aw,CA,Ap,jp,Dp,Ip,jw,Yo,$p=P(()=>{"use strict";Cp=x.number().min(1).max(5),kw=x.enum(["exceeded","met","partial","failed"]),Sw=x.enum(["definitely","probably","maybe","no"]),xp=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),bw=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:xp.optional(),explanation:x.string().optional()})}),Tw=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),vw=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),Ew=x.object({metrics:x.array(Tw),acceptanceCriteria:x.array(vw),overallSuccess:kw,successScore:x.number().min(0).max(100)}),Pw=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),Cw=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(Pw)}),xw=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:Sw,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),Rp=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:Cp,blockers:x.array(x.string()),agentUsed:x.string().optional(),skillsUsed:x.array(x.string()).optional(),startedAt:x.string(),completedAt:x.string()}),Rw=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:bw,success:Ew.optional(),learnings:Cw,roi:xw,rating:Cp,taskOutcomes:x.array(Rp).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),Aw=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:xp,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),CA=x.object({outcomes:x.array(Rw),taskOutcomes:x.array(Rp).optional(),aggregates:Aw.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),Ap={outcomes:[],taskOutcomes:[],lastUpdated:""},jp=u((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Dp=u((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Ip=u(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),jw=u(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Yo=u(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=>jw(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),{}),l=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:l}},"aggregateOutcomes")});var Ec,_p,Mp=P(()=>{"use strict";$p();ls();K();Ec=class extends Ye{static{u(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Ap,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Yo([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?Yo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Yo(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Et(e.duration)||60,s=t/60,n=t/60,o=jp(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Dp(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:Ip(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}}},_p=new Ec});import Pc from"node:fs/promises";import Qo from"node:path";var Cc,xc,Op,Np=P(()=>{"use strict";W();B();Cc=".prjct/.prjct-state.md",xc=class{static{u(this,"LocalStateGenerator")}async generate(e,t){let s=Qo.join(e,Cc);await Pc.mkdir(Qo.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Pc.writeFile(s,n,"utf-8")}async remove(e){try{await Pc.unlink(Qo.join(e,Cc))}catch(t){if(!j(t))throw t}}async exists(e){let t=Qo.join(e,Cc);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let l=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${l} ${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(`
653
+ `)}},Op=new xc});var Rc,Rt,Ys=P(()=>{"use strict";Ae();Ps();Y();Rc=class{static{u(this,"MemoryService")}async log(e,t,s,n){try{let o=await I.getProjectId(e);if(!o)return;_.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 I.getProjectId(e);return s?_.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 I.getProjectId(e);return 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,...l}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:l,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await I.getProjectId(e);if(!t)return;_.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 _.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=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=us.MEMORY_MAX_ENTRIES)return 0;let n=s-us.MEMORY_MAX_ENTRIES,o=_.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);gt.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&&_.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}}},Rt=new Rc});import Dw from"node:path";function Iw(r){return Gs(Dw.resolve(r))}function $r(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function $w(r){return wc(r,e=>`${$r(e.name)}::${$r(e.source)}`)}function _w(r){return wc(r,e=>`${$r(e.issue)}::${$r(e.file)}::${$r(e.source)}`)}var Ac,Mw,Lp,Fp=P(()=>{"use strict";Y();Ko();Bs();u(Iw,"repoHash");u($r,"normalizeKey");u($w,"dedupePatterns");u(_w,"dedupeAntiPatterns");Ac=class{static{u(this,"PatternExtractor")}async extract(e){let t=Iw(e.projectPath),s=[];if(e.context7Verified)for(let l of e.frameworks)s.push({name:`${l} API validation via Context7`,description:`Validate ${l} APIs against current documentation through Context7 before implementation.`,framework:l,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(l=>({name:l,description:`Confirmed during completed tasks: ${l}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(l=>({issue:l,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${l}`,source:"feedback",severity:"medium",confidence:.7})),i=$w([...s,...n]),a=_w([...o]),c=`analysis:derived-rules:${t}`;return T.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}}},Mw=new Ac,Lp=Mw});import _r from"node:fs/promises";import Ow from"node:os";import Mr from"node:path";function Nw(r){return`# ${r.projectName}
654
+ ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function Lw(r){return r.patterns.length===0?"":`
644
655
  ## Patterns
645
656
  ${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
646
657
  `)}
647
- `}function Tw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
658
+ `}function Fw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
648
659
  ## Anti-Patterns
649
660
  ${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
650
661
  `)}
651
- `}function vw(r){return r.knownGotchas.length===0?"":`
662
+ `}function Uw(r){return r.knownGotchas.length===0?"":`
652
663
  ## Known Gotchas
653
664
  ${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
654
665
  `)}
655
- `}function Ew(r){return r.recentShipped.length===0?"":`
666
+ `}function Hw(r){return r.recentShipped.length===0?"":`
656
667
  ## Recent Deliveries
657
668
  ${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(`
658
669
  `)}
659
- `}function Pw(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?"":`
670
+ `}function Ww(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?"":`
660
671
  ## Velocity
661
672
  ${e.join(" | ")}
662
- `}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?"":`
673
+ `}function qw(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?"":`
663
674
  ## Commands
664
675
  | Action | Command |
665
676
  |--------|---------|
666
677
  ${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
667
678
  `)}
668
- `}function xw(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?"":`
679
+ `}function Gw(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?"":`
669
680
  ## State
670
681
  ${e.join(`
671
682
  `)}
672
- `}function Aw(r){return r.userPatterns.length===0?"":`
683
+ `}function Bw(r){return r.userPatterns.length===0?"":`
673
684
  ## User Patterns
674
685
  ${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
675
686
  `)}
676
- `}function Rw(r){return[bw(r),Tw(r),vw(r),Ew(r),Pw(r),Cw(r.commands),xw(r),Aw(r)].filter(Boolean).join("")}function Dw(r,e){let t=r.userInvocable!==!1;return`---
687
+ `}function Vw(r){return[Lw(r),Fw(r),Uw(r),Hw(r),Ww(r),qw(r.commands),Gw(r),Bw(r)].filter(Boolean).join("")}function Jw(r,e){let t=r.userInvocable!==!1;return`---
677
688
  description: "${r.description} (${e.projectName}, ${e.stack})"
678
689
  allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
679
690
  user-invocable: ${t}
680
- ---`}function Iw(r,e){return`${Dw(r,e)}
691
+ ---`}function zw(r,e){return`${Jw(r,e)}
681
692
 
682
- ${r.body(e)}`}var hc,yc,bm,Tm=v(()=>{"use strict";Yt();es();l(Sw,"formatProjectHeader");l(bw,"formatPatterns");l(Tw,"formatAntiPatterns");l(vw,"formatGotchas");l(Ew,"formatRecentShipped");l(Pw,"formatVelocity");l(Cw,"formatCommands");l(xw,"formatState");l(Aw,"formatUserPatterns");l(Rw,"formatRichContext");hc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Sw(r)}
683
- ${Rw(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(`
693
+ ${r.body(e)}`}var jc,Dc,Up,Hp=P(()=>{"use strict";ns();is();u(Nw,"formatProjectHeader");u(Lw,"formatPatterns");u(Fw,"formatAntiPatterns");u(Uw,"formatGotchas");u(Hw,"formatRecentShipped");u(Ww,"formatVelocity");u(qw,"formatCommands");u(Gw,"formatState");u(Bw,"formatUserPatterns");u(Vw,"formatRichContext");jc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:u(()=>!0,"condition"),body:u(r=>`${Nw(r)}
694
+ ${Vw(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(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:u(()=>!0,"condition"),body:u(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
684
695
  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(`
685
- `)},"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
696
+ `)},"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:u(()=>!0,"condition"),body:u(r=>`## Workflow
686
697
 
687
698
  ### Pre-flight (BLOCKING)
688
699
  1. Verify NOT on main/master: \`git branch --show-current\`
@@ -699,13 +710,13 @@ ASK: "Ready to ship?" Yes / No / Show diff
699
710
  - Commit with prjct footer: \`Generated with [p/](https://www.prjct.app/)\`
700
711
  - Push and create PR
701
712
  - Update issue tracker if linked
702
- `,"body")},{name:"prjct-pause",description:"Pauses the active task to handle an interruption. Use when the user needs to switch context, handle something urgent, or stop current work temporarily.",allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
713
+ `,"body")},{name:"prjct-pause",description:"Pauses the active task to handle an interruption. Use when the user needs to switch context, handle something urgent, or stop current work temporarily.",allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
703
714
  Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct pause "$ARGUMENTS" --md\n```\nRead CLI output for pause confirmation and context saved.\n'),e.join(`
704
- `)},"body")},{name:"prjct-resume",description:'Resumes a paused task. Use when the user says "resume", "continue", "pick up where I left off", or wants to return to previous work.',allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];if(r.pausedTasks.length>0){e.push(`
715
+ `)},"body")},{name:"prjct-resume",description:'Resumes a paused task. Use when the user says "resume", "continue", "pick up where I left off", or wants to return to previous work.',allowedTools:["Bash","Read","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>{let e=["## Workflow"];if(r.pausedTasks.length>0){e.push(`
705
716
  ### Paused Tasks`);for(let t of r.pausedTasks.slice(0,5))e.push(`- **${t.description}** (paused ${t.pausedAt})`)}return e.push('\n```bash\nprjct resume "$ARGUMENTS" --md\n```\nRead CLI output for restored context and next steps.\n'),e.join(`
706
- `)},"body")},{name:"prjct-next",description:`Shows the priority queue and recommends what to work on next. Use when the user asks "what should I do?", "what's next?", or is between tasks.`,allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];if(r.backlogCount>0&&(e.push(`
717
+ `)},"body")},{name:"prjct-next",description:`Shows the priority queue and recommends what to work on next. Use when the user asks "what should I do?", "what's next?", or is between tasks.`,allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>{let e=["## Workflow"];if(r.backlogCount>0&&(e.push(`
707
718
  ${r.backlogCount} items in backlog.`),r.topBacklog.length>0)){e.push("Top priorities:");for(let t of r.topBacklog)e.push(`- [${t.priority}] ${t.description}`)}return e.push("\n```bash\nprjct next --md\n```\nPresent the prioritized list and help user pick a task.\n"),e.join(`
708
- `)},"body")},{name:"prjct-sync",description:"Re-analyze project and regenerate context",allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
719
+ `)},"body")},{name:"prjct-sync",description:"Re-analyze project and regenerate context",allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>`## Workflow
709
720
 
710
721
  \`\`\`bash
711
722
  prjct sync $ARGUMENTS --md
@@ -719,7 +730,28 @@ Present results: tables, analysis findings, anti-patterns, conventions.
719
730
  - Skill regeneration (this skill and others)
720
731
  - Index building (BM25, import graph, co-change)
721
732
  - Pattern extraction and analysis
722
- `,"body")},{name:"prjct-bug",description:"Report and track a bug with auto-priority",allowedTools:["Bash","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
733
+
734
+ ## Obsidian Integration
735
+ After completing analysis, check if Obsidian is configured:
736
+ \`\`\`bash
737
+ prjct obsidian status --md
738
+ \`\`\`
739
+ If configured, write project insights to the vault using the MCP tool \`prjct_obsidian_write\`:
740
+ - notePath: \`_insights.md\`
741
+ - frontmatter: \`{ prjct_type: "insights", updated: "YYYY-MM-DD" }\`
742
+ - content: Your analysis written in natural language (NOT tables or templates)
743
+
744
+ Write like a PM briefing the team. Include:
745
+ - Project status: active task, queue depth, blockers, what needs attention
746
+ - Architecture: style, key patterns, domains identified
747
+ - Recent progress: last deliveries with their impact
748
+ - Risks: anti-patterns found, tech debt, areas of concern
749
+ - Decisions: key technical choices and rationale
750
+ - Velocity: trend, estimation accuracy, capacity
751
+ - Next priorities: what should be tackled next and why
752
+
753
+ Be specific \u2014 cite issue IDs, file paths, concrete numbers. Skip this step if Obsidian is not configured.
754
+ `,"body")},{name:"prjct-bug",description:"Report and track a bug with auto-priority",allowedTools:["Bash","Task","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>`## Workflow
723
755
 
724
756
  1. If no description provided, ASK the user for details
725
757
  2. Run \`prjct bug "$ARGUMENTS" --md\`
@@ -727,7 +759,7 @@ Present results: tables, analysis findings, anti-patterns, conventions.
727
759
  4. ASK: "Fix this bug now?" Fix now / Queue for later
728
760
  5. If fix now: create branch \`bug/{slug}\` and start working
729
761
  6. If queue: done \u2014 bug is tracked
730
- `,"body")},{name:"prjct-workflow",description:"Configures workflow gates, hooks, steps, and instructions via natural language (English/Spanish). Use when the user wants to customize the task\u2192done\u2192ship cycle with before/after hooks, quality gates, or custom steps.",allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
762
+ `,"body")},{name:"prjct-workflow",description:"Configures workflow gates, hooks, steps, and instructions via natural language (English/Spanish). Use when the user wants to customize the task\u2192done\u2192ship cycle with before/after hooks, quality gates, or custom steps.",allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>`## Workflow
731
763
 
732
764
  \`\`\`bash
733
765
  prjct workflow "$ARGUMENTS" --md
@@ -740,7 +772,7 @@ Supports natural language in English and Spanish:
740
772
  - Gates: block transitions until conditions are met
741
773
  - Hooks: run commands before/after state transitions
742
774
  - Steps: add custom workflow stages
743
- `,"body")},{name:"prjct-enrich",description:"Finds relevant files for issues by analyzing local code. Input to linear/jira sync pipeline.",allowedTools:["Bash","Read","Grep","Glob","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n```bash\nprjct enrich "$ARGUMENTS" --md\n```\nRead CLI output for enrichment data.\n',"body")},{name:"prjct-linear",description:"Linear integration \u2014 sync issues, create/update tasks, manage projects. Use when the user mentions Linear, wants to sync issues, or manage work items in Linear.",allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n```bash\nprjct linear "$ARGUMENTS" --md\n```\nRead CLI output for Linear sync results.\n',"body")},{name:"prjct-jira",description:"Jira integration \u2014 sync issues, transitions, boards. Use when the user mentions Jira, wants to sync tickets, or manage work in Jira.",allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n```bash\nprjct jira "$ARGUMENTS" --md\n```\nRead CLI output for Jira sync results.\n',"body")},{name:"prjct-plan",description:"Plan work with real velocity and backlog",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(r=>r.backlogCount>0,"condition"),body:l(r=>'## Workflow\n\n1. Run `prjct next --md` to see prioritized backlog\n2. Review velocity data: `prjct dash --md`\n3. Discuss priorities with the user\n4. Start chosen task: `p. task "description"`\n',"body")},{name:"prjct-velocity",description:"Show delivery velocity and metrics",allowedTools:["Bash","Read"],condition:l(r=>r.completedTaskCount>=5,"condition"),body:l(r=>`## Workflow
775
+ `,"body")},{name:"prjct-enrich",description:"Finds relevant files for issues by analyzing local code. Input to linear/jira sync pipeline.",allowedTools:["Bash","Read","Grep","Glob","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>'## Workflow\n\n```bash\nprjct enrich "$ARGUMENTS" --md\n```\nRead CLI output for enrichment data.\n',"body")},{name:"prjct-linear",description:"Linear integration \u2014 sync issues, create/update tasks, manage projects. Use when the user mentions Linear, wants to sync issues, or manage work items in Linear.",allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>'## Workflow\n\n```bash\nprjct linear "$ARGUMENTS" --md\n```\nRead CLI output for Linear sync results.\n',"body")},{name:"prjct-jira",description:"Jira integration \u2014 sync issues, transitions, boards. Use when the user mentions Jira, wants to sync tickets, or manage work in Jira.",allowedTools:["Bash","AskUserQuestion"],condition:u(()=>!0,"condition"),body:u(r=>'## Workflow\n\n```bash\nprjct jira "$ARGUMENTS" --md\n```\nRead CLI output for Jira sync results.\n',"body")},{name:"prjct-plan",description:"Plan work with real velocity and backlog",allowedTools:["Bash","Read","AskUserQuestion"],condition:u(r=>r.backlogCount>0,"condition"),body:u(r=>'## Workflow\n\n1. Run `prjct next --md` to see prioritized backlog\n2. Review velocity data: `prjct dash --md`\n3. Discuss priorities with the user\n4. Start chosen task: `p. task "description"`\n',"body")},{name:"prjct-velocity",description:"Show delivery velocity and metrics",allowedTools:["Bash","Read"],condition:u(r=>r.completedTaskCount>=5,"condition"),body:u(r=>`## Workflow
744
776
 
745
777
  1. Run \`prjct dash --md\` for full metrics dashboard
746
778
  2. Present velocity, estimation accuracy, and burndown
@@ -751,7 +783,7 @@ Supports natural language in English and Spanish:
751
783
  - Average task duration
752
784
  - Points delivered vs estimated
753
785
  - Shipping frequency
754
- `,"body")},{name:"prjct-tokens",description:"Record token usage on the active task. Auto-invoke BEFORE completing a task (done/ship) to track input/output tokens for cost analysis.",allowedTools:["Bash"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
786
+ `,"body")},{name:"prjct-tokens",description:"Record token usage on the active task. Auto-invoke BEFORE completing a task (done/ship) to track input/output tokens for cost analysis.",allowedTools:["Bash"],condition:u(()=>!0,"condition"),body:u(r=>`## Workflow
755
787
 
756
788
  Report your token usage on the active task:
757
789
 
@@ -763,34 +795,37 @@ prjct tokens <input_tokens> <output_tokens>
763
795
 
764
796
  Tokens accumulate \u2014 call multiple times during a task and they add up.
765
797
  Token totals are saved to task history on completion for cost comparison across tasks.
766
- `,"body")}];l(Dw,"buildFrontmatter");l(Iw,"buildSkillContent");yc=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=vr.join(kw.homedir(),".claude","skills");for(let c of hc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await Tr.rm(vr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Iw(c,o),d=vr.join(i,c.name),m=vr.join(d,"SKILL.md");await Tr.mkdir(d,{recursive:!0}),await Tr.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){H.debug(`Failed to generate skill ${c.name}`,{error:ie(u)}),n.skipped.push({name:c.name,reason:ie(u)})}}let a=new Set(hc.map(c=>c.name));try{let c=await Tr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await Tr.rm(vr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&H.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return hc}},bm=new yc});var vm=v(()=>{"use strict"});import jw from"node:fs/promises";import Em from"node:path";var No,Pm=v(()=>{"use strict";B();No=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=Em.join(this.projectPath,"package.json"),t=await jw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Em.join(this.projectPath,e))}}});import wc from"node:path";async function Cm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await _("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await _("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await _("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await _("git status --porcelain",{cwd:r}),i=o.trim().split(`
767
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await _('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
768
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await _('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ie(t)})}return e}async function Wt(r,e){let t=await C(wc.join(r,e));return t||H.debug("File not found",{filename:e}),t}async function xm(r){let e={fileCount:0,version:"0.0.0",name:wc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await _('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:ie(t)}),e.fileCount=0}try{let t=wc.join(r,"package.json"),s=await Pe(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 Wt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ie(t)})}return await Wt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Wt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Wt(r,"requirements.txt")||await Wt(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 Am(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 Wt(r,"bun.lockb")||await Wt(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 Wt(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 Wt(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 Wt(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 Wt(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 Rm(r){return new No(r).detect()}var Dm=v(()=>{"use strict";Yt();vm();Le();B();es();Pm();l(Cm,"analyzeGit");l(Wt,"fileExistsInProject");l(xm,"gatherStats");l(Am,"detectCommands");l(Rm,"detectStack")});import Im from"node:fs/promises";import Lo from"node:path";var kc,Sc,jm,$m=v(()=>{"use strict";ft();U();Le();B();kc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Lo.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Lo.basename(r);try{await O.read(s)}catch(n){D(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=Lo.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 Im.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Im.readFile(Lo.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(!D(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}}},Sc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[kc.contextFilesExist(t),kc.jsonFilesValid(t),kc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(p)+1);a+=h.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await _(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}}}},jm=new Sc});import Mm from"node:fs/promises";import bc from"node:path";var Tc,Gs,vc=v(()=>{"use strict";na();ga();kd();Td();Ad();Ma();Yt();dt();ss();Ce();ye();Ro();yn();Ls();te();ws();fr();Qa();sc();Ht();Hs();ft();ac();q();B();es();im();hm();yr();wm();Ws();Sm();Tm();Dm();$m();Tc=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 j.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 Mm.rm(bc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Ds()).installed){let w=await Ao({autoRepair:!0});w.verified||H.warn(`Codex p. router not ready: ${w.message||"verification failed"}`)}try{n=await is.ensureReady()}catch(w){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:ie(w)},error:`Context7 MCP is required but not ready: ${ie(w)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Do(this.projectId);try{let w=await Io(this.projectId);w>0&&H.info("Swept legacy JSON files into SQLite",{swept:w})}catch(w){H.debug("Legacy JSON sweep failed (non-critical)",{error:ie(w)})}let[a,c,u,d]=await Promise.all([Cm(this.projectPath),xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath)]),m=t.full===!0,p,g=!0,h=new Set;if(!m&&bd(this.projectId))try{let{diff:w,currentHashes:M}=await Oa(this.projectPath,this.projectId),N=w.added.length+w.modified.length+w.deleted.length;if(N===0&&!t.changedFiles?.length)g=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:w.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let fe=yd(w,this.projectId);h=wd(fe.allAffected);let Ne=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=fe.allAffected.some(tt=>{let pt=tt.substring(tt.lastIndexOf("."));return Ne.has(pt)}),p={isIncremental:!0,filesChanged:N,filesUnchanged:w.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}_a(this.projectId,M)}catch(w){H.debug("Incremental detection failed, falling back to full sync",{error:ie(w)})}else try{let{currentHashes:w}=await Oa(this.projectPath,this.projectId);_a(this.projectId,w)}catch(w){H.debug("Hash computation failed (non-critical)",{error:ie(w)})}if(g)try{await Promise.all([Vu(this.projectPath,this.projectId),hd(this.projectPath,this.projectId),xd(this.projectPath,this.projectId)])}catch(w){H.debug("File ranking index build failed (non-critical)",{error:ie(w)})}let b;try{let[w,M,N,fe,Ne,Rt,tt,pt,us,Ri,Di]=await Promise.all([Promise.resolve(Lt.getActive(this.projectId)).catch(()=>null),qe.getActive(this.projectId).catch(()=>null),Ye.getRecent(this.projectId,3).catch(()=>[]),Mo.getMetrics(this.projectId).catch(()=>null),pe.getBacklog(this.projectId).catch(()=>[]),O.getTaskHistory(this.projectId).catch(()=>[]),O.getAllPausedTasks(this.projectId).catch(()=>[]),O.getAggregatedFeedback(this.projectId).catch(()=>null),O.getCurrentTask(this.projectId).catch(()=>null),Ue.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Ye.getCount(this.projectId).catch(()=>0)]),Ii={backlogCount:Ne.length,completedTaskCount:Rt.length,pausedTaskCount:tt.length,hasActiveTask:!!us},ji=w?w.patterns.map(ne=>({name:ne.name,description:ne.description,location:ne.locations?.[0]})):(M?.patterns??[]).filter(ne=>ne.source!=="repo").map(ne=>({name:ne.name,description:ne.description,location:ne.location})),$i=w?w.antiPatterns.map(ne=>({issue:ne.issue,file:ne.files?.[0]??"multiple",suggestion:ne.suggestion,severity:ne.severity??"medium"})):(M?.antiPatterns??[]).filter(ne=>ne.source!=="repo").map(ne=>({issue:ne.issue,file:ne.file,suggestion:ne.suggestion,severity:ne.severity??"medium"})),Mi=w?.commands?{install:w.commands.install??u.install,run:u.run,test:w.commands.test??u.test,build:w.commands.build??u.build,dev:w.commands.dev??u.dev,lint:w.commands.lint??u.lint,format:w.commands.format??u.format}:u,_i={version:c.version,fileCount:c.fileCount,patterns:ji,antiPatterns:$i,recentShipped:N.map(ne=>({name:ne.name,type:ne.type??"feature",duration:ne.duration,filesChanged:ne.changes?.length})),velocity:fe?{avgPoints:fe.averageVelocity,trend:fe.velocityTrend,accuracy:fe.estimationAccuracy}:null,backlogCount:Ne.length,completedTaskCount:Rt.length,pausedTaskCount:tt.length,knownGotchas:pt?.knownGotchas??[],userPatterns:pt?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:tt.map(ne=>({description:ne.description,pausedAt:ne.pausedAt??""})),topBacklog:Ne.slice(0,3).map(ne=>({description:ne.description,priority:ne.priority??"medium"})),ideasCount:Ri?.pending??0,shippedCount:Di};b=await bm.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Mi,stack:d},Ii,_i)}catch(w){H.debug("Native skill generation failed (non-critical)",{error:ie(w)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let k=await qe.getActive(this.projectId),E={patterns:k?.patterns?.length||0,antiPatterns:k?.antiPatterns?.length||0,criticalAntiPatterns:k?.antiPatterns?.filter(w=>w.severity==="high").length||0},R=Date.now()-s,W=await this.recordSyncMetrics(c,R);await this.archiveStaleData(),await this.autoLearnFromHistory(),await xe.installGlobalConfig(),await xe.syncCommands();let z;try{let w=await j.readConfig(this.projectPath);z=await jm.verify(this.projectPath,this.globalPath,w?.verification)}catch(w){H.debug("Verification failed (non-critical)",{error:ie(w)})}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:W,verification:z,incremental:p,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:ie(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Mm.mkdir(bc.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||S(),lastSync:S(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};P.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await O.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=S(),n.lastUpdated=S(),n.context={...n.context||{},lastSession:S(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await O.write(this.projectId,n);try{await ym.generate(this.projectPath,n)}catch(o){H.debug("Local state generation failed (optional)",{error:ie(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=fo(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){H.debug("Could not load BM25 index for metrics",{error:ie(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Tn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){H.debug("Failed to record sync metrics",{error:ie(a)})}let i={};try{let a=fo(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=So(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Cd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){H.debug("Could not load index stats",{error:ie(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 O.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 km.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 qe.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:S(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:ie(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Ye.archiveOldShipped(this.projectId).catch(()=>0),Ue.markDormantIdeas(this.projectId).catch(()=>0),pe.removeStaleCompleted(this.projectId).catch(()=>0),O.archiveStalePausedTasks(this.projectId).catch(()=>[]),Et.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Mt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ie(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await O.getTaskHistory(this.projectId);if(e.length===0)return;let t=new mn,s=await lc.learnFromTaskHistory(this.projectId,e,t);try{let n=await fm.getFeatureOutcomes(this.projectId);n.length>0&&await lc.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:ie(e)})}}async getCliVersion(){try{let e=bc.join(__dirname,"..","..","package.json");return(await Pe(e))?.version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ie(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},Gs=new Tc});function $w(){return"---"}function Mw(){return`---
769
- prjct v${xs()}`}function L(...r){return Pc($w(),...r.filter(Boolean),Mw())}function Er(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
770
- `)}function _m(r,e=""){return`\`\`\`${e}
798
+ `,"body")}];u(Jw,"buildFrontmatter");u(zw,"buildSkillContent");Dc=class{static{u(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=Mr.join(Ow.homedir(),".claude","skills");for(let c of jc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await _r.rm(Mr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let l=zw(c,o),d=Mr.join(i,c.name),p=Mr.join(d,"SKILL.md");await _r.mkdir(d,{recursive:!0}),await _r.writeFile(p,l,"utf-8"),n.generated.push({name:c.name,path:p})}catch(l){q.debug(`Failed to generate skill ${c.name}`,{error:de(l)}),n.skipped.push({name:c.name,reason:de(l)})}}let a=new Set(jc.map(c=>c.name));try{let c=await _r.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of c)l.isDirectory()&&l.name.startsWith("prjct-")&&!a.has(l.name)&&await _r.rm(Mr.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&q.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return jc}},Up=new Dc});var Wp=P(()=>{"use strict"});import Kw from"node:fs/promises";import qp from"node:path";var Zo,Gp=P(()=>{"use strict";B();Zo=class{static{u(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=qp.join(this.projectPath,"package.json"),t=await Kw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(qp.join(this.projectPath,e))}}});import Ic from"node:path";async function Bp(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(`
799
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let l of i){let d=l.substring(0,2),p=l.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 O('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
800
+ `).filter(Boolean).map(l=>{let[d,p,m]=l.split("|");return{hash:d,message:p,date:m}});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){q.debug("Git analysis failed (not a git repo?)",{error:de(t)})}return e}async function Bt(r,e){let t=await C(Ic.join(r,e));return t||q.debug("File not found",{filename:e}),t}async function Vp(r){let e={fileCount:0,version:"0.0.0",name:Ic.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){q.debug("File count failed",{path:r,error:de(t)}),e.fileCount=0}try{let t=Ic.join(r,"package.json"),s=await Te(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 Bt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){q.debug("No package.json found",{path:r,error:de(t)})}return await Bt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Bt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Bt(r,"requirements.txt")||await Bt(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 Jp(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 Bt(r,"bun.lockb")||await Bt(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 Bt(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 Bt(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 Bt(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 Bt(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 zp(r){return new Zo(r).detect()}var Kp=P(()=>{"use strict";ns();Wp();We();B();is();Gp();u(Bp,"analyzeGit");u(Bt,"fileExistsInProject");u(Vp,"gatherStats");u(Jp,"detectCommands");u(zp,"detectStack")});import Xp from"node:fs/promises";import ei from"node:path";var $c,_c,Yp,Qp=P(()=>{"use strict";ft();W();We();B();$c={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=ei.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=ei.basename(r);try{await M.read(s)}catch(n){j(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=ei.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 Xp.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Xp.readFile(ei.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(!j(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}}},_c=class{static{u(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[$c.contextFilesExist(t),$c.jsonFilesValid(t),$c.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 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}}}},Yp=new _c});import Zp from"node:fs/promises";import Mc from"node:path";var Oc,Qs,Nc=P(()=>{"use strict";ka();ja();Ld();Hd();Jd();Xa();ns();mt();cs();Ae();Se();Go();Cn();Ps();Y();Cs();xn();Bo();yc();Nt();Rs();ft();Xo();K();B();is();Pp();Mp();Ar();Np();Ys();Fp();Hp();Kp();Qp();Oc=class{static{u(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 I.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 Zp.rm(Mc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Hs()).installed){let k=await qo({autoRepair:!0});k.verified||q.warn(`Codex p. router not ready: ${k.message||"verification failed"}`)}try{n=await ps.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:de(k)},error:`Context7 MCP is required but not ready: ${de(k)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Vo(this.projectId);try{let k=await Jo(this.projectId);k>0&&q.info("Swept legacy JSON files into SQLite",{swept:k})}catch(k){q.debug("Legacy JSON sweep failed (non-critical)",{error:de(k)})}let[a,c,l,d]=await Promise.all([Bp(this.projectPath),Vp(this.projectPath),Jp(this.projectPath),zp(this.projectPath)]),p=t.full===!0,m,g=!0,h=new Set;if(!p&&Ud(this.projectId))try{let{diff:k,currentHashes:D}=await Qa(this.projectPath,this.projectId),N=k.added.length+k.modified.length+k.deleted.length;if(N===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:k.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let we=Od(k,this.projectId);h=Nd(we.allAffected);let He=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=we.allAffected.some(rt=>{let wt=rt.substring(rt.lastIndexOf("."));return He.has(wt)}),m={isIncremental:!0,filesChanged:N,filesUnchanged:k.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}Ya(this.projectId,D)}catch(k){q.debug("Incremental detection failed, falling back to full sync",{error:de(k)})}else try{let{currentHashes:k}=await Qa(this.projectPath,this.projectId);Ya(this.projectId,k)}catch(k){q.debug("Hash computation failed (non-critical)",{error:de(k)})}if(g)try{await Promise.all([ld(this.projectPath,this.projectId),Md(this.projectPath,this.projectId),Vd(this.projectPath,this.projectId)])}catch(k){q.debug("File ranking index build failed (non-critical)",{error:de(k)})}let S;try{let[k,D,N,we,He,It,rt,wt,Xt,Bi,Vi]=await Promise.all([Promise.resolve(Wt.getActive(this.projectId)).catch(()=>null),Qe.getActive(this.projectId).catch(()=>null),Je.getRecent(this.projectId,3).catch(()=>[]),In.getMetrics(this.projectId).catch(()=>null),re.getBacklog(this.projectId).catch(()=>[]),M.getTaskHistory(this.projectId).catch(()=>[]),M.getAllPausedTasks(this.projectId).catch(()=>[]),M.getAggregatedFeedback(this.projectId).catch(()=>null),M.getCurrentTask(this.projectId).catch(()=>null),Pe.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Je.getCount(this.projectId).catch(()=>0)]),Ji={backlogCount:He.length,completedTaskCount:It.length,pausedTaskCount:rt.length,hasActiveTask:!!Xt},zi=k?k.patterns.map(ie=>({name:ie.name,description:ie.description,location:ie.locations?.[0]})):(D?.patterns??[]).filter(ie=>ie.source!=="repo").map(ie=>({name:ie.name,description:ie.description,location:ie.location})),Ki=k?k.antiPatterns.map(ie=>({issue:ie.issue,file:ie.files?.[0]??"multiple",suggestion:ie.suggestion,severity:ie.severity??"medium"})):(D?.antiPatterns??[]).filter(ie=>ie.source!=="repo").map(ie=>({issue:ie.issue,file:ie.file,suggestion:ie.suggestion,severity:ie.severity??"medium"})),Xi=k?.commands?{install:k.commands.install??l.install,run:l.run,test:k.commands.test??l.test,build:k.commands.build??l.build,dev:k.commands.dev??l.dev,lint:k.commands.lint??l.lint,format:k.commands.format??l.format}:l,Yi={version:c.version,fileCount:c.fileCount,patterns:zi,antiPatterns:Ki,recentShipped:N.map(ie=>({name:ie.name,type:ie.type??"feature",duration:ie.duration,filesChanged:ie.changes?.length})),velocity:we?{avgPoints:we.averageVelocity,trend:we.velocityTrend,accuracy:we.estimationAccuracy}:null,backlogCount:He.length,completedTaskCount:It.length,pausedTaskCount:rt.length,knownGotchas:wt?.knownGotchas??[],userPatterns:wt?.patternsDiscovered??[],hasActiveTask:!!Xt,activeTaskDescription:Xt?.description??"",pausedTasks:rt.map(ie=>({description:ie.description,pausedAt:ie.pausedAt??""})),topBacklog:He.slice(0,3).map(ie=>({description:ie.description,priority:ie.priority??"medium"})),ideasCount:Bi?.pending??0,shippedCount:Vi};S=await Up.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Xi,stack:d},Ji,Yi)}catch(k){q.debug("Native skill generation failed (non-critical)",{error:de(k)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let y=await Qe.getActive(this.projectId),E={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(k=>k.severity==="high").length||0},A=Date.now()-s,F=await this.recordSyncMetrics(c,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await je.installGlobalConfig(),await je.syncCommands();let J;try{let k=await I.readConfig(this.projectPath);J=await Yp.verify(this.projectPath,this.globalPath,k?.verification)}catch(k){q.debug("Verification failed (non-critical)",{error:de(k)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:l,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:E,syncMetrics:F,verification:J,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:de(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Zp.mkdir(Mc.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=T.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};T.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await M.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 M.write(this.projectId,n);try{await Op.generate(this.projectPath,n)}catch(o){q.debug("Local state generation failed (optional)",{error:de(o)})}}async logToMemory(e,t){T.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=Ao(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){q.debug("Could not load BM25 index for metrics",{error:de(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await ms.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){q.debug("Failed to record sync metrics",{error:de(a)})}let i={};try{let a=Ao(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Mo(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let l=Bd(this.projectId);l&&(i.cochangeCommits=l.commitsAnalyzed,i.cochangeFiles=l.filesAnalyzed)}catch(a){q.debug("Could not load index stats",{error:de(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 M.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 l=await Lp.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=l.patterns,a=l.antiPatterns,await Qe.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){q.debug("Failed to save draft analysis (non-critical)",{error:de(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Je.archiveOldShipped(this.projectId).catch(()=>0),Pe.markDormantIdeas(this.projectId).catch(()=>0),re.removeStaleCompleted(this.projectId).catch(()=>0),M.archiveStalePausedTasks(this.projectId).catch(()=>[]),Rt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){q.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=gt.getStats(this.projectId);q.debug("Archive stats",a)}}catch(e){q.debug("Archival failed (non-critical)",{error:de(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await M.getTaskHistory(this.projectId);if(e.length===0)return;let t=new bn,s=await vc.learnFromTaskHistory(this.projectId,e,t);try{let n=await _p.getFeatureOutcomes(this.projectId);n.length>0&&await vc.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&q.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){q.debug("Auto-learning failed (non-critical)",{error:de(e)})}}async getCliVersion(){try{let e=Mc.join(__dirname,"..","..","package.json");return(await Te(e))?.version||"0.0.0"}catch(e){return q.debug("Failed to read CLI version",{error:de(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 Oc});var nm={};Lt(nm,{mdActionRequired:()=>ht,mdBadge:()=>ti,mdCallout:()=>Vt,mdCodeBlock:()=>Lc,mdDone:()=>ue,mdError:()=>Xw,mdFooter:()=>tm,mdFrontmatter:()=>sm,mdHeader:()=>em,mdJoin:()=>si,mdList:()=>De,mdNextSteps:()=>oe,mdObsidianNote:()=>gs,mdOutput:()=>L,mdRelevantFiles:()=>Uc,mdSection:()=>X,mdStats:()=>Oe,mdSubtasks:()=>Fc,mdTable:()=>js,mdTaskHeader:()=>$n,mdWarn:()=>Hc});function em(){return"---"}function tm(){return`---
801
+ prjct v${Ls()}`}function L(...r){return si(em(),...r.filter(Boolean),tm())}function js(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
802
+ `)}function Lc(r,e=""){return`\`\`\`${e}
771
803
  ${r}
772
- \`\`\``}function Ec(r,e){return`**${r}**: \`${e}\``}function Fo(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function Y(r,e,t=3){return`### ${r}
773
- ${e}`}function $e(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
774
- `)}function Pr(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?`
775
- > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Om(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
776
- ${Er(t,s)}`}function Nm(r){return r.length===0?"":`### Relevant Files
804
+ \`\`\``}function ti(r,e){return`**${r}**: \`${e}\``}function Vt(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function X(r,e,t=3){return`### ${r}
805
+ ${e}`}function De(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
806
+ `)}function $n(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?`
807
+ > ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Fc(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
808
+ ${js(t,s)}`}function Uc(r){return r.length===0?"":`### Relevant Files
777
809
  ${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
778
- `)}`}function de(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
779
- ${Er(e,t)}`}function rt(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 Er(t,s)}function we(r,e){return e?`## ${r}
780
- > ${e}`:`## ${r}`}function Lm(r){return`> **WARNING:** ${r}`}function Pc(...r){return r.filter(Boolean).join(`
810
+ `)}`}function oe(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
811
+ ${js(e,t)}`}function Oe(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 js(t,s)}function ue(r,e){return e?`## ${r}
812
+ > ${e}`:`## ${r}`}function Hc(r){return`> **WARNING:** ${r}`}function Xw(r){return`> **ERROR:** ${r}`}function sm(r){let e=["---"];for(let[t,s]of Object.entries(r))s!=null&&(Array.isArray(s)?e.push(`${t}: [${s.map(n=>String(n)).join(", ")}]`):typeof s=="object"||e.push(`${t}: ${String(s)}`));return e.push("---"),e.join(`
813
+ `)}function gs(r,e,...t){return[sm(r),`# ${e}`,...t.filter(Boolean)].join(`
814
+
815
+ `)}function si(...r){return r.filter(Boolean).join(`
781
816
 
782
817
  `)}function ht(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(`
783
- `))}var Vs=v(()=>{"use strict";It();l($w,"mdHeader");l(Mw,"mdFooter");l(L,"mdOutput");l(Er,"mdTable");l(_m,"mdCodeBlock");l(Ec,"mdBadge");l(Fo,"mdCallout");l(Y,"mdSection");l($e,"mdList");l(Pr,"mdTaskHeader");l(Om,"mdSubtasks");l(Nm,"mdRelevantFiles");l(de,"mdNextSteps");l(rt,"mdStats");l(we,"mdDone");l(Lm,"mdWarn");l(Pc,"mdJoin");l(ht,"mdActionRequired")});import Cr from"chalk";function Pt(r,e={}){if(e.quiet)return;let t=Um[r]||"idle",s=Ns.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Fm[o]||o}));console.log(Cr.dim(`
784
- Next:`));for(let o of n){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function Uo(r,e=!1){let t=Um[r]||"idle";return Ns.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Fm[n]||n}))}function xr(r){let e=Ns.getStateInfo(r);console.log(Cr.dim(`\u{1F4CD} State: ${Cr.white(r.toUpperCase())} - ${e.description}`))}var Fm,Um,vn=v(()=>{"use strict";Pa();Fm={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"},Um={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(Pt,"showNextSteps");l(Uo,"getNextSteps");l(xr,"showStateInfo")});import Bs from"chalk";var Hm,_w,Ow,Gt,Wm=v(()=>{"use strict";dt();Hm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],_w=80,Ow={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Hm,speed:_w},cli:{header:l(()=>`${Bs.cyan.bold("\u26A1")} ${Bs.cyan("prjct")}`,"header"),footer:l(()=>Bs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Bs.cyan("\u26A1")} ${Bs.cyan("prjct")} ${Bs.cyan(Hm[r%10])} ${Bs.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")=>zr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>zr(r).signature,"getSignature")},Gt=Ow});import ae from"chalk";function Fw(){return Nw[Lw]}var u0,Cc,Nw,Lw,Js,En,xc,Ct,bs,Uw,Hw,f,Qe=v(()=>{"use strict";Wm();Fs();To();To();u0=Gt.spinner.frames,Cc=Gt.spinner.speed,Nw={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}},Lw="compact";l(Fw,"getTierConfig");Js={success:ae.green("\u2713"),fail:ae.red("\u2717"),warn:ae.yellow("\u26A0"),info:ae.blue("\u2139"),debug:ae.dim("\u{1F527}"),bullet:ae.dim("\u2022"),arrow:ae.dim("\u2192"),check:ae.green("\u2713"),cross:ae.red("\u2717"),spinner:ae.cyan("\u25D0")},En=null,xc=0,Ct=!1,bs=l((r,e)=>{let t=e??(Fw().maxCharsPerLine||Ft.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Uw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ft.CLEAR_WIDTH)}\r`):!0,"clear"),Hw={start(){return Ct||console.log(Gt.cli.header()),this},end(){return Ct||console.log(Gt.cli.footer()),this},spin(r){return Ct?this:(this.stop(),process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,bs(r,Ft.SPINNER_MSG))}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,bs(r,Ft.SPINNER_MSG))}
785
- `),this))},done(r,e){if(this.stop(),!Ct){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=ae.dim(` [${s.join(" | ")}]`))}console.log(`${Js.success} ${bs(r,Ft.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Js.fail} ${bs(r,Ft.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Ha(r):r;return console.error(),console.error(`${Js.fail} ${e.message}`),e.file&&console.error(ae.dim(` File: ${e.file}`)),e.hint&&console.error(ae.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ae.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),Ct||console.log(`${Js.warn} ${bs(r,Ft.WARN_MSG)}`),this},info(r){return this.stop(),Ct||console.log(`${Js.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Ct&&e&&console.log(`${Js.debug} ${ae.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Ct)return this;let t=e.bullet||Js.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Ct||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(ae.dim(n)),console.log(ae.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(),Ct)return this;let t=e.split(`
786
- `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ae.dim(`\u250C${n}\u2510`)),console.log(`${ae.dim("\u2502")} ${ae.bold(r.padEnd(s))} ${ae.dim("\u2502")}`),console.log(ae.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ae.dim("\u2502")} ${o.padEnd(s)} ${ae.dim("\u2502")}`);return console.log(ae.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Ct?this:(console.log(`
787
- ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){return En&&(clearInterval(En),En=null,Uw()),this},step(r,e,t){if(Ct)return this;this.stop();let s=ae.dim(`[${r}/${e}]`);return process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,`${s} ${bs(t,Ft.STEP_MSG)}`)}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,`${s} ${bs(t,Ft.STEP_MSG)}`)}
788
- `),this)},progress(r,e,t){if(Ct)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ae.cyan("\u2588".repeat(n))+ae.dim("\u2591".repeat(o)),a=t?` ${bs(t,Ft.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,`[${i}] ${s}%${a}`)}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,`[${i}] ${s}%${a}`)}
789
- `),this)}},f=Hw});import Ww from"node:path";async function Ac(r,e){let t=Date.now()-e;await xe.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: ${Pn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
790
- `));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 Pt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function Gm(r){try{let e=await Et.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];n=ct(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 Pn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Rc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Vm(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 Bm(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 | ${Pn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${po(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Rc(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: ${Pn(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(`
791
- `)}function Jm(r,e){let t=[];t.push(`# Repository Analysis
818
+ `))}var es=P(()=>{"use strict";_t();u(em,"mdHeader");u(tm,"mdFooter");u(L,"mdOutput");u(js,"mdTable");u(Lc,"mdCodeBlock");u(ti,"mdBadge");u(Vt,"mdCallout");u(X,"mdSection");u(De,"mdList");u($n,"mdTaskHeader");u(Fc,"mdSubtasks");u(Uc,"mdRelevantFiles");u(oe,"mdNextSteps");u(Oe,"mdStats");u(ue,"mdDone");u(Hc,"mdWarn");u(Xw,"mdError");u(sm,"mdFrontmatter");u(gs,"mdObsidianNote");u(si,"mdJoin");u(ht,"mdActionRequired")});import Or from"chalk";function At(r,e={}){if(e.quiet)return;let t=om[r]||"idle",s=zs.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:rm[o]||o}));console.log(Or.dim(`
819
+ Next:`));for(let o of n){let i=Or.cyan(o.cmd.padEnd(12));console.log(Or.dim(` ${i} \u2192 ${o.desc}`))}}function ni(r,e=!1){let t=om[r]||"idle";return zs.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:rm[n]||n}))}function Nr(r){let e=zs.getStateInfo(r);console.log(Or.dim(`\u{1F4CD} State: ${Or.white(r.toUpperCase())} - ${e.description}`))}var rm,om,_n=P(()=>{"use strict";Ha();rm={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"},om={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"};u(At,"showNextSteps");u(ni,"getNextSteps");u(Nr,"showStateInfo")});import Zs from"chalk";var im,Yw,Qw,Jt,am=P(()=>{"use strict";mt();im=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Yw=80,Qw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:im,speed:Yw},cli:{header:u(()=>`${Zs.cyan.bold("\u26A1")} ${Zs.cyan("prjct")}`,"header"),footer:u(()=>Zs.dim("\u26A1 prjct"),"footer"),spin:u((r,e)=>`${Zs.cyan("\u26A1")} ${Zs.cyan("prjct")} ${Zs.cyan(im[r%10])} ${Zs.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:u((r="claude")=>co(r).commitFooter,"getCommitFooter"),getSignature:u((r="claude")=>co(r).signature,"getSignature")},Jt=Qw});import pe from"chalk";function tk(){return Zw[ek]}var xD,Wc,Zw,ek,en,Mn,qc,jt,Ds,sk,nk,f,Ze=P(()=>{"use strict";am();Ks();No();No();xD=Jt.spinner.frames,Wc=Jt.spinner.speed,Zw={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}},ek="compact";u(tk,"getTierConfig");en={success:pe.green("\u2713"),fail:pe.red("\u2717"),warn:pe.yellow("\u26A0"),info:pe.blue("\u2139"),debug:pe.dim("\u{1F527}"),bullet:pe.dim("\u2022"),arrow:pe.dim("\u2192"),check:pe.green("\u2713"),cross:pe.red("\u2717"),spinner:pe.cyan("\u25D0")},Mn=null,qc=0,jt=!1,Ds=u((r,e)=>{let t=e??(tk().maxCharsPerLine||qt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),sk=u(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(qt.CLEAR_WIDTH)}\r`):!0,"clear"),nk={start(){return jt||console.log(Jt.cli.header()),this},end(){return jt||console.log(Jt.cli.footer()),this},spin(r){return jt?this:(this.stop(),process.stdout.isTTY?(Mn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(qc++,Ds(r,qt.SPINNER_MSG))}`)},Wc),this):(process.stdout.write(`${Jt.cli.spin(0,Ds(r,qt.SPINNER_MSG))}
820
+ `),this))},done(r,e){if(this.stop(),!jt){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=pe.dim(` [${s.join(" | ")}]`))}console.log(`${en.success} ${Ds(r,qt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${en.fail} ${Ds(r,qt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?nc(r):r;return console.error(),console.error(`${en.fail} ${e.message}`),e.file&&console.error(pe.dim(` File: ${e.file}`)),e.hint&&console.error(pe.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(pe.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),jt||console.log(`${en.warn} ${Ds(r,qt.WARN_MSG)}`),this},info(r){return this.stop(),jt||console.log(`${en.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!jt&&e&&console.log(`${en.debug} ${pe.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),jt)return this;let t=e.bullet||en.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),jt||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(pe.dim(n)),console.log(pe.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),jt)return this;let t=e.split(`
821
+ `),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(pe.dim(`\u250C${n}\u2510`)),console.log(`${pe.dim("\u2502")} ${pe.bold(r.padEnd(s))} ${pe.dim("\u2502")}`),console.log(pe.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${pe.dim("\u2502")} ${o.padEnd(s)} ${pe.dim("\u2502")}`);return console.log(pe.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),jt?this:(console.log(`
822
+ ${pe.bold(r)}`),console.log(pe.dim("\u2500".repeat(r.length))),this)},stop(){return Mn&&(clearInterval(Mn),Mn=null,sk()),this},step(r,e,t){if(jt)return this;this.stop();let s=pe.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Mn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(qc++,`${s} ${Ds(t,qt.STEP_MSG)}`)}`)},Wc),this):(process.stdout.write(`${Jt.cli.spin(0,`${s} ${Ds(t,qt.STEP_MSG)}`)}
823
+ `),this)},progress(r,e,t){if(jt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=pe.cyan("\u2588".repeat(n))+pe.dim("\u2591".repeat(o)),a=t?` ${Ds(t,qt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Mn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(qc++,`[${i}] ${s}%${a}`)}`)},Wc),this):(process.stdout.write(`${Jt.cli.spin(0,`[${i}] ${s}%${a}`)}
824
+ `),this)}},f=nk});import rk from"node:path";async function Gc(r,e){let t=Date.now()-e;await je.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: ${On(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
825
+ `));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(l=>`${l.name} (${l.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(l=>l.passed?`\u2713 ${l.name}`:`\u2717 ${l.name}${l.error?` \u2014 ${l.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 cm(r){try{let e=await Rt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(l=>(l.timestamp||l.ts)?.startsWith(t)),n=null;if(s.length>=2){let l=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(l.length>=2){let d=l[l.length-1]-l[0];n=ut(d)}}let o=s.filter(l=>l.action==="task_completed").length,i=s.filter(l=>l.action==="feature_shipped").length,a=new Map;for(let l of s)if(l.action==="sync"&&Array.isArray(l.subagents))for(let d of l.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([l,d])=>({name:l,count:d})).sort((l,d)=>d.count-l.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function On(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Bc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function lm(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 um(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 | ${On(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${xo(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Bc(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,l)=>c+l.usageCount,0);for(let c of r.topAgents){let l=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${l}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${On(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(`
826
+ `)}function dm(r,e){let t=[];t.push(`# Repository Analysis
792
827
  `),t.push(`Generated: ${new Date().toLocaleString()}
793
- `);let s=Ww.basename(e);if(t.push(`## Project: ${s}
828
+ `);let s=rk.basename(e);if(t.push(`## Project: ${s}
794
829
  `),t.push(`## Stack Detected
795
830
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
796
831
  `),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
@@ -803,19 +838,19 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
803
838
  `),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
804
839
  `),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
805
840
  `),r.gitLog.split(`
806
- `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
841
+ `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,l,d]=a.split("|");t.push(`- \`${c}\` ${d} (${l})`)}}),t.push("")),t.push(`## Recommendations
807
842
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
808
843
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
809
- `)}var qm=v(()=>{"use strict";ss();go();Ws();q();vn();Qe();l(Ac,"showSyncResult");l(Gm,"getSessionActivity");l(Pn,"formatTokens");l(Rc,"formatDuration");l(Vm,"generateSparkline");l(Bm,"generateStatsMarkdown");l(Jm,"generateAnalysisSummary")});var zm,Km,Xm=v(()=>{"use strict";zm=["task","done","ship","resume","bug","enrich"],Km=["init","sync","pause","next","dash","history","undo","redo"]});import Xt from"chalk";function Gw(r){return Ym[r.toLowerCase()]||Ym.default}var Ym,Dc,Qm,Zm=v(()=>{"use strict";Ym={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(Gw,"getIcon");Dc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Xt.cyan(`
844
+ `)}var pm=P(()=>{"use strict";cs();Ro();Ys();K();_n();Ze();u(Gc,"showSyncResult");u(cm,"getSessionActivity");u(On,"formatTokens");u(Bc,"formatDuration");u(lm,"generateSparkline");u(um,"generateStatsMarkdown");u(dm,"generateAnalysisSummary")});var mm,gm,fm=P(()=>{"use strict";mm=["task","done","ship","resume","bug","enrich"],gm=["init","sync","pause","next","dash","history","undo","redo"]});import ts from"chalk";function ok(r){return hm[r.toLowerCase()]||hm.default}var hm,Vc,ym,wm=P(()=>{"use strict";hm={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"};u(ok,"getIcon");Vc=class{static{u(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ts.cyan(`
810
845
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
811
- `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Gw(t);console.log(Xt.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(Xt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(Xt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Xt.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?Xt.green("\u2713"):Xt.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${Xt.dim(`(${s})`)}
812
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${Xt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Xt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Qm=new Dc});import ep from"node:fs";import Ho from"node:path";function Vw(r){if(js()){let{Database:n}=kt("bun:sqlite");return new n(r,{create:!0})}let e=kt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ic,Bw,tp=v(()=>{"use strict";ur();l(Vw,"openDatabase");Ic=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ho.resolve(e):Ho.join(kt("node:os").homedir(),".prjct-cli");this.dbPath=Ho.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ho.dirname(this.dbPath);ep.existsSync(e)||ep.mkdirSync(e,{recursive:!0});let t=Vw(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(`
846
+ `))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=ok(t);console.log(ts.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ts.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ts.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ts.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?ts.green("\u2713"):ts.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ts.dim(`(${s})`)}
847
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ts.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ts.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ym=new Vc});import km from"node:fs";import ri from"node:path";function ik(r){if(qs()){let{Database:n}=vt("bun:sqlite");return new n(r,{create:!0})}let e=vt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Jc,ak,Sm=P(()=>{"use strict";vr();u(ik,"openDatabase");Jc=class{static{u(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ri.resolve(e):ri.join(vt("node:os").homedir(),".prjct-cli");this.dbPath=ri.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ri.dirname(this.dbPath);km.existsSync(e)||km.mkdirSync(e,{recursive:!0});let t=ik(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(`
813
848
  CREATE TABLE IF NOT EXISTS _system_migrations (
814
849
  version INTEGER PRIMARY KEY,
815
850
  name TEXT NOT NULL,
816
851
  applied_at TEXT NOT NULL
817
852
  )
818
- `);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(`
853
+ `);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:u(n=>{n.run(`
819
854
  CREATE TABLE mcp_health (
820
855
  provider TEXT PRIMARY KEY,
821
856
  status TEXT NOT NULL,
@@ -830,14 +865,14 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
830
865
  INSERT OR REPLACE INTO mcp_health
831
866
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
832
867
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
833
- `).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)}},Bw=new Ic});import Jw from"node:fs/promises";import sp from"node:os";import Wo from"node:path";function qw(){try{let r=Wo.dirname(kt.resolve("prjct-cli/package.json"));return{command:"node",args:[Wo.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 as(){return process.env.PRJCT_TEST_MODE==="1"?Wo.join(sp.tmpdir(),"prjct-context7-test","mcp.json"):Wo.join(sp.homedir(),".claude","mcp.json")}async function np(r=as()){try{let e=await Jw.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 zw(r,e=as()){await le(e,r)}async function $c(r,e,t=as()){let s=await np(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await zw(s,t),{path:t,changed:i}}async function qs(r,e=as()){return!!(await np(e)).mcpServers?.[r]}var Go,jc,N0,Vo=v(()=>{"use strict";tp();U();B();Go="mcp-remote@0.1.38";l(qw,"getPrjctMcpConfig");jc={prjct:qw(),linear:{command:"npx",args:["-y",Go,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Go,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},N0={linear:`npx -y ${Go} https://mcp.linear.app/mcp`,jira:`npx -y ${Go} https://mcp.atlassian.com/v1/mcp`};l(as,"getClaudeMcpConfigPath");l(np,"readMcpConfig");l(zw,"writeMcpConfig");l($c,"upsertMcpServer");l(qs,"hasMcpServer")});import Ze from"chalk";function Kw(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%rp.length;return rp[t]}function Xw(r,e,t="\u25B6"){let s=Ze.dim(String(r+1).padStart(2)),o=Kw(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=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Yw(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Xw(t,r[t]));return e.push(""),e.join(`
834
- `)}function op(r){console.log(Yw(r))}var rp,ip=v(()=>{"use strict";rp=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(Kw,"getDomainColor");l(Xw,"formatSubtaskLine");l(Yw,"renderSubtaskProgress");l(op,"printSubtaskProgress")});function Zw(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 ek(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Qw)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Zw(t)};return{detected:!1}}function tk(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 sk(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 nk(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 rk(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 Qw,Mc,ok,Cn,ap=v(()=>{"use strict";Qw=[{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(Zw,"getHallucinationSuggestion");l(ek,"detectHallucination");l(tk,"isSimilarError");l(sk,"analyzeErrorPattern");l(nk,"generateEscalationMessage");l(rk,"generateSuggestion");Mc=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=>tk(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=sk(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:nk(e,o,this.maxAttempts),suggestion:rk(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 ek(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}}},ok=new Mc,Cn=ok});function _c(r,e){let t=Ar(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 ik(r,e){let t=Ar(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function ak(r,e,t){let s=Ar(t),n=_c(r,t),o=_c(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Bo(r,e=Ss){let t=Ar(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=ck(r,e),n=lk(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=mk(o),a=uk(o),c=dk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=pk(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function lp(r,e,t=Ss){let s=Ar(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 ck(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=ak(i,n,e);if(!t.has(a)){let c=_c(i,e),u=ik(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function lk(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+gk(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Oc(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 uk(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 dk(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Oc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function mk(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 pk(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Oc(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 Oc(r){if(!r.variance)return 0;let e=St(r.estimatedDuration),t=St(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function up(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(`
835
- `)}function gk(r){if(!r.estimatedDuration)return 0;let e=St(r.estimatedDuration);if(e<=0)return 0;let t=cp[0],s=Number.POSITIVE_INFINITY;for(let n of cp){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Ar(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var cp,Nc=v(()=>{"use strict";gr();kr();q();l(_c,"getSprintStart");l(ik,"getSprintEnd");l(ak,"getSprintNumber");l(Bo,"calculateVelocity");l(lp,"projectCompletion");l(ck,"bucketBySprint");l(lk,"buildSprintVelocities");l(uk,"detectTrend");l(dk,"calculateOverallAccuracy");l(mk,"calculateAverageVelocity");l(pk,"detectEstimationPatterns");l(Oc,"parseVariancePercent");l(up,"formatVelocityContext");cp=[{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(gk,"derivePoints");l(Ar,"resolveConfig")});import fk from"node:fs/promises";import Jo from"node:path";async function xn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Lc(r),c=await kk(e),u=await Sk(e),d=[];for(let p of c){if(!i&&Tk(p))continue;let g=bk(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,n);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Lc(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 kk(r){let e=[];async function t(s,n=""){try{let o=await fk.readdir(s,{withFileTypes:!0});for(let i of o){let a=Jo.join(s,i.name),c=Jo.join(n,i.name);if(i.isDirectory()){if(wk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Jo.extname(i.name).toLowerCase();yk.has(u)&&e.push(c)}}}catch(o){D(o)}}return l(t,"walk"),await t(r),e}async function Sk(r){let e=new Map;try{let{stdout:t}=await _(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
868
+ `).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)}},ak=new Jc});import ck from"node:fs/promises";import bm from"node:os";import oi from"node:path";function lk(){try{let r=oi.dirname(vt.resolve("prjct-cli/package.json"));return{command:"node",args:[oi.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 fs(){return process.env.PRJCT_TEST_MODE==="1"?oi.join(bm.tmpdir(),"prjct-context7-test","mcp.json"):oi.join(bm.homedir(),".claude","mcp.json")}async function Tm(r=fs()){try{let e=await ck.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)}`)}}async function uk(r,e=fs()){await le(e,r)}async function Kc(r,e,t=fs()){let s=await Tm(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await uk(s,t),{path:t,changed:i}}async function tn(r,e=fs()){return!!(await Tm(e)).mcpServers?.[r]}var ii,zc,e0,ai=P(()=>{"use strict";Sm();W();B();ii="mcp-remote@0.1.38";u(lk,"getPrjctMcpConfig");zc={prjct:lk(),linear:{command:"npx",args:["-y",ii,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ii,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},e0={linear:`npx -y ${ii} https://mcp.linear.app/mcp`,jira:`npx -y ${ii} https://mcp.atlassian.com/v1/mcp`};u(fs,"getClaudeMcpConfigPath");u(Tm,"readMcpConfig");u(uk,"writeMcpConfig");u(Kc,"upsertMcpServer");u(tn,"hasMcpServer")});import nt from"chalk";function dk(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%vm.length;return vm[t]}function pk(r,e,t="\u25B6"){let s=nt.dim(String(r+1).padStart(2)),o=dk(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=nt.green("\u2713 Complete");break;case"in_progress":a=nt.yellow(`${t} Working...`);break;case"pending":a=nt.gray("\u25CB Pending");break;case"failed":a=nt.red("\u2717 Failed");break;case"blocked":a=nt.gray("\u2298 Blocked");break;default:a=nt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function mk(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${nt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${nt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(pk(t,r[t]));return e.push(""),e.join(`
869
+ `)}function Em(r){console.log(mk(r))}var vm,Pm=P(()=>{"use strict";vm=[nt.cyan,nt.magenta,nt.yellow,nt.blue,nt.green,nt.redBright,nt.magentaBright,nt.cyanBright];u(dk,"getDomainColor");u(pk,"formatSubtaskLine");u(mk,"renderSubtaskProgress");u(Em,"printSubtaskProgress")});function fk(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 hk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of gk)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:fk(t)};return{detected:!1}}function yk(r,e){if(!r||!e)return!1;let t=u(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function wk(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 kk(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 Sk(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 gk,Xc,bk,Nn,Cm=P(()=>{"use strict";gk=[{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"}];u(fk,"getHallucinationSuggestion");u(hk,"detectHallucination");u(yk,"isSimilarError");u(wk,"analyzeErrorPattern");u(kk,"generateEscalationMessage");u(Sk,"generateSuggestion");Xc=class{static{u(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=>yk(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=wk(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:kk(e,o,this.maxAttempts),suggestion:Sk(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 hk(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}}},bk=new Xc,Nn=bk});function Yc(r,e){let t=Lr(e),s=rd[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 Tk(r,e){let t=Lr(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function vk(r,e,t){let s=Lr(t),n=Yc(r,t),o=Yc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function ci(r,e=As){let t=Lr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Ek(r,e),n=Pk(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=Rk(o),a=Ck(o),c=xk(r,t.accuracyTolerance),{overEstimated:l,underEstimated:d}=Ak(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:l,underEstimated:d,lastUpdated:new Date().toISOString()}}function Rm(r,e,t=As){let s=Lr(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 Ek(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=vk(i,n,e);if(!t.has(a)){let c=Yc(i,e),l=Tk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:l,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Pk(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((l,d)=>l+jk(d),0),o=s.outcomes.filter(l=>l.variance).map(l=>Qc(l)),i=o.length>0?Math.round(o.reduce((l,d)=>l+d,0)/o.length):0,a=o.filter(l=>Math.abs(l)<=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 Ck(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 l=a/c;return l>.1?"improving":l<-.1?"declining":"stable"}function xk(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Qc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Rk(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 Ak(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Qc(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 Qc(r){if(!r.variance)return 0;let e=Et(r.estimatedDuration),t=Et(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Am(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(`
870
+ `)}function jk(r){if(!r.estimatedDuration)return 0;let e=Et(r.estimatedDuration);if(e<=0)return 0;let t=xm[0],s=Number.POSITIVE_INFINITY;for(let n of xm){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Lr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var xm,Zc=P(()=>{"use strict";xr();Dr();K();u(Yc,"getSprintStart");u(Tk,"getSprintEnd");u(vk,"getSprintNumber");u(ci,"calculateVelocity");u(Rm,"projectCompletion");u(Ek,"bucketBySprint");u(Pk,"buildSprintVelocities");u(Ck,"detectTrend");u(xk,"calculateOverallAccuracy");u(Rk,"calculateAverageVelocity");u(Ak,"detectEstimationPatterns");u(Qc,"parseVariancePercent");u(Am,"formatVelocityContext");xm=[{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}];u(jk,"derivePoints");u(Lr,"resolveConfig")});import Dk from"node:fs/promises";import li from"node:path";async function Ln(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=el(r),c=await Mk(e),l=await Ok(e),d=[];for(let m of c){if(!i&&Lk(m))continue;let g=Nk(m,a,l,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 el(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 Mk(r){let e=[];async function t(s,n=""){try{let o=await Dk.readdir(s,{withFileTypes:!0});for(let i of o){let a=li.join(s,i.name),c=li.join(n,i.name);if(i.isDirectory()){if(_k.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let l=li.extname(i.name).toLowerCase();$k.has(l)&&e.push(c)}}}catch(o){j(o)}}return u(t,"walk"),await t(r),e}async function Ok(r){let e=new Map;try{let{stdout:t}=await O(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
836
871
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
837
872
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
838
873
  END { for (f in files) print files[f], lastmod[f], f }
839
874
  '`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
840
- `).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 bk(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let k of e){d.includes(k)&&(o+=.3,n.push(`keyword:${k}`));for(let E of m)if(E.includes(k)||k.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[k,E]of Object.entries(hk))for(let R of E)if(d.includes(R)&&e.some(z=>E.includes(z)||z.includes(k)||k.includes(z))){i+=.4,n.push(`domain:${k}`);break}i=Math.min(1,i);let p=t.get(r);p&&(p.daysAgo<=1?(a=1,n.push("recent:1d")):p.daysAgo<=3?(a=.8,n.push("recent:3d")):p.daysAgo<=7?(a=.6,n.push("recent:1w")):p.daysAgo<=30&&(a=.3,n.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=Jo.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(k=>k.startsWith("import:"))||n.push("import:1")),s){let k=s.get(r);k!==void 0&&(u=(k+1)/2,k>0?n.push("history:boosted"):k<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function Tk(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 hk,yk,wk,qo=v(()=>{"use strict";U();Le();hk={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"]},yk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),wk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(xn,"findRelevantFiles");l(Lc,"extractKeywords");l(kk,"getAllCodeFiles");l(Sk,"getGitRecency");l(bk,"scoreFile");l(Tk,"isTestFile")});async function dp(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 Pk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Ek(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 Ek(r,e){let{stdout:t}=await _(`git log -${e} --pretty=format:"%ct" --name-only | awk '
875
+ `).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),l=i[3],d=Math.floor((s-c)/86400);e.set(l,{commits:a,daysAgo:d})}}}catch{}return e}function Nk(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,l=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let y of e){d.includes(y)&&(o+=.3,n.push(`keyword:${y}`));for(let E of p)if(E.includes(y)||y.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[y,E]of Object.entries(Ik))for(let A of E)if(d.includes(A)&&e.some(J=>E.includes(J)||J.includes(y)||y.includes(J))){i+=.4,n.push(`domain:${y}`);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=li.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(y=>y.startsWith("import:"))||n.push("import:1")),s){let y=s.get(r);y!==void 0&&(l=(y+1)/2,y>0?n.push("history:boosted"):y<0&&n.push("history:penalized"))}let S=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+l*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,S),reasons:[...new Set(n)]}}function Lk(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 Ik,$k,_k,ui=P(()=>{"use strict";W();We();Ik={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"]},$k=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),_k=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);u(Ln,"findRelevantFiles");u(el,"extractKeywords");u(Mk,"getAllCodeFiles");u(Ok,"getGitRecency");u(Nk,"scoreFile");u(Lk,"isTestFile")});async function jm(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 Hk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Uk(r,t);return o=o.filter(c=>!Wk(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 Uk(r,e){let{stdout:t}=await O(`git log -${e} --pretty=format:"%ct" --name-only | awk '
841
876
  /^[0-9]+$/ { timestamp=$1; next }
842
877
  NF {
843
878
  count[$0]++
@@ -847,8 +882,8 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
847
882
  for (f in count) print count[f], lastmod[f], f
848
883
  }
849
884
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
850
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),h=Math.floor(p/3600),b=Math.max(0,1-g/30),k=u/i,E=b*.6+k*.4,R;h<1?R="just now":h<24?R=`${h}h ago`:g<7?R=`${g}d ago`:g<30?R=`${Math.floor(g/7)}w ago`:R=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(E*100)/100,lastChanged:R,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Pk(r){let e="main";try{await _("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await _(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
851
- `).filter(Boolean),{stdout:n}=await _(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
885
+ `).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 l=parseInt(c[1],10);l>i&&(i=l)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let l=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),y=l/i,E=S*.6+y*.4,A;h<1?A="just now":h<24?A=`${h}h ago`:g<7?A=`${g}d ago`:g<30?A=`${Math.floor(g/7)}w ago`:A=`${Math.floor(g/30)}mo ago`,s.push({path:p,changes:l,heatScore:Math.round(E*100)/100,lastChanged:A,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Hk(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(`
886
+ `).filter(Boolean),{stdout:n}=await O(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
852
887
  /^[0-9]+$/ { timestamp=$1; next }
853
888
  NF {
854
889
  count[$0]++
@@ -858,15 +893,15 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
858
893
  for (f in count) print count[f], lastmod[f], f
859
894
  }
860
895
  '`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
861
- `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],h=a-p,b=Math.floor(h/86400),k=Math.floor(h/3600),E=Math.max(0,1-b/14),R=m/c,W=E*.5+R*.5,z;k<1?z="just now":k<24?z=`${k}h ago`:z=`${b}d ago`,o.push({path:g,changes:m,heatScore:Math.round(W*100)/100,lastChanged:z,lastChangedAt:new Date(p*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 vk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var vk,mp=v(()=>{"use strict";Le();vk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(dp,"getRecentFiles");l(Ek,"getHotFilesFromCommits");l(Pk,"getBranchOnlyFiles");l(Ck,"shouldIgnore")});function Fc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function pp(r,e){let t=xk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Rk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function fp(r,e){let t=Fc(r),s=Fc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=pp(n,Ak),a=gp.map(c=>({model:c,...pp(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Rk(i.total),byModel:a}}}function zo(r){let e=Fc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:gp.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var xk,Ak,gp,hp=v(()=>{"use strict";wo();xk={"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}},Ak="claude-sonnet-4.5";l(Fc,"countTokens");gp=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(pp,"calculateModelCost");l(Rk,"formatCostSaved");l(fp,"measureCompression");l(zo,"noCompression")});import Dk from"node:fs/promises";import An from"node:path";async function kp(r,e=process.cwd()){let t=An.isAbsolute(r)?r:An.join(e,r),s=An.resolve(e),n=An.resolve(t);if(!n.startsWith(s+An.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:zo("")};let o;try{o=await Dk.readFile(t,"utf-8")}catch(m){if(D(m))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:zo("")};throw m}let i=An.extname(r).toLowerCase(),a=Ik[i]||"unknown",c=_k[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:zo(o)};let u=Ok(o,c),d=u.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
862
- `);return{file:r,language:a,signatures:u,fallback:!1,metrics:fp(o,d)}}function Ok(r,e){let t=[],s=r.split(`
863
- `),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(`
864
- `).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:Nk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Nk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Ik,yp,jk,$k,Mk,wp,_k,Sp=v(()=>{"use strict";U();hp();Ik={".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"},yp=[{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}],jk=[{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}],$k=[{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}],Mk=[{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}],wp=[{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}],_k={typescript:yp,javascript:yp,python:jk,go:$k,rust:Mk,java:wp,csharp:wp,php:[],ruby:[],unknown:[]};l(kp,"extractSignatures");l(Ok,"extractFromContent");l(Nk,"cleanSignature")});import Uc from"node:path";var Lk,Fk,Hc,Uk,yt,Rn=v(()=>{"use strict";ye();vt();q();B();Lk="outcomes",Fk="outcomes.jsonl",Hc=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Uc.join(t,Lk)}getOutcomesPath(e){return Uc.join(this.getOutcomesDir(e),Fk)}async record(e,t){let s={...t,id:J()},n=this.getOutcomesPath(e);return await Ve(Uc.dirname(n)),await eu(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await Ie(t);if(!a.trim())return[];let c=a.trim().split(`
865
- `).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await Ie(t);return s.trim()?s.trim().split(`
866
- `).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=on(n.variance),i=St(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Uk=new Hc,yt=Uk});import{z as Me}from"zod";var Ko,Dn,Hk,bI,Wc,bp,Xo=v(()=>{"use strict";Ko=Me.string(),Dn=Me.object({primaryDomain:Ko,secondaryDomains:Me.array(Ko),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),Hk=Me.object({classification:Dn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),bI=Me.object({entries:Me.record(Me.string(),Hk),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Dn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Wc={entries:{},confirmedPatterns:[]},bp={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Gk from"node:fs/promises";import Ep from"node:path";function Tp(r){return $s(r.toLowerCase().trim())}async function vp(r){try{let e=Ep.join(r,"storage","classification-cache.json"),t=await Gk.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e)?Wc:(console.warn("[classifier] Failed to load cache:",y(e)),Wc)}}async function Vk(r,e){try{let t=Ep.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function Bk(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||gs(s.classifiedAt,36e5)?null:s.classification}function Jk(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Gc,qk,Pp,Cp=v(()=>{"use strict";ar();Xo();U();Rs();B();Ms();l(Tp,"hashDescription");l(vp,"loadCache");l(Vk,"saveCache");l(Bk,"lookupCache");l(Jk,"lookupPatterns");Gc=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Tp(e),o=await vp(s),i=Bk(o,n,t);if(i)return{classification:i,source:"cache"};let a=Jk(o,n);return a?{classification:a,source:"history"}:{classification:bp,source:"heuristic"}}async confirmClassification(e,t,s){let n=Tp(e),o=await vp(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Vk(s,o))}},qk=new Gc,Pp=qk});import zk from"node:fs/promises";import Kk from"node:path";var Vc,Xk,Yo,Bc=v(()=>{"use strict";Nc();Ce();ye();kr();yn();fr();ft();qo();mp();Sp();U();Le();Rn();Cp();Vc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await j.getProjectId(s),o=A.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],m=[],p=u.map((z,w)=>{if(z.status==="fulfilled")return z.value;m.push(d[w]),console.warn(`Context tool "${d[w]}" failed: ${y(z.reason)}`)}),[g,h,b]=p,k={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},E=this.shouldFragment(a,t),R=null;E&&e==="task"&&(R=await this.createSubtasks(t,a,[],n));let W=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:E,subtasks:R,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:b??null,contextDegradation:k,rpiContext:W}}resolveRpiPhase(e){try{let{prjctDb:t}=(te(),at(to)),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),xn(e,t,{maxFiles:10,minScore:.15}),dp(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await kp(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
867
- `);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([_("git branch --show-current",{cwd:e}),_("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
868
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=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 qe.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 yt.getAll(e);if(t.length===0)return null;let s=Bo(t,Ss);return s.sprints.length===0?null:up(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kk.join(e,"analysis","repo-analysis.json"),s=await zk.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return D(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let n=A.getGlobalProjectPath(t),{classification:o}=await Pp.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,m=i.get(c)||[],p=m.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:p?"in_progress":"pending",dependsOn:m,order:u+1}});return await O.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Xk=new Vc,Yo=Xk});function Yk(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,Qk,He,xp=v(()=>{"use strict";vt();q();Fs();Fs();l(Yk,"generateApprovalPrompt");Jc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ga.includes(e)}isDestructive(e){return Va.includes(e)}isToolAllowedInPlanning(e){return Po.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Po.includes(s)):t}startPlanning(e,t,s){let n={id:J(),projectId:e,command:t,params:s,status:re.GATHERING,startedAt:S(),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?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:S()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===re.APPROVED?s.approvedAt=S():t===re.EXECUTING?s.executionStartedAt=S():(t===re.COMPLETED||t===re.ABORTED)&&(s.completedAt=S()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=re.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=re.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!==re.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=re.APPROVED,s.approvedAt=S(),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=re.REJECTED,s.userFeedback=t,s.completedAt=S(),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!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=S(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.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!==re.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=S(),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=re.COMPLETED,t.completedAt=S();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=re.ABORTED,s.completedAt=S(),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 Yk(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
869
- `)}_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`}},Qk=new Jc,He=Qk});var qc,Zk,Ap,Rp=v(()=>{"use strict";q();Rn();qc=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await yt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,n=await yt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await yt.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,k)=>b+k.qualityScore,0)/a,m=i.filter(b=>{if(!b.variance)return!1;let k=on(b.variance),E=St(b.estimatedDuration);return E===0?!1:Math.abs(k)/E<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let b of i.filter(k=>k.completedAsPlanned))for(let k of b.tags||[])g.set(k,(g.get(k)||0)+1);let h=[...g.entries()].sort((b,k)=>k[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:h})}return n}async detectPatterns(e){let t=await yt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>on(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=>on(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 yt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+St(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}},Zk=new qc,Ap=Zk});var Mp={};Jt(Mp,{AgentAssignmentSchema:()=>Dp,OUTPUT_SCHEMAS:()=>jp,SubtaskBreakdownSchema:()=>Ip,TaskClassificationSchema:()=>Dn,renderSchemaForPrompt:()=>eS});import{z as ze}from"zod";function eS(r){let e=jp[r];return e?`## OUTPUT FORMAT
896
+ `).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let l of i){let d=l.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let l of i){let d=l.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),y=Math.floor(h/3600),E=Math.max(0,1-S/14),A=p/c,F=E*.5+A*.5,J;y<1?J="just now":y<24?J=`${y}h ago`:J=`${S}d ago`,o.push({path:g,changes:p,heatScore:Math.round(F*100)/100,lastChanged:J,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((l,d)=>d.heatScore-l.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function Wk(r){let e=r.split("/").pop()||"";for(let t of Fk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Fk,Dm=P(()=>{"use strict";We();Fk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];u(jm,"getRecentFiles");u(Uk,"getHotFilesFromCommits");u(Hk,"getBranchOnlyFiles");u(Wk,"shouldIgnore")});function tl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Im(r,e){let t=qk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Bk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function _m(r,e){let t=tl(r),s=tl(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Im(n,Gk),a=$m.map(c=>({model:c,...Im(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Bk(i.total),byModel:a}}}function di(r){let e=tl(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:$m.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var qk,Gk,$m,Mm=P(()=>{"use strict";$o();qk={"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}},Gk="claude-sonnet-4.5";u(tl,"countTokens");$m=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];u(Im,"calculateModelCost");u(Bk,"formatCostSaved");u(_m,"measureCompression");u(di,"noCompression")});import Vk from"node:fs/promises";import Fn from"node:path";async function Lm(r,e=process.cwd()){let t=Fn.isAbsolute(r)?r:Fn.join(e,r),s=Fn.resolve(e),n=Fn.resolve(t);if(!n.startsWith(s+Fn.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:di("")};let o;try{o=await Vk.readFile(t,"utf-8")}catch(p){if(j(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:di("")};throw p}let i=Fn.extname(r).toLowerCase(),a=Jk[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:di(o)};let l=Qk(o,c),d=l.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
897
+ `);return{file:r,language:a,signatures:l,fallback:!1,metrics:_m(o,d)}}function Qk(r,e){let t=[],s=r.split(`
898
+ `),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 l=i.index,d=r.substring(0,l).split(`
899
+ `).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:Zk(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function Zk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Jk,Om,zk,Kk,Xk,Nm,Yk,Fm=P(()=>{"use strict";W();Mm();Jk={".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"},Om=[{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}],zk=[{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}],Kk=[{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}],Xk=[{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}],Nm=[{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:Om,javascript:Om,python:zk,go:Kk,rust:Xk,java:Nm,csharp:Nm,php:[],ruby:[],unknown:[]};u(Lm,"extractSignatures");u(Qk,"extractFromContent");u(Zk,"cleanSignature")});import sl from"node:path";var eS,tS,nl,sS,St,Un=P(()=>{"use strict";Se();xt();K();B();eS="outcomes",tS="outcomes.jsonl",nl=class{static{u(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=R.getGlobalProjectPath(e);return sl.join(t,eS)}getOutcomesPath(e){return sl.join(this.getOutcomesDir(e),tS)}async record(e,t){let s={...t,id:z()},n=this.getOutcomesPath(e);return await Ke(sl.dirname(n)),await ku(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await _e(t);if(!a.trim())return[];let c=a.trim().split(`
900
+ `).filter(l=>l.trim()).map(l=>JSON.parse(l));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await _e(t);return s.trim()?s.trim().split(`
901
+ `).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=fn(n.variance),i=Et(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},sS=new nl,St=sS});import{z as Ne}from"zod";var pi,Hn,nS,L0,rl,Um,mi=P(()=>{"use strict";pi=Ne.string(),Hn=Ne.object({primaryDomain:pi,secondaryDomains:Ne.array(pi),confidence:Ne.number().min(0).max(1),filePatterns:Ne.array(Ne.string()),relevantAgents:Ne.array(Ne.string())}),nS=Ne.object({classification:Hn,classifiedAt:Ne.string(),source:Ne.enum(["cache","history","llm","heuristic"]),descriptionHash:Ne.string(),projectId:Ne.string()}),L0=Ne.object({entries:Ne.record(Ne.string(),nS),confirmedPatterns:Ne.array(Ne.object({descriptionHash:Ne.string(),classification:Hn,confirmedAt:Ne.string(),taskDescription:Ne.string()}))}),rl={entries:{},confirmedPatterns:[]},Um={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import oS from"node:fs/promises";import qm from"node:path";function Hm(r){return Gs(r.toLowerCase().trim())}async function Wm(r){try{let e=qm.join(r,"storage","classification-cache.json"),t=await oS.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return j(e)?rl:(console.warn("[classifier] Failed to load cache:",w(e)),rl)}}async function iS(r,e){try{let t=qm.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function aS(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||bs(s.classifiedAt,36e5)?null:s.classification}function cS(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var ol,lS,Gm,Bm=P(()=>{"use strict";Sr();mi();W();Us();B();Bs();u(Hm,"hashDescription");u(Wm,"loadCache");u(iS,"saveCache");u(aS,"lookupCache");u(cS,"lookupPatterns");ol=class{static{u(this,"DomainClassifier")}async classify(e,t,s){let n=Hm(e),o=await Wm(s),i=aS(o,n,t);if(i)return{classification:i,source:"cache"};let a=cS(o,n);return a?{classification:a,source:"history"}:{classification:Um,source:"heuristic"}}async confirmClassification(e,t,s){let n=Hm(e),o=await Wm(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await iS(s,o))}},lS=new ol,Gm=lS});import uS from"node:fs/promises";import dS from"node:path";var il,pS,gi,al=P(()=>{"use strict";Zc();Ae();Se();Dr();Cn();xn();ft();ui();Dm();Fm();W();We();Un();Bm();il=class{static{u(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await I.getProjectId(s),o=R.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),l=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=l.map((J,k)=>{if(J.status==="fulfilled")return J.value;p.push(d[k]),console.warn(`Context tool "${d[k]}" failed: ${w(J.reason)}`)}),[g,h,S]=m,y={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},E=this.shouldFragment(a,t),A=null;E&&e==="task"&&(A=await this.createSubtasks(t,a,[],n));let F=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:E,subtasks:A,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:S??null,contextDegradation:y,rpiContext:F}}resolveRpiPhase(e){try{let{prjctDb:t}=(Y(),lt(ho)),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),Ln(e,t,{maxFiles:10,minScore:.15}),jm(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let l=await Lm(c.path,t);if(l.signatures.length===0)return null;let d=l.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
902
+ `);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([O("git branch --show-current",{cwd:e}),O("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
903
+ `).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 l=[];c>0&&l.push(`${c} staged`),i>0&&l.push(`${i} modified`),a>0&&l.push(`${a} untracked`);let d=l.length>0?l.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Wt.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 Qe.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 St.getAll(e);if(t.length===0)return null;let s=ci(t,As);return s.sprints.length===0?null:Am(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=dS.join(e,"analysis","repo-analysis.json"),s=await uS.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return j(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,s){let n=R.getGlobalProjectPath(t),{classification:o}=await Gm.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,l)=>{let d=`${c}.md`,p=i.get(c)||[],m=p.length===0&&l===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${l+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:m?"in_progress":"pending",dependsOn:p,order:l+1}});return await M.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let l=s[c];if(e.includes(l)){let d=n.get(l);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(l=>!n.has(l.id)&&l.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},pS=new il,gi=pS});function mS(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 cl,gS,Ge,Vm=P(()=>{"use strict";xt();K();Ks();Ks();u(mS,"generateApprovalPrompt");cl=class{static{u(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return oc.includes(e)}isDestructive(e){return ic.includes(e)}isToolAllowedInPlanning(e){return Uo.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Uo.includes(s)):t}startPlanning(e,t,s){let n={id:z(),projectId:e,command:t,params:s,status:ae.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?[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:b()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ae.APPROVED?s.approvedAt=b():t===ae.EXECUTING?s.executionStartedAt=b():(t===ae.COMPLETED||t===ae.ABORTED)&&(s.completedAt=b()))}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=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=ae.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!==ae.APPROVED?null:(t.status=ae.EXECUTING,t.executionStartedAt=b(),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=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=ae.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=ae.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 mS(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(`
904
+ `)}_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`}},gS=new cl,Ge=gS});var ll,fS,Jm,zm=P(()=>{"use strict";K();Un();ll=class{static{u(this,"OutcomeAnalyzer")}async summarize(e){let t=await St.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 St.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 St.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),l=Math.round(c.length/a*100),d=i.reduce((S,y)=>S+y.qualityScore,0)/a,p=i.filter(S=>{if(!S.variance)return!1;let y=fn(S.variance),E=Et(S.estimatedDuration);return E===0?!1:Math.abs(y)/E<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let S of i.filter(y=>y.completedAsPlanned))for(let y of S.tags||[])g.set(y,(g.get(y)||0)+1);let h=[...g.entries()].sort((S,y)=>y[1]-S[1]).slice(0,3).map(([S])=>S);n.push({agent:o,tasksCompleted:a,successRate:l,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:h})}return n}async detectPatterns(e){let t=await St.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>fn(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=>fn(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 l of c.blockers||[])i.set(l,(i.get(l)||0)+1);for(let[c,l]of i)l>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:l/t.length,occurrences:l,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,l)=>l.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await St.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+Et(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}},fS=new ll,Jm=fS});var Zm={};Lt(Zm,{AgentAssignmentSchema:()=>Km,OUTPUT_SCHEMAS:()=>Ym,SubtaskBreakdownSchema:()=>Xm,TaskClassificationSchema:()=>Hn,renderSchemaForPrompt:()=>hS});import{z as et}from"zod";function hS(r){let e=Ym[r];return e?`## OUTPUT FORMAT
870
905
 
871
906
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
872
907
 
@@ -875,10 +910,10 @@ ${e.example}
875
910
  \`\`\`
876
911
 
877
912
  Fields:
878
- ${tS(e.schema)}`:null}function tS(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${$p(s)}`).join(`
879
- `)}return"(see example above)"}function $p(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 ${$p(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var Dp,Ip,jp,_p=v(()=>{"use strict";Xo();Xo();Dp=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),Ip=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:Ko,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),jp={classification:{schema:Dn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Dp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Ip,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(eS,"renderSchemaForPrompt");l(tS,"describeSchema");l($p,"describeField")});import Op from"node:fs/promises";import In from"node:path";function Qo(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
880
- ... (truncated to ~${e} tokens)`}function Np(r){return Math.ceil(r.length/4)}var zc,Kc,Xc,sS,Lp,Fp=v(()=>{"use strict";wo();Ht();ft();U();B();It();Rp();Os();zc={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Qo,"truncateToTokenBudget");l(Np,"estimateTokens");Kc=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...zc,...e}}addSection(e,t){let s=Qo(e,t),n=Np(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Qo(s,o);return this.used+=Np(i),i}return this.used+=n,s}},Xc=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await Op.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){D(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=gt(`global/modules/${e}`);if(t)return t;let s=In.join(lt,"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=gn("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=gt(n);if(o){let i=In.basename(n,".md");t[i]=o}}}else{let n=In.join(lt,"templates","checklists");if(await C(n)){let o=(await Op.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=In.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){D(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([O.read(e),pe.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(D(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 Ap.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){!D(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let n=s.join(`
881
- `);return Qo(n,zc.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=In.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let m=d?.skipNativeContext??!1,p=d?.mcpActive??!1,g=[],h=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
913
+ ${yS(e.schema)}`:null}function yS(r){if(r instanceof et.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Qm(s)}`).join(`
914
+ `)}return"(see example above)"}function Qm(r){return r instanceof et.ZodString?"string":r instanceof et.ZodNumber?"number":r instanceof et.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof et.ZodArray?`array of ${Qm(r.element)}`:r instanceof et.ZodObject?"object":"any"}var Km,Xm,Ym,eg=P(()=>{"use strict";mi();mi();Km=et.object({agentName:et.string(),reasoning:et.string(),confidence:et.number().min(0).max(1)}),Xm=et.object({subtasks:et.array(et.object({description:et.string(),domain:pi,agent:et.string(),dependsOn:et.array(et.number())})),effort:et.enum(["low","medium","high"])}),Ym={classification:{schema:Hn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Km,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Xm,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)}};u(hS,"renderSchemaForPrompt");u(yS,"describeSchema");u(Qm,"describeField")});import tg from"node:fs/promises";import Wn from"node:path";function fi(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
915
+ ... (truncated to ~${e} tokens)`}function sg(r){return Math.ceil(r.length/4)}var ul,dl,pl,wS,ng,rg=P(()=>{"use strict";$o();Nt();ft();W();B();_t();zm();Js();ul={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};u(fi,"truncateToTokenBudget");u(sg,"estimateTokens");dl=class{static{u(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...ul,...e}}addSection(e,t){let s=fi(e,t),n=sg(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=fi(s,o);return this.used+=sg(i),i}return this.used+=n,s}},pl=class{static{u(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await tg.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){j(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}resetContext(){}setContext(e){}async loadModule(e){let t=kt(`global/modules/${e}`);if(t)return t;let s=Wn.join(dt,"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=vn("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=kt(n);if(o){let i=Wn.basename(n,".md");t[i]=o}}}else{let n=Wn.join(dt,"templates","checklists");if(await C(n)){let o=(await tg.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Wn.join(n,i),l=await this.getTemplate(c);l&&(t[a]=l)}}}}catch(s){j(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([M.read(e),re.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(j(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 Jm.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){!j(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}s.push("---"),s.push("");let n=s.join(`
916
+ `);return fi(n,ul.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=Wn.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 l=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&l.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return l.push(d),l.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,l=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}
882
917
  `),n.role&&g.push(`Role: ${n.role}
883
918
  `),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
884
919
  `),g.push(`
@@ -886,40 +921,40 @@ Apply specialized expertise. Read agent file for details if needed.
886
921
 
887
922
  `)),g.push(`TASK: ${e.frontmatter.description}
888
923
  `),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
889
- `);let k=t;(k.params?.task||k.params?.description)&&g.push(`INPUT: ${k.params.task||k.params.description}
890
- `);let E=t.projectPath;if(E){let M=[`project: ${In.basename(E)}`,`path: ${E}`,"git: true"];u?.realContext?.gitBranch&&M.push(`branch: ${u.realContext.gitBranch}`),M.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
924
+ `);let y=t;(y.params?.task||y.params?.description)&&g.push(`INPUT: ${y.params.task||y.params.description}
925
+ `);let E=t.projectPath;if(E){let D=[`project: ${Wn.basename(E)}`,`path: ${E}`,"git: true"];l?.realContext?.gitBranch&&D.push(`branch: ${l.realContext.gitBranch}`),D.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
891
926
  <env>
892
- ${M.join(`
927
+ ${D.join(`
893
928
  `)}
894
929
  </env>
895
- `)}if(u){let w=u.sealedAnalysis;if(g.push(`
930
+ `)}if(l){let k=l.sealedAnalysis;if(g.push(`
896
931
  ## PROJECT ANALYSIS (Sealed)
897
- `),g.push(`**Ecosystem**: ${u.project.ecosystem}
898
- `),g.push(`**Primary Domain**: ${u.primaryDomain}
899
- `),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
900
- `),w&&(w.languages?.length>0&&g.push(`**Languages**: ${w.languages.join(", ")}
901
- `),w.frameworks?.length>0&&g.push(`**Frameworks**: ${w.frameworks.join(", ")}
902
- `),w.packageManager&&g.push(`**Package Manager**: ${w.packageManager}
903
- `),w.sourceDir&&g.push(`**Source Dir**: ${w.sourceDir}
904
- `),w.testDir&&g.push(`**Test Dir**: ${w.testDir}
905
- `),g.push(`**Files Analyzed**: ${w.fileCount}
906
- `),g.push(`**Analysis Status**: ${w.status}${w.commitHash?` (commit: ${w.commitHash.slice(0,8)})`:""}
907
- `),!m)){if(w.patterns?.length>0){g.push(`
932
+ `),g.push(`**Ecosystem**: ${l.project.ecosystem}
933
+ `),g.push(`**Primary Domain**: ${l.primaryDomain}
934
+ `),g.push(`**Domains**: ${l.detectedDomains.join(", ")}
935
+ `),k&&(k.languages?.length>0&&g.push(`**Languages**: ${k.languages.join(", ")}
936
+ `),k.frameworks?.length>0&&g.push(`**Frameworks**: ${k.frameworks.join(", ")}
937
+ `),k.packageManager&&g.push(`**Package Manager**: ${k.packageManager}
938
+ `),k.sourceDir&&g.push(`**Source Dir**: ${k.sourceDir}
939
+ `),k.testDir&&g.push(`**Test Dir**: ${k.testDir}
940
+ `),g.push(`**Files Analyzed**: ${k.fileCount}
941
+ `),g.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
942
+ `),!p)){if(k.patterns?.length>0){g.push(`
908
943
  ### Code Patterns (Follow These)
909
- `);for(let M of w.patterns)g.push(`- **${M.name}**: ${M.description}${M.location?` (${M.location})`:""}
910
- `)}if(w.antiPatterns?.length>0){g.push(`
944
+ `);for(let D of k.patterns)g.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
945
+ `)}if(k.antiPatterns?.length>0){g.push(`
911
946
  ### Anti-Patterns (Avoid These)
912
- `);for(let M of w.antiPatterns)g.push(`- **${M.issue}** in \`${M.file}\` \u2014 ${M.suggestion}
947
+ `);for(let D of k.antiPatterns)g.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
913
948
  `)}}g.push(`
914
- `)}if(!m){let w=s?.codePatterns||"";if(b.patterns&&w&&w.trim()){let N=this.extractPatternSummary(w);N&&(g.push(`## CODE PATTERNS
949
+ `)}if(!p){let k=s?.codePatterns||"";if(S.patterns&&k&&k.trim()){let N=this.extractPatternSummary(k);N&&(g.push(`## CODE PATTERNS
915
950
  `),g.push(N),g.push(`
916
951
  Full patterns: Read analysis/patterns.md
917
- `))}let M=s?.analysis||"";if(b.patterns&&M&&M.trim()){let N=M.match(/Stack[:\s]+([^\n]+)/i)||M.match(/Technology[:\s]+([^\n]+)/i),fe=N?N[1].trim():"detected";g.push(`
952
+ `))}let D=s?.analysis||"";if(S.patterns&&D&&D.trim()){let N=D.match(/Stack[:\s]+([^\n]+)/i)||D.match(/Technology[:\s]+([^\n]+)/i),we=N?N[1].trim():"detected";g.push(`
918
953
  ## STACK
919
- Stack: ${fe}
920
- `),w||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
921
- `)}}if(b.modules.length>0)for(let w of b.modules){let M=await this.loadModule(w);M&&(g.push(`
922
- `),g.push(M))}if(c?.isPlanning&&(g.push(`
954
+ Stack: ${we}
955
+ `),k||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
956
+ `)}}if(S.modules.length>0)for(let k of S.modules){let D=await this.loadModule(k);D&&(g.push(`
957
+ `),g.push(D))}if(c?.isPlanning&&(g.push(`
923
958
  ## PLAN MODE
924
959
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
925
960
  `),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
@@ -929,112 +964,112 @@ Show changes, list affected files, ask for confirmation.
929
964
  `),E){g.push(`
930
965
  ## CONSTRAINTS
931
966
  SCOPE: Only files in \`${E}\` are accessible.
932
- `);let w=u?.sealedAnalysis;if(w){let M=[...w.languages||[],...w.frameworks||[]].filter(Boolean);M.length>0&&g.push(`AVAILABLE: ${M.join(", ")}
933
- `),w.packageManager&&g.push(`PACKAGE MANAGER: ${w.packageManager}
934
- `)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let w=u.contextDegradation;g.push(`
967
+ `);let k=l?.sealedAnalysis;if(k){let D=[...k.languages||[],...k.frameworks||[]].filter(Boolean);D.length>0&&g.push(`AVAILABLE: ${D.join(", ")}
968
+ `),k.packageManager&&g.push(`PACKAGE MANAGER: ${k.packageManager}
969
+ `)}}if(l?.contextDegradation?.level!=="full"&&l?.contextDegradation){let k=l.contextDegradation;g.push(`
935
970
  ### CONTEXT DEGRADATION NOTICE
936
971
 
937
- `),g.push(`**Level**: ${w.level}
938
- `),g.push(`**Unavailable**: ${w.failedTools.join(", ")}
972
+ `),g.push(`**Level**: ${k.level}
973
+ `),g.push(`**Unavailable**: ${k.failedTools.join(", ")}
939
974
  `),g.push(`Some context tools failed. Explore the codebase manually for missing context.
940
975
 
941
- `)}if(u?.realContext){let w=u.realContext;if(g.push(`
976
+ `)}if(l?.realContext){let k=l.realContext;if(g.push(`
942
977
  ### CODEBASE CONTEXT
943
978
 
944
- `),g.push(`**Git State**: Branch \`${w.gitBranch}\` | ${w.gitStatus}
979
+ `),g.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
945
980
 
946
- `),w.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
981
+ `),k.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
947
982
  `),g.push(`| Score | File | Why |
948
983
  `),g.push(`|-------|------|-----|
949
- `);for(let M of w.relevantFiles.slice(0,8))g.push(`| ${M.score} | ${M.path} | ${M.reason} |
984
+ `);for(let D of k.relevantFiles.slice(0,8))g.push(`| ${D.score} | ${D.path} | ${D.reason} |
950
985
  `);g.push(`
951
- `)}if(w.signatures.length>0){g.push(`**Code Signatures** (top files):
952
- `);for(let M of w.signatures)g.push(`\`\`\`typescript
953
- // ${M.path}
954
- ${M.content}
986
+ `)}if(k.signatures.length>0){g.push(`**Code Signatures** (top files):
987
+ `);for(let D of k.signatures)g.push(`\`\`\`typescript
988
+ // ${D.path}
989
+ ${D.content}
955
990
  \`\`\`
956
991
  `);g.push(`
957
- `)}if(w.recentFiles.length>0){g.push("**Recently Changed**: ");let M=w.recentFiles.slice(0,5).map(N=>`${N.path} (${N.lastChanged})`).join(", ");g.push(`${M}
992
+ `)}if(k.recentFiles.length>0){g.push("**Recently Changed**: ");let D=k.recentFiles.slice(0,5).map(N=>`${N.path} (${N.lastChanged})`).join(", ");g.push(`${D}
958
993
 
959
- `)}}let R=t.files||[];if(R.length>0){let w=R.slice(0,5).join(", ");g.push(`
960
- ## FILES: ${R.length} available. Top: ${w}
994
+ `)}}let A=t.files||[];if(A.length>0){let k=A.slice(0,5).join(", ");g.push(`
995
+ ## FILES: ${A.length} available. Top: ${k}
961
996
  `),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
962
997
 
963
998
  `)}else E&&g.push(`
964
999
  ## PROJECT: ${E}
965
1000
  Read files before modifying.
966
1001
 
967
- `);let W=this.filterRelevantState(s);if(W&&(g.push(`
1002
+ `);let F=this.filterRelevantState(s);if(F&&(g.push(`
968
1003
  ## PRJCT STATE (Project Management Data)
969
- `),g.push(W),g.push(`
970
- `)),u?.velocityContext&&(g.push(`
1004
+ `),g.push(F),g.push(`
1005
+ `)),l?.velocityContext&&(g.push(`
971
1006
  ### VELOCITY (Historical Estimation Data)
972
1007
 
973
- `),g.push(u.velocityContext),g.push(`
1008
+ `),g.push(l.velocityContext),g.push(`
974
1009
 
975
- `)),o&&Object.keys(o).some(w=>o[w])){g.push(`
1010
+ `)),o&&Object.keys(o).some(k=>o[k])){g.push(`
976
1011
  ## PROJECT DEFAULTS (apply automatically)
977
- `);for(let[w,M]of Object.entries(o))M&&g.push(`- ${w}: ${M}
1012
+ `);for(let[k,D]of Object.entries(o))D&&g.push(`- ${k}: ${D}
978
1013
  `)}if(i?.plan&&i.plan.length>0){if(g.push(`
979
1014
  ## THINK FIRST (reasoning from analysis)
980
1015
  `),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
981
- `);for(let w of i.conclusions)g.push(` \u2192 ${w}
1016
+ `);for(let k of i.conclusions)g.push(` \u2192 ${k}
982
1017
  `)}g.push(`Plan:
983
- `);for(let w=0;w<i.plan.length;w++)g.push(` ${w+1}. ${i.plan[w]}
1018
+ `);for(let k=0;k<i.plan.length;k++)g.push(` ${k+1}. ${i.plan[k]}
984
1019
  `);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
985
- `)}if(!p&&a&&a.length>0){g.push(`
1020
+ `)}if(!m&&a&&a.length>0){g.push(`
986
1021
  ## CONTEXT (apply these)
987
- `);for(let w of a)g.push(`- **${w.title}**: ${w.content}
988
- `),w.tags&&w.tags.length>0&&g.push(` Tags: ${w.tags.join(", ")}
989
- `)}if(u?.rpiContext){let w=u.rpiContext;switch(g.push(`
1022
+ `);for(let k of a)g.push(`- **${k.title}**: ${k.content}
1023
+ `),k.tags&&k.tags.length>0&&g.push(` Tags: ${k.tags.join(", ")}
1024
+ `)}if(l?.rpiContext){let k=l.rpiContext;switch(g.push(`
990
1025
  ### RPI PHASE
991
1026
 
992
- `),w.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.
1027
+ `),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.
993
1028
  `);break;case"plan":g.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
994
- `),w.researchDoc&&g.push(`
1029
+ `),k.researchDoc&&g.push(`
995
1030
  <research-context>
996
- ${w.researchDoc}
1031
+ ${k.researchDoc}
997
1032
  </research-context>
998
1033
  `);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
999
- `),w.planDoc&&g.push(`
1034
+ `),k.planDoc&&g.push(`
1000
1035
  <plan-context>
1001
- ${w.planDoc}
1036
+ ${k.planDoc}
1002
1037
  </plan-context>
1003
- `),w.scopedFiles&&w.scopedFiles.length>0&&g.push(`
1004
- **Scoped Files**: ${w.scopedFiles.map(M=>`\`${M}\``).join(", ")}
1038
+ `),k.scopedFiles&&k.scopedFiles.length>0&&g.push(`
1039
+ **Scoped Files**: ${k.scopedFiles.map(D=>`\`${D}\``).join(", ")}
1005
1040
  `);break}g.push(`
1006
1041
  `)}if(g.push(`
1007
1042
  ---
1008
- `),g.push(e.content),u?.requiresFragmentation&&u.subtasks){g.push(`
1043
+ `),g.push(e.content),l?.requiresFragmentation&&l.subtasks){g.push(`
1009
1044
  ### SUBTASKS (Execute in Order)
1010
1045
 
1011
1046
  `),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
1012
1047
  `),g.push(`|---|--------|-------------|--------|
1013
- `);for(let M of u.subtasks){let N=M.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":M.status==="completed"?"\u2705 Done":M.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${M.order} | ${M.domain} | ${M.description} | ${N} |
1014
- `)}let w=u.subtasks.find(M=>M.status==="in_progress");if(w&&(g.push(`
1015
- **FOCUS ON SUBTASK #${w.order}**: ${w.description}
1016
- `),g.push(`Agent: ${w.agent} | Domain: ${w.domain}
1017
- `),w.dependsOn.length>0&&g.push(`Dependencies: ${w.dependsOn.join(", ")}
1018
- `),w.handoff)){let M=w.handoff;g.push(`
1048
+ `);for(let D of l.subtasks){let N=D.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":D.status==="completed"?"\u2705 Done":D.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${D.order} | ${D.domain} | ${D.description} | ${N} |
1049
+ `)}let k=l.subtasks.find(D=>D.status==="in_progress");if(k&&(g.push(`
1050
+ **FOCUS ON SUBTASK #${k.order}**: ${k.description}
1051
+ `),g.push(`Agent: ${k.agent} | Domain: ${k.domain}
1052
+ `),k.dependsOn.length>0&&g.push(`Dependencies: ${k.dependsOn.join(", ")}
1053
+ `),k.handoff)){let D=k.handoff;g.push(`
1019
1054
  ### Previous Subtask Handoff
1020
1055
 
1021
- `),g.push(`**From:** ${M.fromSubtask}
1056
+ `),g.push(`**From:** ${D.fromSubtask}
1022
1057
 
1023
1058
  `),g.push(`**What was done:**
1024
- `);for(let N of M.whatWasDone)g.push(`- ${N}
1025
- `);if(M.filesChanged.length>0){g.push(`
1059
+ `);for(let N of D.whatWasDone)g.push(`- ${N}
1060
+ `);if(D.filesChanged.length>0){g.push(`
1026
1061
  **Files changed:**
1027
- `);for(let N of M.filesChanged)g.push(`- \`${N.path}\` (${N.action})
1062
+ `);for(let N of D.filesChanged)g.push(`- \`${N.path}\` (${N.action})
1028
1063
  `)}g.push(`
1029
1064
  **Context for this subtask:**
1030
- ${M.outputForNextAgent}
1065
+ ${D.outputForNextAgent}
1031
1066
  `)}g.push(`
1032
- `)}let z=this.getSchemaTypeForCommand(h);if(z){let{renderSchemaForPrompt:w}=await Promise.resolve().then(()=>(_p(),Mp)),M=w(z);M&&g.push(`
1033
- ${M}
1034
- `)}if(b.checklist){let w=await this.loadChecklistRouting(),M=await this.loadChecklists();w&&Object.keys(M).length>0&&(g.push(`
1067
+ `)}let J=this.getSchemaTypeForCommand(h);if(J){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(eg(),Zm)),D=k(J);D&&g.push(`
1068
+ ${D}
1069
+ `)}if(S.checklist){let k=await this.loadChecklistRouting(),D=await this.loadChecklists();k&&Object.keys(D).length>0&&(g.push(`
1035
1070
  ## QUALITY CHECKLISTS
1036
1071
  `),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
1037
- `),g.push(`Available: ${Object.keys(M).join(", ")}
1072
+ `),g.push(`Available: ${Object.keys(D).join(", ")}
1038
1073
  `),g.push(`Path: templates/checklists/{name}.md
1039
1074
  `),g.push(`Use Read tool to load checklists you determine are relevant.
1040
1075
  `))}return g.push(`
@@ -1042,7 +1077,7 @@ ${M}
1042
1077
  `),g.push(`- Be concise. No preamble, no filler.
1043
1078
  `),g.push(`- Use sub-agents for exploration that produces >5 file reads.
1044
1079
  `),g.push(`- Prefer file:line references over dumping full file contents.
1045
- `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new Kc({totalPrompt:zc.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}
1080
+ `),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new dl({totalPrompt:ul.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}
1046
1081
  ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1047
1082
 
1048
1083
  `):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
@@ -1059,13 +1094,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
1059
1094
  `);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
1060
1095
  Avoid:
1061
1096
  ${a}`)}let o=t.join(`
1062
- `);return Qo(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},sS=new Xc,Lp=sS});import Yc from"node:fs/promises";import nS from"node:os";import Qc from"node:path";function Up(){let r=process.env.PRJCT_CLI_HOME?.trim()||Qc.join(nS.homedir(),".prjct-cli");return Qc.join(r,".running")}async function rS(r){try{let e=Up(),t=Qc.dirname(e);await C(t)||await Yc.mkdir(t,{recursive:!0}),await Yc.writeFile(e,`/p:${r}`)}catch{}}async function oS(){try{let r=Up();await C(r)&&await Yc.unlink(r)}catch{}}var Zc,iS,Zo,el=v(()=>{"use strict";Xm();U();Zm();B();Vo();ip();Zr();ap();ao();Bc();xp();Fp();Os();l(Up,"getRunningFilePath");l(rS,"signalStart");l(oS,"signalEnd");Zc=class{static{l(this,"CommandExecutor")}async signalStart(e){await rS(e)}async signalEnd(){await oS()}requiresOrchestration(e){return zm.includes(e)?!0:!Km.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Cn.shouldEscalate(e,n)){let o=Cn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ru.load(e),i=await Is.build(s,t),a=He.requiresPlanning(e),c=He.isDestructive(e),u=He.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=He.startPlanning(i.projectId,e,t):u&&(d=He.getActivePlan(i.projectId));let m=t.task||t.description||"",p=null;if(this.requiresOrchestration(e)&&m)try{if(p=await Yo.execute(e,m,s),p.detectedDomains.length>0&&Qm.orchestrate(p.detectedDomains),p.requiresFragmentation&&p.subtasks){let N=p.subtasks.map(fe=>({id:fe.id,domain:fe.domain,description:fe.description,status:fe.status}));op(N)}}catch(N){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(N)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await Is.loadState(i),b=await qs("prjct"),k=null,E=null;i.projectId&&(k={commit_footer:await nt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await nt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await nt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await nt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(E=await nt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let R={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:He.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},w=(await(dt(),at(jt)).getActiveProvider()).name==="claude",M=await Lp.build(o,g,h,null,k,null,E,R,p,{skipNativeContext:w,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),Cn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:M,agenticDelegation:!0,agenticMode:!0,learnedPatterns:k,relevantMemories:E,orchestratorContext:p,memory:{create:l(N=>nt.createMemory(i.projectId,N),"create"),autoRemember:l((N,fe,Ne)=>nt.autoRemember(i.projectId,N,fe,Ne),"autoRemember"),search:l(N=>nt.searchMemories(i.projectId,N),"search"),findByTags:l(N=>nt.findByTags(i.projectId,N),"findByTags"),getStats:l(()=>nt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(N=>He.recordGatheredInfo(i.projectId,N),"recordInfo"),setAnalysis:l(N=>He.setAnalysis(i.projectId,N),"setAnalysis"),propose:l(N=>He.proposePlan(i.projectId,N),"propose"),approve:l(N=>He.approvePlan(i.projectId,N),"approve"),reject:l(N=>He.rejectPlan(i.projectId,N),"reject"),getApprovalPrompt:l(()=>He.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>He.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>He.getNextStep(i.projectId),"getNextStep"),completeStep:l(N=>He.completeStep(i.projectId,N),"completeStep"),failStep:l(N=>He.failStep(i.projectId,N),"failStep"),abort:l(N=>He.abortPlan(i.projectId,N),"abort"),getStatus:l(()=>He.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>He.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Cn.recordAttempt(e,n,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Cn.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}}}},iS=new Zc,Zo=iS});import aS from"node:https";import cS from"node:os";import tl from"node:path";import Vt from"chalk";var sl,ei,nl=v(()=>{"use strict";U();B();sl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=tl.join(cS.homedir(),".prjct-cli","config"),this.cacheFile=tl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=tl.join(__dirname,"..","..","package.json");return(await Pe(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=aS.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await Pe(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:`
1063
- `+Vt.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")+`
1064
- `+Vt.yellow("\u2502")+" "+Vt.bold("Update available!")+" "+Vt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Vt.yellow("\u2502")+`
1065
- `+Vt.yellow("\u2502")+" "+Vt.yellow("\u2502")+`
1066
- `+Vt.yellow("\u2502")+" Run: "+Vt.cyan("npm update -g prjct-cli")+" "+Vt.yellow("\u2502")+`
1067
- `+Vt.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")+`
1068
- `}},ei=sl});import Hp from"node:path";async function dS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(Hp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Hp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function mS(){return{...lS}}function pS(){return{...uS}}async function Wp(){return ti||(ti=await dS()?mS():pS(),ti)}var ti,lS,uS,Gp=v(()=>{"use strict";B();ti=null,lS={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}},uS={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(dS,"isClaudeEnvironment");l(mS,"getClaudeAgent");l(pS,"getTerminalAgent");l(Wp,"detect")});import si from"node:fs/promises";var rl,Vp,Bp=v(()=>{"use strict";U();B();rl=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 si.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 si.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 si.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await si.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1097
+ `);return fi(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},wS=new pl,ng=wS});import ml from"node:fs/promises";import kS from"node:os";import gl from"node:path";function og(){let r=process.env.PRJCT_CLI_HOME?.trim()||gl.join(kS.homedir(),".prjct-cli");return gl.join(r,".running")}async function SS(r){try{let e=og(),t=gl.dirname(e);await C(t)||await ml.mkdir(t,{recursive:!0}),await ml.writeFile(e,`/p:${r}`)}catch{}}async function bS(){try{let r=og();await C(r)&&await ml.unlink(r)}catch{}}var fl,TS,hi,hl=P(()=>{"use strict";fm();W();wm();B();ai();Pm();go();Cm();To();al();Vm();rg();Js();u(og,"getRunningFilePath");u(SS,"signalStart");u(bS,"signalEnd");fl=class{static{u(this,"CommandExecutor")}async signalStart(e){await SS(e)}async signalEnd(){await bS()}requiresOrchestration(e){return mm.includes(e)?!0:!gm.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Nn.shouldEscalate(e,n)){let o=Nn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await zu.load(e),i=await Ws.build(s,t),a=Ge.requiresPlanning(e),c=Ge.isDestructive(e),l=Ge.isInPlanningMode(i.projectId),d=null;a&&!l&&!t.skipPlanning?d=Ge.startPlanning(i.projectId,e,t):l&&(d=Ge.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await gi.execute(e,p,s),m.detectedDomains.length>0&&ym.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let N=m.subtasks.map(we=>({id:we.id,domain:we.domain,description:we.description,status:we.status}));Em(N)}}catch(N){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(N)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await Ws.loadState(i),S=await tn("prjct"),y=null,E=null;i.projectId&&(y={commit_footer:await it.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await it.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await it.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await it.getSmartDecision(i.projectId,`preferred_agent_${e}`)},S||(E=await it.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let A={isPlanning:a||l,requiresApproval:c&&!t.approved,active:d,allowedTools:Ge.getAllowedTools(l,o.frontmatter["allowed-tools"]||[])},k=(await(mt(),lt(Mt)).getActiveProvider()).name==="claude",D=await ng.build(o,g,h,null,y,null,E,A,m,{skipNativeContext:k,mcpActive:S});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),Nn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:D,agenticDelegation:!0,agenticMode:!0,learnedPatterns:y,relevantMemories:E,orchestratorContext:m,memory:{create:u(N=>it.createMemory(i.projectId,N),"create"),autoRemember:u((N,we,He)=>it.autoRemember(i.projectId,N,we,He),"autoRemember"),search:u(N=>it.searchMemories(i.projectId,N),"search"),findByTags:u(N=>it.findByTags(i.projectId,N),"findByTags"),getStats:u(()=>it.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||l,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:u(N=>Ge.recordGatheredInfo(i.projectId,N),"recordInfo"),setAnalysis:u(N=>Ge.setAnalysis(i.projectId,N),"setAnalysis"),propose:u(N=>Ge.proposePlan(i.projectId,N),"propose"),approve:u(N=>Ge.approvePlan(i.projectId,N),"approve"),reject:u(N=>Ge.rejectPlan(i.projectId,N),"reject"),getApprovalPrompt:u(()=>Ge.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:u(()=>Ge.startExecution(i.projectId),"startExecution"),getNextStep:u(()=>Ge.getNextStep(i.projectId),"getNextStep"),completeStep:u(N=>Ge.completeStep(i.projectId,N),"completeStep"),failStep:u(N=>Ge.failStep(i.projectId,N),"failStep"),abort:u(N=>Ge.abortPlan(i.projectId,N),"abort"),getStatus:u(()=>Ge.formatStatus(i.projectId),"getStatus"),getAllowedTools:u(()=>Ge.getAllowedTools(l,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Nn.recordAttempt(e,n,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Nn.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}}}},TS=new fl,hi=TS});import vS from"node:https";import ES from"node:os";import yl from"node:path";import zt from"chalk";var wl,yi,kl=P(()=>{"use strict";W();B();wl=class{static{u(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=yl.join(ES.homedir(),".prjct-cli","config"),this.cacheFile=yl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=yl.join(__dirname,"..","..","package.json");return(await Te(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=vS.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await Te(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:`
1098
+ `+zt.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")+`
1099
+ `+zt.yellow("\u2502")+" "+zt.bold("Update available!")+" "+zt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+zt.yellow("\u2502")+`
1100
+ `+zt.yellow("\u2502")+" "+zt.yellow("\u2502")+`
1101
+ `+zt.yellow("\u2502")+" Run: "+zt.cyan("npm update -g prjct-cli")+" "+zt.yellow("\u2502")+`
1102
+ `+zt.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")+`
1103
+ `}},yi=wl});import ig from"node:path";async function xS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(ig.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(ig.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function RS(){return{...PS}}function AS(){return{...CS}}async function ag(){return wi||(wi=await xS()?RS():AS(),wi)}var wi,PS,CS,cg=P(()=>{"use strict";B();wi=null,PS={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}},CS={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}};u(xS,"isClaudeEnvironment");u(RS,"getClaudeAgent");u(AS,"getTerminalAgent");u(ag,"detect")});import ki from"node:fs/promises";var Sl,lg,ug=P(()=>{"use strict";W();B();Sl=class{static{u(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 ki.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 ki.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 ki.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await ki.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
1069
1104
  ${e.map((t,s)=>`${s+1}. ${t}`).join(`
1070
1105
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
1071
1106
 
@@ -1110,10 +1145,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
1110
1145
 
1111
1146
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
1112
1147
 
1113
- 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}}},Vp=rl});function Jp(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&fS.has(e.code))return!0;if(e.code&&zp.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 hS(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&zp.has(e.code))}function qp(r,e,t){let s=Ts.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Ts.delete(r),!1):!0:!1}function ol(r,e){let t=Ts.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Ts.set(r,t)}function yS(r){Ts.delete(r)}var fS,zp,Ts,ni,Kp,n$,Xp=v(()=>{"use strict";fS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),zp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Jp,"isTransientError");l(hS,"isPermanentError");Ts=new Map;l(qp,"isCircuitOpen");l(ol,"recordFailure");l(yS,"recordSuccess");ni=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(qp(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 yS(t),o}catch(o){if(s=o,n++,hS(o))throw ol(t,this.options.circuitBreakerThreshold),o;if(!(Jp(o)&&n<this.options.maxAttempts))throw ol(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 ol(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Jp(e)}isCircuitOpen(e){return qp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Ts.get(e)}resetCircuit(e){Ts.delete(e)}resetAllCircuits(){Ts.clear()}},Kp=new ni({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),n$=new ni({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var wS,il,ri,Yp=v(()=>{"use strict";Yt();Gp();Bp();Xp();wS=["claude"],il=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Kp.execute(async()=>{if(this.agentInfo=await Wp(),!this.agentInfo?.isSupported)throw rr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!wS.includes(e))throw rr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Vp,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},ri=new il});var al,jn,cl=v(()=>{"use strict";al=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},jn=new al});var ll,et,ul=v(()=>{"use strict";te();ll=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();$.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1114
- VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let 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=$.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 $.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),$.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 $.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}}},et=new ll});function dl(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 ml,Ae,oi=v(()=>{"use strict";ul();te();l(dl,"rowToRule");ml=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)
1115
- 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 m=u;a.push(d.transform?d.transform(m):m)}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?dl(s):null}getRulesForCommand(e,t){let s=et.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(dl)}getAllRules(e){return P.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(dl)}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}},Ae=new ml});import ot from"node:path";async function kS(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(ot.join(r,"pnpm-lock.yaml"))?"pnpm":await C(ot.join(r,"yarn.lock"))?"yarn":await C(ot.join(r,"bun.lockb"))||await C(ot.join(r,"bun.lock"))?"bun":(await C(ot.join(r,"package-lock.json")),"npm")}function Qp(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 $n(r,e){for(let n of bS)if(await C(ot.join(r,n)))return n;let s=(e??await ps(r)).find(n=>n.endsWith(TS));if(s)return s}async function cs(r){for(let e of vS)if(await C(ot.join(r,e)))return e}async function ii(r){let e=ot.join(r,"package.json"),t=await Pe(e,null);if(t){let a=await kS(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Qp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Qp(a,"typecheck")}),c.test&&(u.test={tool:a,command:SS(a)}),u.versionFile=await $n(r),u.changelogFile=await cs(r),u}if(await C(ot.join(r,"pytest.ini"))){let a=await $n(r),c=await cs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await Ie(ot.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await $n(r),c=await cs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(ot.join(r,"Cargo.toml"))){let a=await cs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(ot.join(r,"go.mod"))){let a=await $n(r),c=await cs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ps(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $n(r,n),c=await cs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(ot.join(r,"pom.xml"))){let a=await cs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(ot.join(r,"gradlew"))&&(await C(ot.join(r,"build.gradle"))||await C(ot.join(r,"build.gradle.kts")))){let a=await cs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $n(r),i=await cs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var bS,TS,vS,pl=v(()=>{"use strict";B();l(kS,"detectPackageManager");l(Qp,"pmRun");l(SS,"pmTest");bS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],TS=".csproj",vS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($n,"detectVersionFile");l(cs,"detectChangelogFile");l(ii,"detectProjectCommands")});import*as ce from"@clack/prompts";import zs from"chalk";var ai,Zp,Rr,eg=v(()=>{"use strict";B();Qe();ai=[{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."}],Zp=[{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"}],Rr=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(){ce.intro(zs.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 ce.outro(zs.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=ai.findIndex(s=>s.value===this.detectedType),t=await ce.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ai.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?ai[e].value:void 0});return ce.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ce.multiselect({message:"Which AI agents do you use?",options:Zp.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ce.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);ce.note(e,"Detected stack");let t=await ce.confirm({message:"Is this stack correct?",initialValue:!0});if(ce.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ce.group({language:l(()=>ce.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ce.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 ce.group({verbosity:l(()=>ce.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(()=>ce.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=[`${zs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${zs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${zs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${zs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${zs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1116
- `);ce.note(e,"Configuration Summary");let t=await ce.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ce.isCancel(t)||!t?(ce.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 ms(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await ms(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Le(),nu));await n("which codex"),s.push("codex")}catch{await ms(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,ce.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ai.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Zp.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 tg={};Jt(tg,{PlanningCommands:()=>Xs});import ci from"node:fs/promises";import Ks from"node:path";async function ES(){if(!gl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ui(),sg));gl=new r}return gl}var gl,Xs,li=v(()=>{"use strict";Vr();ss();Ce();ye();vt();ws();Ht();oi();U();q();B();Vs();vn();Qe();pl();eg();xt();gl=null;l(ES,"getAnalysisCommands");Xs=class extends ke{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 j.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 Rr(t).runNonInteractive());else if(a=await new Rr(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await ln(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await j.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
1148
+ 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}}},lg=Sl});function dg(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&DS.has(e.code))return!0;if(e.code&&mg.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 IS(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&mg.has(e.code))}function pg(r,e,t){let s=Is.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Is.delete(r),!1):!0:!1}function bl(r,e){let t=Is.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Is.set(r,t)}function $S(r){Is.delete(r)}var DS,mg,Is,Si,gg,S$,fg=P(()=>{"use strict";DS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mg=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);u(dg,"isTransientError");u(IS,"isPermanentError");Is=new Map;u(pg,"isCircuitOpen");u(bl,"recordFailure");u($S,"recordSuccess");Si=class{static{u(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(pg(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 $S(t),o}catch(o){if(s=o,n++,IS(o))throw bl(t,this.options.circuitBreakerThreshold),o;if(!(dg(o)&&n<this.options.maxAttempts))throw bl(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 bl(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return dg(e)}isCircuitOpen(e){return pg(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Is.get(e)}resetCircuit(e){Is.delete(e)}resetAllCircuits(){Is.clear()}},gg=new Si({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),S$=new Si({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var _S,Tl,bi,hg=P(()=>{"use strict";ns();cg();ug();fg();_S=["claude"],Tl=class{static{u(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await gg.execute(async()=>{if(this.agentInfo=await ag(),!this.agentInfo?.isSupported)throw yr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!_S.includes(e))throw yr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new lg,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},bi=new Tl});var vl,qn,El=P(()=>{"use strict";vl=class{static{u(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},qn=new vl});var Pl,Le,Ti=P(()=>{"use strict";Y();Pl=class{static{u(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();_.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1149
+ VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let 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=_.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 _.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),_.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 _.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}}},Le=new Pl});function Cl(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 xl,be,Fr=P(()=>{"use strict";Ti();Y();u(Cl,"rowToRule");xl=class{static{u(this,"WorkflowRuleStorage")}addRule(e,t){let s=T.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return T.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
1150
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),T.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return T.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(T.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!T.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:u(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,l]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=l;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),T.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=T.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Cl(s):null}getRulesForCommand(e,t){let s=Le.getWorkflow(e,t);return!s||!s.enabled?[]:T.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Cl)}getAllRules(e){return T.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Cl)}resetRules(e){let t=T.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return T.run(e,"DELETE FROM workflow_rules"),t?.c??0}},be=new xl});import at from"node:path";async function MS(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(at.join(r,"pnpm-lock.yaml"))?"pnpm":await C(at.join(r,"yarn.lock"))?"yarn":await C(at.join(r,"bun.lockb"))||await C(at.join(r,"bun.lock"))?"bun":(await C(at.join(r,"package-lock.json")),"npm")}function yg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function OS(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Gn(r,e){for(let n of NS)if(await C(at.join(r,n)))return n;let s=(e??await Ss(r)).find(n=>n.endsWith(LS));if(s)return s}async function hs(r){for(let e of FS)if(await C(at.join(r,e)))return e}async function vi(r){let e=at.join(r,"package.json"),t=await Te(e,null);if(t){let a=await MS(r,t),c=t.scripts||{},l={stack:"js",packageManager:a};return c.lint&&(l.lint={tool:a,command:yg(a,"lint")}),c.typecheck&&(l.typecheck={tool:a,command:yg(a,"typecheck")}),c.test&&(l.test={tool:a,command:OS(a)}),l.versionFile=await Gn(r),l.changelogFile=await hs(r),l}if(await C(at.join(r,"pytest.ini"))){let a=await Gn(r),c=await hs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(at.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Gn(r),c=await hs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(at.join(r,"Cargo.toml"))){let a=await hs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(at.join(r,"go.mod"))){let a=await Gn(r),c=await hs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Ss(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Gn(r,n),c=await hs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(at.join(r,"pom.xml"))){let a=await hs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(at.join(r,"gradlew"))&&(await C(at.join(r,"build.gradle"))||await C(at.join(r,"build.gradle.kts")))){let a=await hs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Gn(r),i=await hs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var NS,LS,FS,Rl=P(()=>{"use strict";B();u(MS,"detectPackageManager");u(yg,"pmRun");u(OS,"pmTest");NS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],LS=".csproj",FS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];u(Gn,"detectVersionFile");u(hs,"detectChangelogFile");u(vi,"detectProjectCommands")});import*as me from"@clack/prompts";import sn from"chalk";var Ei,wg,Ur,kg=P(()=>{"use strict";B();Ze();Ei=[{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."}],wg=[{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"}],Ur=class{static{u(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(){me.intro(sn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:u(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:u(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:u(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:u(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:u(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return me.outro(sn.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=Ei.findIndex(s=>s.value===this.detectedType),t=await me.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Ei.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Ei[e].value:void 0});return me.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await me.multiselect({message:"Which AI agents do you use?",options:wg.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return me.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);me.note(e,"Detected stack");let t=await me.confirm({message:"Is this stack correct?",initialValue:!0});if(me.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await me.group({language:u(()=>me.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:u(()=>me.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:u(()=>{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 me.group({verbosity:u(()=>me.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:u(()=>me.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:u(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${sn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${sn.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${sn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${sn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${sn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
1151
+ `);me.note(e,"Configuration Summary");let t=await me.confirm({message:"Generate configuration with these settings?",initialValue:!0});return me.isCancel(t)||!t?(me.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 ks(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await ks(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(We(),Tu));await n("which codex"),s.push("codex")}catch{await ks(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,me.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Ei.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return wg.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 Sg={};Lt(Sg,{PlanningCommands:()=>rn});import Pi from"node:fs/promises";import nn from"node:path";async function US(){if(!Al){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(xi(),bg));Al=new r}return Al}var Al,rn,Ci=P(()=>{"use strict";ro();cs();Ae();Se();xt();Cs();Nt();Fr();W();K();B();es();_n();Ze();Rl();kg();bt();Al=null;u(US,"getAnalysisCommands");rn=class extends he{static{u(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 I.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 Ur(t).runNonInteractive());else if(a=await new Ur(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await wn(),l={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await I.createConfig(t,l)).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
1117
1152
 
1118
1153
  No current task. Use \`/p:now\` to set focus.
1119
1154
  `,"core/next.md":`# NEXT
@@ -1133,29 +1168,29 @@ No current task. Use \`/p:now\` to set focus.
1133
1168
  `,"planning/roadmap.md":`# ROADMAP
1134
1169
 
1135
1170
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
1136
- `,"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,R]of Object.entries(g))await ci.writeFile(Ks.join(p,E),R);let h=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!h){f.step(3,4,"Analyzing project...");let E=await ES();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:m,wizard:a}}let k=s.idea;if(h&&!b){if(!k)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 E=Ks.join(p,"planning","architect-session.md"),R=`# Architect Session
1171
+ `,"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,A]of Object.entries(g))await Pi.writeFile(nn.join(m,E),A);let h=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!h){f.step(3,4,"Analyzing project...");let E=await US();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 y=s.idea;if(h&&!S){if(!y)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=nn.join(m,"planning","architect-session.md"),A=`# Architect Session
1137
1172
 
1138
1173
  ## Idea
1139
- ${k}
1174
+ ${y}
1140
1175
 
1141
1176
  ## Status
1142
1177
  Initialized - awaiting stack recommendation
1143
1178
 
1144
1179
  Generated: ${new Date().toLocaleString()}
1145
- `;return await ci.writeFile(E,R),await xe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:k,wizard:a}}return await xe.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,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 j.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=J();return await pe.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:S()}),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 j.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 pe.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:S()}),s.md?console.log(L(Y("Bug Reported",e),rt({Severity:i,Priority:c}),de([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Pt("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
1146
- `);let n=await this.getGlobalProjectPath(t),o=Ks.join(n,"planning","architect-session.md"),i;try{i=await Ie(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1180
+ `;return await Pi.writeFile(E,A),await je.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:y,wizard:a}}return await je.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,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 I.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=z();return await re.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(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 I.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 re.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),Oe({Severity:i,Priority:c}),oe([{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
1181
+ `);let n=await this.getGlobalProjectPath(t),o=nn.join(n,"planning","architect-session.md"),i;try{i=await _e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
1147
1182
 
1148
1183
  Create a plan first:
1149
1184
  1. Run /p:init in an empty directory
1150
1185
  2. Answer the discovery questions
1151
1186
  3. Plan will be auto-generated
1152
1187
  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...
1153
- `);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(`
1154
- `)[0].trim():"Unknown project",m=c?c[1]:"Not specified",p=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
1188
+ `);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),l=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
1189
+ `)[0].trim():"Unknown project",p=c?c[1]:"Not specified",m=l?l[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
1155
1190
  \u{1F527} Stack:
1156
- ${m}`),console.log(`
1157
- \u{1F4CB} Implementation Steps:
1158
1191
  ${p}`),console.log(`
1192
+ \u{1F4CB} Implementation Steps:
1193
+ ${m}`),console.log(`
1159
1194
  ${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
1160
1195
  The architect plan is ready. Claude will now:
1161
1196
  1. Read the architectural plan
@@ -1164,7 +1199,7 @@ The architect plan is ready. Claude will now:
1164
1199
  4. Create starter files with boilerplate
1165
1200
  `),console.log(`
1166
1201
  \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.
1167
- `),await this.logToMemory(t,"architect_executed",{timestamp:S(),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 j.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=Ks.join(c,"planning","architect-session.md"),d=`# Architect Session
1202
+ `),await this.logToMemory(t,"architect_executed",{timestamp:b(),idea:d}),{success:!0,plan:i,idea:d}}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 I.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),l=nn.join(c,"planning","architect-session.md"),d=`# Architect Session
1168
1203
 
1169
1204
  ## Idea
1170
1205
  ${e}
@@ -1179,14 +1214,14 @@ Initialized - awaiting architecture design
1179
1214
  4. Generate roadmap
1180
1215
 
1181
1216
  Generated: ${new Date().toLocaleString()}
1182
- `;return await ci.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:S()}),s.md?console.log(L(Y("Idea Captured",e),rt({Mode:"architecture"}),de([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1217
+ `;return await Pi.writeFile(l,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),Oe({Mode:"architecture"}),oe([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
1183
1218
  \u{1F4A1} Use /p:architect execute to continue planning
1184
- `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Ue.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:S()}),s.md?console.log(L(Y("Idea Captured",e),rt({Mode:"capture"}),de([{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)}`),Pt("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 j.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=A.getGlobalProjectPath(n),m=Ks.join(d,"planning","specs");try{let h=(await(await import("node:fs/promises")).readdir(m)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return h.length===0?(f.warn("no specs yet"),console.log(`
1219
+ `)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Pe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),Oe({Mode:"capture"}),oe([{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 I.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=nn.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(`
1185
1220
  \u{1F4A1} Create one with /p:spec "feature name"
1186
1221
  `),{success:!0,specs:[]}):(console.log(`
1187
1222
  \u{1F4CB} SPECIFICATIONS
1188
- `),console.log("\u2550".repeat(50)),h.forEach((b,k)=>{let E=b.replace(".md","").replace(/-/g," ");console.log(` ${k+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
1189
- `),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=Ks.join(o,"planning","specs");await Ve(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Ks.join(i,`${a}.md`),u=`# Specification: ${e}
1223
+ `),console.log("\u2550".repeat(50)),h.forEach((S,y)=>{let E=S.replace(".md","").replace(/-/g," ");console.log(` ${y+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
1224
+ `),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=R.getGlobalProjectPath(n),i=nn.join(o,"planning","specs");await Ke(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=nn.join(i,`${a}.md`),l=`# Specification: ${e}
1190
1225
 
1191
1226
  ## Overview
1192
1227
  [Brief description of the feature]
@@ -1216,45 +1251,54 @@ Generated: ${new Date().toLocaleString()}
1216
1251
  ---
1217
1252
  Created: ${new Date().toLocaleString()}
1218
1253
  Status: Draft
1219
- `;return await ci.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:S()}),f.done(`spec created: ${a}.md`),console.log(`
1254
+ `;return await Pi.writeFile(c,l),await this.logToMemory(t,"spec_created",{feature:e,timestamp:b()}),f.done(`spec created: ${a}.md`),console.log(`
1220
1255
  \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
1221
- `),{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 ii(t),n=0;Ae.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&&Ae.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&&Ae.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 fl,Ys,ng=v(()=>{"use strict";Yt();Vr();Ce();ye();U();B();Qe();fl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await j.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(li(),tg)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await j.getProjectId(e);if(!t)throw Fr.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 ln();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await ps(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return D(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 ps(e)).some(n=>t.includes(n))}catch(t){return D(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await j.isConfigured(e)}async needsMigration(e){return await j.needsMigration(e)}},Ys=new fl});var ke,xt=v(()=>{"use strict";el();nl();Yp();cl();Ws();ng();ke=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ei,this.updateNotificationShown=!1,this.commandExecutor=Zo}get agent(){return ri.getAgent()}get agentInfo(){return ri.getInfo()}get currentAuthor(){return Ys.getCurrentAuthor()}async initializeAgent(){return ri.initialize()}async ensureProjectInit(e){return Ys.ensureInit(e)}async ensureAuthor(){return Ys.ensureAuthor()}async getGlobalProjectPath(e){return Ys.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Et.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Ys.isEmptyDirectory(e)}async _detectExistingCode(e){return Ys.hasExistingCode(e)}_breakdownFeatureTasks(e){return jn.breakdownFeature(e)}_detectBugSeverity(e){return jn.detectBugSeverity(e)}}});var sg={};Jt(sg,{AnalysisCommands:()=>Zs});import di from"node:fs/promises";import rg from"node:path";import*as Qs from"@clack/prompts";var Zs,ui=v(()=>{"use strict";Zr();ao();Pu();ss();Ce();ye();go();da();nd();ld();$a();vc();yn();te();fr();Qa();U();q();Vs();vn();Qe();qm();xt();Zs=class extends ke{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1222
- `),Be.init(t);let s=await Is.build(t,e),n={packageJson:await Be.readPackageJson(),cargoToml:await Be.readCargoToml(),goMod:await Be.readGoMod(),requirements:await Be.readRequirements(),directories:await Be.listDirectories(),fileCount:await Be.countFiles(),gitStats:await Be.getGitStats(),gitLog:await Be.getGitLog(20),hasDockerfile:await Be.fileExists("Dockerfile"),hasDockerCompose:await Be.fileExists("docker-compose.yml"),hasReadme:await Be.fileExists("README.md"),hasTsconfig:await Be.fileExists("tsconfig.json"),hasViteConfig:await Be.fileExists("vite.config.ts")||await Be.fileExists("vite.config.js"),hasNextConfig:await Be.fileExists("next.config.js")||await Be.fileExists("next.config.mjs")},o=Jm(n,t),i=await j.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await di.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:S(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(dt(),at(jt)).getActiveProvider(),d=await xe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1223
- `),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1224
- `),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 j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!p){let h=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await Gs.sync(e,{packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(L(we(`Synced package: ${p.name}`))):f.done(`Synced package: ${p.name}`),{success:g.success}}let a=rg.join(o,"context","CLAUDE.md"),c=null;try{c=await di.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 Gs.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 p;try{p=await di.readFile(a,"utf-8")}catch{p=""}let g=id(c,p);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(we("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 di.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let k=[];for(let R of g.added)k.push(`Added: ${R.name} (${R.lineCount} lines)`);for(let R of g.modified)k.push(`Modified: ${R.name} (${R.lineCount} lines)`);for(let R of g.removed)k.push(`Removed: ${R.name} (${R.lineCount} lines)`);let E=L("## Sync Preview",k.length>0?Y("Changes",$e(k)):"No section changes.",rt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(E),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let k={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:k,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(ad(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=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(b)||b==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
1225
- ${cd(g)}`);let k=await Qs.confirm({message:"Apply these changes?",initialValue:!0});if(Qs.isCancel(k)||!k)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),Ac(m,i)}t.md||f.spin("Syncing project...");let d=await Gs.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 m=Date.now()-i,p=d.generatedSkills?.generated?.length??0,g=null;try{let w=await qe.diff(n);w?.hasChanges&&(g=ua(w))}catch{}let h=d.git.recentCommits[0]?.hash??null,b=h&&Lt.isCurrent(n,h),k=null;if(!b)try{let w=await Ra(n,e,d.git,d.stats);k=["## 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(w,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1226
- `)}catch{k="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=Uo("sync",!0),R=d.syncMetrics?.indexes,W={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${p} generated`,"Files indexed":d.stats.fileCount};if(R?.bm25Files){let w=R.bm25Files*(R.bm25AvgTokens||0);W["Tokens indexed"]=`${Math.round(w/1e3)}K`,W["Import edges"]=R.importEdges||0,W["Co-change commits"]=R.cochangeCommits||0}let z=L(we("Sync Complete"),rt(W),g,d.git.hasChanges?Lm("Uncommitted changes detected"):null,k,de(E.map(w=>({label:w.desc,command:w.cmd}))));return console.log(z),{success:!0,data:d,metrics:{elapsed:m,skillCount:p,fileCount:d.stats.fileCount}}}return Ac(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 j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Gs.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(we("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 Ra(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 j.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(we("LLM Analysis Saved"),rt({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 j.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=[we(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Y("Architecture Insights",$e(o.architecture.insights))),o.patterns.length>0&&i.push(Y("Patterns",$e(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Y("Anti-Patterns",$e(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Y("Tech Debt",$e(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Y("Conventions",$e(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 j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Tn.getSummary(n),i=await Tn.getDailyStats(n,30),a=await Gm(n),c=await nt.getPatternsSummary(n);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Tn.read(n),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Pn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${po(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Rc(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=p>0?(g.usageCount/p*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 p=Vm(i);if(console.log(` ${p} ${Pn(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 p=Bm(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",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 j.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=ko(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await qe.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=rg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,rt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Y("Analysis",$e(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=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 j.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 qe.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(ua(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=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 j.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 qe.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 j.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 qe.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(we("Analysis Rolled Back"),rt({"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 j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await qe.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 j.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 qe.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 Bn(r){return Buffer.from(`${JSON.stringify(r)}
1227
- `)}var _e,kg,Sg,Il=v(()=>{"use strict";_e={runDir:l(()=>`${process.env.HOME||kt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${_e.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${_e.runDir()}/daemon.pid`,"pid"),log:l(()=>`${_e.runDir()}/daemon.log`,"log")},kg=1800*1e3,Sg=1024*1024;l(Bn,"encodeMessage")});var vg={};Jt(vg,{executeViaDaemon:()=>YS,forceKillDaemon:()=>ZS,getDaemonStatus:()=>XS,isDaemonRunning:()=>bg,sendRequest:()=>Ir,spawnDaemon:()=>Tg,stopDaemon:()=>QS});import ki from"node:crypto";import Ke from"node:fs";import{connect as KS}from"node:net";async function bg(){let r=_e.socket();if(!Ke.existsSync(r))return!1;try{return(await Ir({id:ki.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Ke.unlinkSync(r)}catch{}return!1}}async function XS(){let r=_e.socket(),e=_e.pid();if(!Ke.existsSync(r))return{running:!1};try{let t=await Ir({id:ki.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Ke.existsSync(e)?{running:!1,pid:parseInt(Ke.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Ir(r){return new Promise((e,t)=>{let s=_e.socket(),n=KS(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Bn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
1228
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function YS(r,e,t,s,n,o=!0){let i=_e.socket();if(!Ke.existsSync(i))return o&&Tg().catch(()=>{}),null;try{return await Ir({id:ki.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function QS(){try{return(await Ir({id:ki.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function ZS(){let r=_e.pid(),e=_e.socket(),t=!1;if(Ke.existsSync(r)){let s=parseInt(Ke.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Ke.existsSync(r)&&Ke.unlinkSync(r)}catch{}try{Ke.existsSync(e)&&Ke.unlinkSync(e)}catch{}return t}async function Tg(){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(Ke.existsSync(t))o=t,i="bun";else if(Ke.existsSync(s))o=s,i=ea()?"bun":"node";else if(Ke.existsSync(n))o=n,i=ea()?"bun":"node";else return!1;let a=_e.runDir();Ke.mkdirSync(a,{recursive:!0});let c=_e.log(),u=Ke.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Ke.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await bg())return!0;return!1}var Eg=v(()=>{"use strict";ur();Il();l(bg,"isDaemonRunning");l(XS,"getDaemonStatus");l(Ir,"sendRequest");l(YS,"executeViaDaemon");l(QS,"stopDaemon");l(ZS,"forceKillDaemon");l(Tg,"spawnDaemon")});import Oe from"node:fs";import{createServer as qb}from"node:net";ui();Zr();Ce();$a();import PS from"node:fs/promises";import CS from"node:path";te();var hl=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)
1229
- 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)
1230
- 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
1256
+ `),{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 vi(t),n=0;be.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&&be.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&&be.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 jl,on,Tg=P(()=>{"use strict";ns();ro();Ae();Se();W();B();Ze();jl=class{static{u(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await I.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ci(),Sg)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await I.getProjectId(e);if(!t)throw Zr.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 wn();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 Ss(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return j(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 Ss(e)).some(n=>t.includes(n))}catch(t){return j(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await I.isConfigured(e)}async needsMigration(e){return await I.needsMigration(e)}},on=new jl});var he,bt=P(()=>{"use strict";hl();kl();hg();El();Ys();Tg();he=class{static{u(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new yi,this.updateNotificationShown=!1,this.commandExecutor=hi}get agent(){return bi.getAgent()}get agentInfo(){return bi.getInfo()}get currentAuthor(){return on.getCurrentAuthor()}async initializeAgent(){return bi.initialize()}async ensureProjectInit(e){return on.ensureInit(e)}async ensureAuthor(){return on.ensureAuthor()}async getGlobalProjectPath(e){return on.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Rt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return on.isEmptyDirectory(e)}async _detectExistingCode(e){return on.hasExistingCode(e)}_breakdownFeatureTasks(e){return qn.breakdownFeature(e)}_detectBugSeverity(e){return qn.detectBugSeverity(e)}}});var bg={};Lt(bg,{AnalysisCommands:()=>cn});import Ri from"node:fs/promises";import vg from"node:path";import*as an from"@clack/prompts";var Eg,cn,xi=P(()=>{"use strict";go();To();Gu();cs();Ae();Se();Ro();xa();Td();Rd();Ka();Nc();Cn();Y();xn();Bo();W();K();es();_n();Ze();pm();bt();Eg=`{version:1, commitHash, analyzedAt,
1257
+ architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
1258
+ patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
1259
+ antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}],
1260
+ techDebt:[{description, area, effort:"small|medium|large", impact, priority:"low|medium|high"}],
1261
+ riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
1262
+ projectInsights:[], conventions:[{category, rule, example}],
1263
+ commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,cn=class extends he{static{u(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1264
+ `),Xe.init(t);let s=await Ws.build(t,e),n={packageJson:await Xe.readPackageJson(),cargoToml:await Xe.readCargoToml(),goMod:await Xe.readGoMod(),requirements:await Xe.readRequirements(),directories:await Xe.listDirectories(),fileCount:await Xe.countFiles(),gitStats:await Xe.getGitStats(),gitLog:await Xe.getGitLog(20),hasDockerfile:await Xe.fileExists("Dockerfile"),hasDockerCompose:await Xe.fileExists("docker-compose.yml"),hasReadme:await Xe.fileExists("README.md"),hasTsconfig:await Xe.fileExists("tsconfig.json"),hasViteConfig:await Xe.fileExists("vite.config.ts")||await Xe.fileExists("vite.config.js"),hasNextConfig:await Xe.fileExists("next.config.js")||await Xe.fileExists("next.config.mjs")},o=dm(n,t),i=await I.getProjectId(t),a=s.paths.analysis||R.getFilePath(i,"analysis","repo-summary.md");await Ri.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let l=await(mt(),lt(Mt)).getActiveProvider(),d=await je.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${R.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1265
+ `),console.log(`\u{1F4C4} Full report: ${R.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${l.contextFile}
1266
+ `),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 I.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 Qs.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(ue(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=vg.join(o,"context","CLAUDE.md"),c=null;try{c=await Ri.readFile(a,"utf-8")}catch{}let l=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!l){l||f.spin("Analyzing changes...");let p=await Qs.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}):l?(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 Ri.readFile(a,"utf-8")}catch{m=""}let g=Pd(c,m);if(l||f.stop(),!g.hasChanges)return t.md?(console.log(L(ue("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):l?(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=u(async()=>{c!=null&&await Ri.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let y=[];for(let A of g.added)y.push(`Added: ${A.name} (${A.lineCount} lines)`);for(let A of g.modified)y.push(`Modified: ${A.name} (${A.lineCount} lines)`);for(let A of g.removed)y.push(`Removed: ${A.name} (${A.lineCount} lines)`);let E=L("## Sync Preview",y.length>0?X("Changes",De(y)):"No section changes.",Oe({"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(l){await h();let y={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: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(Cd(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await an.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(an.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(`
1267
+ ${xd(g)}`);let y=await an.confirm({message:"Apply these changes?",initialValue:!0});if(an.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"),Gc(p,i)}t.md||f.spin("Syncing project...");let d=await Qs.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 D=await Qe.diff(n);D?.hasChanges&&(g=Ca(D))}catch{}let h=d.git.recentCommits[0]?.hash??null,S=h&&Wt.isCurrent(n,h),y=null;if(!S)try{let D=await Ba(n,e,d.git,d.stats);y=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Eg,"```","### Data","```json",JSON.stringify(D),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
1268
+ `)}catch{y="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=ni("sync",!0),A=d.syncMetrics?.indexes,F={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(A?.bm25Files){let D=A.bm25Files*(A.bm25AvgTokens||0);F["Tokens indexed"]=`${Math.round(D/1e3)}K`,F["Import edges"]=A.importEdges||0,F["Co-change commits"]=A.cochangeCommits||0}let J=null;try{let N=(await I.readGlobalConfig(n))?.integrations?.obsidian;N?.vaultPath&&(J=`### Obsidian
1269
+ Configured: \`${N.vaultPath}\`
1270
+ Write \`_insights.md\` to vault after analysis.`)}catch{}let k=L(ue("Sync Complete"),Oe(F),g,d.git.hasChanges?Hc("Uncommitted changes detected"):null,y,J,oe(E.map(D=>({label:D.desc,command:D.cmd}))));return console.log(k),{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",`> ${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 I.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&&Wt.isCurrent(n,i))return t.md?console.log(L(ue("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 Ba(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Eg,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:w(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.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."}:(Wt.save(o,i),s.md?console.log(L(ue("LLM Analysis Saved"),Oe({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 I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Wt.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=[ue(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(X("Architecture Insights",De(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(X(`Patterns (${o.patterns.length})`,De(a.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(X(`Anti-Patterns (${o.antiPatterns.length})`,De(a.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(X(`Tech Debt (${o.techDebt.length})`,De(a.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}o.conventions.length>0&&i.push(X("Conventions",De(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:w(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await ms.getSummary(n),i=await ms.getDailyStats(n,30),a=await cm(n),c=await it.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(m)),{success:!0,data:m}}let l="Unknown";try{l=T.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await ms.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: ${l.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: ${On(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${xo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Bc(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=lm(i);if(console.log(` ${m} ${On(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=um(o,i,l,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:",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 I.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=_o(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Qe.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 l=vg.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: ${l}`,Oe({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?X("Analysis",De(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=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 I.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 Qe.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(Ca(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(nd(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 I.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 Qe.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 I.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 Qe.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(ue("Analysis Rolled Back"),Oe({"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 I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Qe.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 I.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=T.getDoc(n,"project")?.repoPath||e}catch{}let i=await Qe.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",l=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${l}`)}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 or(r){return Buffer.from(`${JSON.stringify(r)}
1271
+ `)}var Fe,Lg,Fg,Jl=P(()=>{"use strict";Fe={runDir:u(()=>`${process.env.HOME||vt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:u(()=>`${Fe.runDir()}/daemon.sock`,"socket"),pid:u(()=>`${Fe.runDir()}/daemon.pid`,"pid"),log:u(()=>`${Fe.runDir()}/daemon.log`,"log")},Lg=1800*1e3,Fg=1024*1024;u(or,"encodeMessage")});var Wg={};Lt(Wg,{executeViaDaemon:()=>mb,forceKillDaemon:()=>fb,getDaemonStatus:()=>pb,isDaemonRunning:()=>Ug,sendRequest:()=>qr,spawnDaemon:()=>Hg,stopDaemon:()=>gb});import Oi from"node:crypto";import tt from"node:fs";import{connect as db}from"node:net";async function Ug(){let r=Fe.socket();if(!tt.existsSync(r))return!1;try{return(await qr({id:Oi.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{tt.unlinkSync(r)}catch{}return!1}}async function pb(){let r=Fe.socket(),e=Fe.pid();if(!tt.existsSync(r))return{running:!1};try{let t=await qr({id:Oi.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return tt.existsSync(e)?{running:!1,pid:parseInt(tt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function qr(r){return new Promise((e,t)=>{let s=Fe.socket(),n=db(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(or(r))}),n.on("data",c=>{o+=c.toString();let l=o.indexOf(`
1272
+ `);if(l!==-1){let d=o.slice(0,l);o=o.slice(l+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 mb(r,e,t,s,n,o=!0){let i=Fe.socket();if(!tt.existsSync(i))return o&&Hg().catch(()=>{}),null;try{return await qr({id:Oi.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function gb(){try{return(await qr({id:Oi.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function fb(){let r=Fe.pid(),e=Fe.socket(),t=!1;if(tt.existsSync(r)){let s=parseInt(tt.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{tt.existsSync(r)&&tt.unlinkSync(r)}catch{}try{tt.existsSync(e)&&tt.unlinkSync(e)}catch{}return t}async function Hg(){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(tt.existsSync(t))o=t,i="bun";else if(tt.existsSync(s))o=s,i=ha()?"bun":"node";else if(tt.existsSync(n))o=n,i=ha()?"bun":"node";else return!1;let a=Fe.runDir();tt.mkdirSync(a,{recursive:!0});let c=Fe.log(),l=tt.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",l,l],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),tt.closeSync(l);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Ug())return!0;return!1}var qg=P(()=>{"use strict";vr();Jl();u(Ug,"isDaemonRunning");u(pb,"getDaemonStatus");u(qr,"sendRequest");u(mb,"executeViaDaemon");u(gb,"stopDaemon");u(fb,"forceKillDaemon");u(Hg,"spawnDaemon")});import Ue from"node:fs";import{createServer as dT}from"node:net";xi();go();Ae();Ka();import HS from"node:fs/promises";import WS from"node:path";Y();var Dl=class{static{u(this,"ContextZoneStorage")}recordTransition(e,t,s){T.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
1273
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){T.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
1274
+ VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return T.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=T.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
1231
1275
  WHERE project_id = ? AND timestamp >= ?
1232
- 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
1233
- 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}}},og=new hl;te();ws();Ht();Hs();ft();U();q();Vs();Qe();xt();Ce();ye();U();q();var yl=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 j.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:S()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:S()};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:S()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:S()};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()}},F=new yl;var Mn=class extends ke{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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=CS.basename(t),a=await O.getCurrentTask(o),c=await pe.getActiveTasks(o),u=await Ye.getRecent(o,5),d=await Ue.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=ds(m),g=[];try{let k=p.toISOString();g=P.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",k).map(R=>({...JSON.parse(R.data),timestamp:R.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(k=>k.action==="task_completed").length,featuresShipped:g.filter(k=>k.action==="feature_shipped").length,totalActions:g.length};console.log(`
1276
+ GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let l of n)o[l.zone_to]=l.cnt,i+=l.cnt;let c=T.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
1277
+ 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}}},Hr=new Dl;Y();Cs();Nt();Rs();ft();W();K();es();Ze();bt();Ae();Se();W();K();var Il=class{static{u(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=u(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 I.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: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: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 Il;var Bn=class extends he{static{u(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 I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=WS.basename(t),a=await M.getCurrentTask(o),c=await re.getActiveTasks(o),l=await Je.getRecent(o,5),d=await Pe.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} ${l.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=ws(p),g=[];try{let y=m.toISOString();g=T.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",y).map(A=>({...JSON.parse(A.data),timestamp:A.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(`
1234
1278
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1235
- `),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 b=this._generateSparkline(g,m);return console.log(`
1236
- Activity: ${b}
1237
- `),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await Is.build(t),p=null;try{p=await PS.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
1279
+ `),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(`
1280
+ Activity: ${S}
1281
+ `),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let p=await Ws.build(t),m=null;try{m=await HS.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
1238
1282
  \u{1F5FA}\uFE0F ROADMAP - ${i}
1239
- `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1240
- `);else{let g=p.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,b)=>{let k=h.split(`
1241
- `)[0].trim();console.log(` ${b+1}. ${k}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1242
- `),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${Qt(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let E=k.priority?` [${k.priority}]`:"";return`${k.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${E}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let E=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${E?` (${E})`:""}`}):["Nothing shipped yet"],h=null;try{let k=og.getSummary(o,7);(k.smartPercent<100||k.compactions>0)&&(h=`### Context Health (7d)
1243
- `+Er(["Zone","%"],[["Smart",`${k.smartPercent}%`],["Warning",`${k.warningPercent}%`],["Dumb",`${k.dumbPercent}%`],["Compactions",`${k.compactions}`]]))}catch{}let b=L(`## Dashboard: ${i}`,Y("Current Focus",m),Y(`Queue (${c.length})`,$e(p,!0)),Y("Recent Ships",$e(g)),Y("Ideas",`${d.length} pending`),h,de([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
1283
+ `),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1284
+ `);else{let g=m.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,S)=>{let y=h.split(`
1285
+ `)[0].trim();console.log(` ${S+1}. ${y}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1286
+ `),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${rs(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(y=>{let E=y.priority?` [${y.priority}]`:"";return`${y.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${E}`}):["Queue is empty"],g=l.length>0?l.slice(0,5).map(y=>{let E=y.shippedAt?new Date(y.shippedAt).toLocaleDateString():"";return`${y.name}${E?` (${E})`:""}`}):["Nothing shipped yet"],h=null;try{let y=Hr.getSummary(o,7);(y.smartPercent<100||y.compactions>0)&&(h=`### Context Health (7d)
1287
+ `+js(["Zone","%"],[["Smart",`${y.smartPercent}%`],["Warning",`${y.warningPercent}%`],["Dumb",`${y.dumbPercent}%`],["Compactions",`${y.compactions}`]]))}catch{}let S=L(`## Dashboard: ${i}`,X("Current Focus",p),X(`Queue (${c.length})`,De(m,!0)),X("Recent Ships",De(g)),X("Ideas",`${d.length} pending`),h,oe([{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(`
1244
1288
  \u{1F4CA} DASHBOARD - ${i}
1245
- `),console.log("\u2550".repeat(50));let m=ko(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1289
+ `),console.log("\u2550".repeat(50));let p=_o(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
1246
1290
  ${g}`),console.log(`
1247
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=Qt(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1248
- \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,b)=>{let k=h.priority?`[${h.priority}]`:"";console.log(` ${b+1}. ${h.description.slice(0,40)} ${k}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1249
- \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let b=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${b?`(${b})`:""}`)}),console.log(`
1291
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=rs(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1292
+ \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,S)=>{let y=h.priority?`[${h.priority}]`:"";console.log(` ${S+1}. ${h.description.slice(0,40)} ${y}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
1293
+ \u{1F680} RECENT SHIPS`),l.length===0?console.log(" Nothing shipped yet"):l.slice(0,3).forEach(h=>{let S=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${S?`(${S})`:""}`)}),console.log(`
1250
1294
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1251
1295
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1252
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:S()}),{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(`
1296
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:b()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:l.length,ideasCount:d.length}}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1253
1297
  PRJCT COMMANDS
1254
- `),console.log("=".repeat(50));let i=F.getAllCategories(),a=F.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1255
- ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1298
+ `),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.getAll(),c={};return a.forEach(l=>{l.deprecated||(c[l.group]||(c[l.group]=[]),c[l.group].push(l))}),Object.entries(c).forEach(([l,d])=>{let p=i.get(l);console.log(`
1299
+ ${p?.title||l}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
1256
1300
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1257
- `),{success:!0,topic:"overview"}}let s=F.getByName(e);if(s){if(console.log(`
1301
+ `),{success:!0,topic:"overview"}}let s=U.getByName(e);if(s){if(console.log(`
1258
1302
  \u{1F4DA} HELP: /p:${s.name}
1259
1303
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
1260
1304
  Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
@@ -1264,9 +1308,9 @@ ${"\u2550".repeat(50)}
1264
1308
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1265
1309
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1266
1310
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1267
- `),{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)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}};Bc();Ce();ye();ft();U();Vs();import xS from"node:fs/promises";import AS from"node:path";var en=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 j.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),d=await O.read(c),m=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,p=null;if(i)try{p=await Yo.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${y(b)}`)}let g=await this.loadRepoAnalysis(u),h={projectId:c,globalPath:u,currentTask:m,domains:p?.detectedDomains||[],primaryDomain:p?.primaryDomain||null,subtasks:p?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(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(Y("Project",Pc(Ec("ID",e.projectId),Ec("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Pr({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(`
1268
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(Y("Stack",rt({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=AS.join(e,"analysis","repo-analysis.json"),s=await xS.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 D(t),null}}},m_=new en;qo();xt();Ce();ye();Ws();te();ws();Ht();U();q();Qe();import wl from"node:fs";import ig from"node:path";async function mi(r){let e=await j.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;$.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 pi(r){let e=await j.getProjectId(r);if(!e)return;let s=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;$.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}l(pi,"cleanupMemoryInternal");async function kl(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 j.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=$.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;$.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 Ue.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 pe.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 pi(e),await Et.log(e,"cleanup_performed",{items:n.length,timestamp:S()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(y(t)),{success:!1,error:y(t)}}}l(kl,"cleanup");var RS=[/^qa-/,/^nonexistent-/,/^test-/];async function ag(r){let e=A.getGlobalBasePath(),t=ig.join(e,"projects");if(!wl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=wl.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=ig.join(t,a);if(!RS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{$.close(a),wl.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(`
1269
- `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(ag,"cleanupProjects");Ce();ye();Ws();U();q();B();Qe();import cg from"node:path";async function Sl(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 j.getProjectId(t),a=cg.join(A.getGlobalProjectPath(i),"planning","designs");await Ve(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1311
+ `),{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 l=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>=l&&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("")}};al();Ae();Se();ft();W();es();import qS from"node:fs/promises";import GS from"node:path";var ln=class{static{u(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 I.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,l=R.getGlobalProjectPath(c),d=await M.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 gi.execute(o,i,t)}catch(S){console.error(`Warning: Orchestrator failed: ${w(S)}`)}let g=await this.loadRepoAnalysis(l),h={projectId:c,globalPath:l,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)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}formatContextMd(e){let t=[];if(t.push(X("Project",si(ti("ID",e.projectId),ti("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push($n({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(`
1312
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(X("Stack",Oe({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=GS.join(e,"analysis","repo-analysis.json"),s=await qS.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 j(t),null}}},AM=new ln;ui();bt();Ae();Se();Ys();Y();Cs();Nt();W();K();Ze();import $l from"node:fs";import Pg from"node:path";async function Ai(r){let e=await I.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;_.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}}u(Ai,"cleanupMemory");async function ji(r){let e=await I.getProjectId(r);if(!e)return;let s=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;_.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}u(ji,"cleanupMemoryInternal");async function _l(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Ai(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await I.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=_.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;_.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 Pe.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 re.getActiveTasks(s)).filter(l=>l.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 ji(e),await Rt.log(e,"cleanup_performed",{items:n.length,timestamp:b()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(w(t)),{success:!1,error:w(t)}}}u(_l,"cleanup");var BS=[/^qa-/,/^nonexistent-/,/^test-/];async function Cg(r){let e=R.getGlobalBasePath(),t=Pg.join(e,"projects");if(!$l.existsSync(t))return{success:!0,message:"No projects directory found"};let s=$l.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Pg.join(t,a);if(!BS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{_.close(a),$l.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(`
1313
+ `)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}u(Cg,"cleanupProjects");Ae();Se();Ys();W();K();B();Ze();import xg from"node:path";async function Ml(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 I.getProjectId(t),a=xg.join(R.getGlobalProjectPath(i),"planning","designs");await Ke(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
1270
1314
 
1271
1315
  *Use templates/design/architecture.md for full design*
1272
1316
  `;break;case"api":c=`# API Design: ${o}
@@ -1281,14 +1325,14 @@ ${"\u2550".repeat(50)}
1281
1325
  `;break;case"flow":c=`# Flow Design: ${o}
1282
1326
 
1283
1327
  *Use templates/design/flow.md for full design*
1284
- `;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=cg.join(a,u);return await Tt(d,c),await Et.log(t,"design_created",{type:s,target:o,timestamp:S()}),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(Sl,"design");Ce();ye();Ws();import _n from"node:path";Yt();te();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:"*"};Fs();es();var bl=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Nd.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"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,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 H.error("Event callback error:",s),s}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ie(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())}},it=new bl,Dr={sessionStarted:l(r=>it.emit(Ge.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>it.emit(Ge.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>it.emit(Ge.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>it.emit(Ge.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>it.emit(Ge.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>it.emit(Ge.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>it.emit(Ge.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>it.emit(Ge.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>it.emit(Ge.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>it.emit(Ge.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>it.emit(Ge.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>it.emit(Ge.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>it.emit(Ge.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>it.emit(Ge.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>it.emit(Ge.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>it.emit(Ge.ANALYSIS_COMPLETED,r),"analysisCompleted")};Ce();te();U();Le();vt();q();var lg=J;function gi(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(gi,"calculateDuration");function ug(r){return ct(r*1e3)}l(ug,"formatDuration");function dg(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(dg,"rowToSession");var fi=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 j.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 lg()}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?dg(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 Dr.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 Dr.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=gi(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Dr.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=gi(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 Dr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return gi(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await _(`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 _(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
1285
- `),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){D(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)
1286
- 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(dg)}async logEvent(e,t){try{P.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return ug(e)}};U();q();B();Qe();async function Tl(r=process.cwd()){try{if(!await j.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 fi(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(`
1328
+ `;break}let l=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=xg.join(a,l);return await Ct(d,c),await Rt.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(w(s)),{success:!1,error:w(s)}}}u(Ml,"design");Ae();Se();Ys();import Vn from"node:path";ns();Y();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:"*"};Ks();is();var Ol=class{static{u(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=sp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(l=>this.executeCallback(l,n)))).forEach(l=>{l.status==="rejected"&&q.error(`Event listener error for ${e}:`,l.reason)});let a=this.onceListeners.get(e);if(a){for(let l of a)await this.executeCallback(l,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(ze.ALL);if(c)for(let l of c)await this.executeCallback(l,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 q.error("Event callback error:",s),s}}async logEvent(e){try{T.appendEvent(this.projectId,e.type,e)}catch(t){q.debug("Failed to log event:",de(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},ct=new Ol,Wr={sessionStarted:u(r=>ct.emit(ze.SESSION_STARTED,r),"sessionStarted"),sessionPaused:u(r=>ct.emit(ze.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:u(r=>ct.emit(ze.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:u(r=>ct.emit(ze.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:u(r=>ct.emit(ze.TASK_CREATED,r),"taskCreated"),taskCompleted:u(r=>ct.emit(ze.TASK_COMPLETED,r),"taskCompleted"),featureAdded:u(r=>ct.emit(ze.FEATURE_ADDED,r),"featureAdded"),featureShipped:u(r=>ct.emit(ze.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:u(r=>ct.emit(ze.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:u(r=>ct.emit(ze.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:u(r=>ct.emit(ze.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:u(r=>ct.emit(ze.COMMIT_CREATED,r),"commitCreated"),pushCompleted:u(r=>ct.emit(ze.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:u(r=>ct.emit(ze.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:u(r=>ct.emit(ze.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:u(r=>ct.emit(ze.ANALYSIS_COMPLETED,r),"analysisCompleted")};Ae();Y();W();We();xt();K();var Rg=z;function Di(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)}u(Di,"calculateDuration");function Ag(r){return ut(r*1e3)}u(Ag,"formatDuration");function jg(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)}}u(jg,"rowToSession");var Ii=class{static{u(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await I.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");T.getDb(this.projectId),this.initialized=!0}generateId(){return Rg()}async getCurrent(){this.initialized||await this.initialize();let e=T.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?jg(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 Wr.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 Wr.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=Di(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Wr.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=Di(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 Wr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Di(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(`
1329
+ `),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){j(s)||console.error(`Metrics calculation warning: ${w(s)}`)}return t}saveSession(e){T.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1330
+ 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(),T.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(jg)}async logEvent(e,t){try{T.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Ag(e)}};W();K();B();Ze();async function Nl(r=process.cwd()){try{if(!await I.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(`
1287
1331
  Found abandoned session:
1288
- `),console.log(` Task: ${n.task}`),n.startedAt){let o=Qt(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1332
+ `),console.log(` Task: ${n.task}`),n.startedAt){let o=rs(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1289
1333
  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
1290
- `),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Tl,"recover");async function vl(r=process.cwd()){try{f.spin("creating undo point...");let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots");await Ve(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=_n.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await Ie(c);u=JSON.parse(d)}catch(d){if(!D(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 Tt(c,JSON.stringify(u,null,2)),await Et.log(r,"undo_performed",{snapshotId:a,timestamp:S()}),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(vl,"undo");async function El(r=process.cwd()){try{f.spin("restoring changes...");let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots"),s=_n.join(t,"history.json"),n;try{let i=await Ie(s);n=JSON.parse(i)}catch(i){if(D(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(`
1291
- `).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 Tt(s,JSON.stringify(n,null,2)),await Et.log(r,"redo_performed",{timestamp:S()}),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(El,"redo");async function Pl(r=process.cwd()){try{let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots"),s=_n.join(t,"history.json"),n;try{let o=await Ie(s);n=JSON.parse(o)}catch(o){if(D(o)||o instanceof SyntaxError)return console.log(`
1334
+ `),{success:!0,session:n}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}u(Nl,"recover");async function Ll(r=process.cwd()){try{f.spin("creating undo point...");let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Vn.join(R.getGlobalProjectPath(e),"snapshots");await Ke(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=Vn.join(t,"history.json"),l={snapshots:[],current:-1};try{let d=await _e(c);l=JSON.parse(d)}catch(d){if(!j(d)&&!(d instanceof SyntaxError))throw d}return l.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),l.current=l.snapshots.length-1,await Ct(c,JSON.stringify(l,null,2)),await Rt.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:w(o)}}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}u(Ll,"undo");async function Fl(r=process.cwd()){try{f.spin("restoring changes...");let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Vn.join(R.getGlobalProjectPath(e),"snapshots"),s=Vn.join(t,"history.json"),n;try{let i=await _e(s);n=JSON.parse(i)}catch(i){if(j(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(`
1335
+ `).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 Ct(s,JSON.stringify(n,null,2)),await Rt.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:w(i)}}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}u(Fl,"redo");async function Ul(r=process.cwd()){try{let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Vn.join(R.getGlobalProjectPath(e),"snapshots"),s=Vn.join(t,"history.json"),n;try{let o=await _e(s);n=JSON.parse(o)}catch(o){if(j(o)||o instanceof SyntaxError)return console.log(`
1292
1336
  SNAPSHOT HISTORY
1293
1337
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1294
1338
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1296,40 +1340,96 @@ ${"\u2550".repeat(50)}
1296
1340
  `),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1297
1341
  `)):(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
1298
1342
  `)),console.log(`${"=".repeat(50)}
1299
- `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Pl,"history");var On=class extends ke{static{l(this,"MaintenanceCommands")}_cleanupMemory=mi;_cleanupMemoryInternal=pi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?kl(e,t):s}async cleanupProjects(e={}){return ag(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Sl(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Tl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?vl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?El(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Pl(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 xn(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(`
1300
- `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};Ce();vt();Ht();$o();var Cl=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await pe.getActiveTasks(e),o=t.includeBacklog?await pe.getBacklog(e):[],i=[...n,...o],c=jo(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
1343
+ `),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(w(e)),{success:!1,error:w(e)}}}u(Ul,"history");var Jn=class extends he{static{u(this,"MaintenanceCommands")}_cleanupMemory=Ai;_cleanupMemoryInternal=ji;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?_l(e,t):s}async cleanupProjects(e={}){return Cg(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Ml(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nl(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?Fl(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ul(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 Ln(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(l=>({path:l.path,score:Number(l.score.toFixed(3)),reasons:l.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c)),{success:!0};if(s.md){let l=[];if(l.push("## Enrichment Context"),l.push(""),l.push(`- Query: ${o}`),i&&l.push(`- Issue ID: ${i}`),l.push(`- Candidate files: ${c.files.length}`),l.push(""),l.push("### Suggested Files"),l.push(""),c.files.length===0)l.push("- No relevant files found.");else for(let d of c.files)l.push(`- \`${d.path}\` (${d.score})`);return l.push(""),l.push("### Publish"),l.push(""),l.push("- Update description via MCP"),l.push("- Add enrichment as comment via MCP"),l.push("- Or keep local only"),console.log(l.join(`
1344
+ `)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};Ae();Se();import Kn from"node:path";Y();Nt();Rs();ft();es();import Be from"node:fs/promises";import H from"node:path";var Hl=class r{static{u(this,"ObsidianExporter")}getProjectPath(e,t){let s=e.projectFolder||t;return H.join(e.vaultPath,"projects",s)}async exportAll(e,t,s){let n=this.getProjectPath(s,t),o=[],i={success:!0,projectFolder:n,exported:{board:0,queue:0,shipped:0,roadmap:0,daily:!1},errors:o};await this.ensureStructure(n);try{i.exported.board=await this.exportBoard(e,n)}catch(a){o.push(`board: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.queue=await this.exportQueue(e,n)}catch(a){o.push(`queue: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.shipped=await this.exportShipped(e,n)}catch(a){o.push(`shipped: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.roadmap=await this.exportRoadmap(e,n)}catch(a){o.push(`roadmap: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.daily=await this.exportDaily(e,n)}catch(a){o.push(`daily: ${a instanceof Error?a.message:String(a)}`)}try{await this.exportIndex(t,n)}catch(a){o.push(`index: ${a instanceof Error?a.message:String(a)}`)}return i.success=o.length===0,i}async ensureStructure(e){let t=["board","queue","shipped","roadmap","architecture","design","research","meetings","notes","daily","retros"];for(let s of t)await Be.mkdir(H.join(e,s),{recursive:!0})}async writeLink(e,t,s){let n=[`projectId: ${t}`,`projectPath: ${s}`,`linkedAt: ${new Date().toISOString()}`].join(`
1345
+ `);await Be.writeFile(H.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await M.read(e),n=H.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,l=c.subtasks||[],d=c.currentSubtaskIndex??0,p={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},m=l.map((y,E)=>{let A=y.status==="completed"?"x":" ",F=E===d&&y.status!=="completed"?" <- current":"";return`- [${A}] ${y.description}${F}`}),g=l.filter(y=>y.status==="completed").length,h=l.length>0?`${g}/${l.length} (${Math.round(g/l.length*100)}%)`:"",S=gs(p,c.description,m.length>0?`## Subtasks
1346
+ ${m.join(`
1347
+ `)}`:null,h?`## Progress
1348
+ ${h}`:null);await Be.writeFile(H.join(n,`${c.id}.md`),S,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let l=c.id||`paused_${Date.now()}`,d={prjct_id:l,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},p=gs(d,c.description,"Status: paused");await Be.writeFile(H.join(n,`${l}.md`),p,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let l={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=gs(l,c.description);await Be.writeFile(H.join(n,`${c.id}.md`),d,"utf-8"),o++}return await this.generateKanbanBoard(s,n),o}async generateKanbanBoard(e,t){let s=["---","kanban-plugin: board","---",""],n=[],o=[],i=[];e.currentTask&&n.push(`- [[${e.currentTask.id}]]`);for(let c of e.activeTasks||[])n.push(`- [[${c.id}]]`);for(let c of e.pausedTasks||[])c.id&&o.push(`- [[${c.id}]]`);let a=e.taskHistory||[];for(let c of a.slice(0,5))i.push(`- [[${c.taskId}]]`);s.push("## In Progress"),s.push(...n.length>0?n:[""]),s.push(""),s.push("## Paused"),s.push(...o.length>0?o:[""]),s.push(""),s.push("## Done"),s.push(...i.length>0?i:[""]),await Be.writeFile(H.join(t,"_kanban.md"),s.join(`
1349
+ `),"utf-8")}async exportQueue(e,t){let s=await re.read(e),n=H.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=gs(a,i.description);await Be.writeFile(H.join(n,`${i.id}.md`),c,"utf-8"),o++}return o}async exportShipped(e,t){let s=await Je.read(e),n=H.join(t,"shipped"),o=0;for(let i of s.shipped){let a={prjct_id:i.id,prjct_type:"shipped",name:i.name,version:i.version,type:i.type,shipped_at:i.shippedAt};i.duration&&(a.duration=i.duration),i.codeMetrics?.filesChanged&&(a.files_changed=i.codeMetrics.filesChanged),i.codeMetrics?.linesAdded&&(a.lines_added=i.codeMetrics.linesAdded),i.codeMetrics?.linesRemoved&&(a.lines_removed=i.codeMetrics.linesRemoved);let c=[];if(i.changes&&i.changes.length>0){let d=i.changes.map(p=>`- ${p.type?`**${p.type}**: `:""}${p.description}`);c.push(`## Changes
1350
+ ${d.join(`
1351
+ `)}`)}if(i.codeMetrics){let d=i.codeMetrics,p=[];d.filesChanged&&p.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&p.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&p.push(`- **Duration**: ${i.duration}`),p.length>0&&c.push(`## Metrics
1352
+ ${p.join(`
1353
+ `)}`)}let l=gs(a,i.name,i.description||null,...c);await Be.writeFile(H.join(n,`${i.id}.md`),l,"utf-8"),o++}return o}async exportRoadmap(e,t){let s=T.getDoc(e,"roadmap");if(!s)return 0;let n=H.join(t,"roadmap"),o=0,i=s.features||[];for(let a of i){let c={prjct_id:a.id,prjct_type:"feature",status:a.status,impact:a.impact,progress:a.progress,updated_at:new Date().toISOString()};a.phase&&(c.phase=a.phase),a.quarter&&(c.quarter=a.quarter),a.dependencies&&a.dependencies.length>0&&(c.dependencies=a.dependencies);let l=(a.tasks||[]).map(p=>`- [${p.completed?"x":" "}] ${p.description}`),d=gs(c,a.name,a.description||null,l.length>0?`## Tasks
1354
+ ${l.join(`
1355
+ `)}`:null);await Be.writeFile(H.join(n,`${a.id}.md`),d,"utf-8"),o++}return await this.generateCanvas(i,n),o}async generateCanvas(e,t){let s={shipped:"4",completed:"4",active:"5",planned:"0"},n=e.map((a,c)=>({id:a.id,type:"text",text:`**${a.name}**
1356
+ Status: ${a.status}${a.quarter?`
1357
+ Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(l=>l.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await Be.writeFile(H.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await M.read(e),n=await re.read(e),o=new Date().toISOString().split("T")[0],i=H.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(p=>!p.completed).length},c=[];if(s.currentTask){let p=s.currentTask,m=p.subtasks||[],g=m.filter(h=>h.status==="completed").length;c.push(`## Active Task
1358
+ **${p.description}**
1359
+ `+(p.branch?`Branch: \`${p.branch}\`
1360
+ `:"")+(m.length>0?`Progress: ${g}/${m.length}`:""))}else c.push(`## Active Task
1361
+ No active task.`);let l=n.tasks.filter(p=>!p.completed).slice(0,5);if(l.length>0){let p=l.map(m=>[m.priority,m.type,m.description]);c.push(`## Queue (Top ${l.length})
1362
+ ${js(["Priority","Type","Description"],p)}`)}let d=gs(a,`Daily: ${o}`,...c);return await Be.writeFile(H.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
1363
+
1364
+ ## Board
1365
+ \`\`\`dataview
1366
+ TABLE status, type, priority
1367
+ FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/board"
1368
+ WHERE prjct_type = "task"
1369
+ SORT priority DESC
1370
+ \`\`\`
1371
+
1372
+ ## Queue (Top 10)
1373
+ \`\`\`dataview
1374
+ TABLE priority, type
1375
+ FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/queue"
1376
+ SORT priority DESC
1377
+ LIMIT 10
1378
+ \`\`\`
1379
+
1380
+ ## Recent Shipped
1381
+ \`\`\`dataview
1382
+ TABLE version, type, duration_hours
1383
+ FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/shipped"
1384
+ SORT shipped_at DESC
1385
+ LIMIT 5
1386
+ \`\`\`
1387
+
1388
+ ## Knowledge Base
1389
+ \`\`\`dataview
1390
+ TABLE file.mtime as "Updated"
1391
+ FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/architecture" OR "${H.basename(H.dirname(t))}/${H.basename(t)}/research"
1392
+ SORT file.mtime DESC
1393
+ LIMIT 10
1394
+ \`\`\`
1395
+ `;await Be.writeFile(H.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=H.resolve(e,t);if(!s.startsWith(H.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=H.relative(e,s).split(H.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=H.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await Be.readFile(o,"utf-8"),a=null,c=i,l=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return l&&(a=this.parseYamlFrontmatter(l[1]),c=l[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await Be.mkdir(H.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:l}=await Promise.resolve().then(()=>(es(),nm));c=`${l(o)}
1396
+
1397
+ ${n}`}await Be.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],l=s.toLowerCase(),d=l.split(/\s+/).filter(m=>m.length>1),p=await this.walkDir(i);for(let m of p)if(r.ALLOWED_EXTENSIONS.has(H.extname(m).toLowerCase()))try{let g=await Be.readFile(m,"utf-8"),h=g.toLowerCase(),S=H.relative(o,m),y=0;for(let E of d){let A=0,F=0;for(;(A=h.indexOf(E,A))!==-1;)F++,A+=E.length;F>0&&(y+=Math.log(1+F)),S.toLowerCase().includes(E)&&(y+=2)}if(y>0){let E=g.match(/^#\s+(.+)$/m),A=E?E[1]:H.basename(m,H.extname(m)),F=h.indexOf(l.split(/\s+/)[0]),J=Math.max(0,F-50),k=Math.min(g.length,F+150),D=(J>0?"...":"")+g.slice(J,k).replace(/\n/g," ").trim()+(k<g.length?"...":"");c.push({path:S,title:A,excerpt:D,score:y})}}catch{}return c.sort((m,g)=>g.score-m.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await Be.readdir(o,{withFileTypes:!0}),a=[];for(let c of i){if(r.BLOCKED_DIRS.has(c.name)||c.name.startsWith("."))continue;let l=s?`${s}/${c.name}`:c.name;if(c.isDirectory())a.push({path:l,name:c.name,isDir:!0});else if(r.ALLOWED_EXTENSIONS.has(H.extname(c.name).toLowerCase())){let d=await Be.stat(H.join(o,c.name));a.push({path:l,name:c.name,isDir:!1,size:d.size})}}return a}async getVaultStats(e,t){let s=this.getProjectPath(e,t),n={},o=0,i=0,a=await this.walkDir(s);for(let c of a){if(!r.ALLOWED_EXTENSIONS.has(H.extname(c).toLowerCase()))continue;let l=H.relative(s,c),d=H.dirname(l).split(H.sep)[0]||".";n[d]=(n[d]||0)+1,o++;try{let p=await Be.stat(c);i+=p.size}catch{}}return{totalNotes:o,folders:n,totalSize:i}}parseYamlFrontmatter(e){let t={};for(let s of e.split(`
1398
+ `)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await Be.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=H.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},zn=new Hl;B();es();Ze();bt();var Xn=class extends he{static{u(this,"ObsidianCommands")}async obsidian(e=null,t=process.cwd()){let s=(e||"status").split(" ").filter(Boolean),n=s[0],o=s.includes("--md"),i,a=s.indexOf("--vault-path");a!==-1&&s[a+1]&&(i=s[a+1]);let c=!s.includes("--no-auto-export"),l={md:o,vaultPath:i,autoExport:c};switch(n){case"setup":return this.setup(t,l);case"export":return this.export(t,l);case"status":return this.status(t,l);default:return{success:!1,message:l.md?L(Vt("error",`Unknown subcommand: ${n}. Use: setup, export, status`)):`Unknown subcommand: ${n}`}}}async setup(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=t.vaultPath;if(!o){let g="Vault path required. Usage: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(g),{success:!1,message:t.md?L(Vt("error",g)):""}}if(!await C(o)){let g=`Vault path does not exist: ${o}`;return t.md||f.fail(g),{success:!1,message:t.md?L(Vt("error",g)):""}}let i=Kn.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=R.getGlobalProjectPath(n),l=Kn.join(c,"project.json"),d=await Te(l)||{},p=d.integrations||{};p.obsidian=a,d.integrations=p,await le(l,d);let m=zn.getProjectPath(a,i);return await zn.ensureStructure(m),await zn.writeLink(m,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?L(ue("Obsidian Linked"),Oe({Vault:o,"Project folder":`projects/${i}/`,"Auto-export":a.autoExport?"enabled":"disabled"}),oe([{label:"Export project data to vault",command:"prjct obsidian export"},{label:"Check integration status",command:"prjct obsidian status"}])):""}}async export(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o){let c="Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(c),{success:!1,message:t.md?L(Vt("error",c)):""}}let i=Kn.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await zn.exportAll(n,i,o);if(!t.md)if(a.success)f.done("Export complete"),f.info(`Board: ${a.exported.board} tasks`),f.info(`Queue: ${a.exported.queue} items`),f.info(`Shipped: ${a.exported.shipped} items`),f.info(`Roadmap: ${a.exported.roadmap} features`),f.info(`Daily: ${a.exported.daily?"generated":"skipped"}`);else{f.warn("Export completed with errors");for(let c of a.errors)f.fail(c)}return{success:a.success,message:t.md?L(ue("Obsidian Export",a.success?"All sections exported":"Completed with errors"),Oe({Board:`${a.exported.board} tasks`,Queue:`${a.exported.queue} items`,Shipped:`${a.exported.shipped} items`,Roadmap:`${a.exported.roadmap} features`,Daily:a.exported.daily?"generated":"skipped"}),a.errors.length>0?`### Errors
1399
+ ${a.errors.map(c=>`- ${c}`).join(`
1400
+ `)}`:null,oe([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.warn("Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault"),{success:!0,message:t.md?L(Vt("info","Obsidian not configured"),oe([{label:"Configure Obsidian vault",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=Kn.basename(e),a=zn.getProjectPath(o,i),c=await C(Kn.join(a,".prjct-link.yml"));return t.md||(f.done("Obsidian configured"),f.info(`Vault: ${o.vaultPath}`),f.info(`Project folder: projects/${o.projectFolder||i}/`),f.info(`Auto-export: ${o.autoExport?"enabled":"disabled"}`),f.info(`Link file: ${c?"present":"missing"}`)),{success:!0,message:t.md?L(ue("Obsidian Status"),Oe({Vault:o.vaultPath,"Project folder":`projects/${o.projectFolder||i}/`,"Auto-export":o.autoExport?"enabled":"disabled","Link file":c?"present":"missing"}),oe([{label:"Export data to vault",command:"prjct obsidian export"}])):""}}async getObsidianConfig(e){let t=R.getGlobalProjectPath(e),s=Kn.join(t,"project.json"),n=await Te(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}};Ae();xt();Nt();Ko();var Wl=class{static{u(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await re.getActiveTasks(e),o=t.includeBacklog?await re.getBacklog(e):[],i=[...n,...o],c=zo(i).filter(l=>!l.completed).slice(0,s).map(l=>({id:l.id,title:l.description,priority:l.priority,source:"queue",queueTaskId:l.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
1301
1401
  `)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
1302
- `)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,m=a[u.priority?.toLowerCase()||"none"]??4;return d-m})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
1303
- `)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},DS=new Cl,Nn=DS;lr();ft();U();Qe();xt();var Ln=null,tn=class extends ke{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:y(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t),i=this.slugify(e),a=await Ot.create(t,i,{branch:s.branch});await Ot.setup(a.path,t);let c=J();return await O.startTaskInWorkspace(o,{id:J(),description:e,sessionId:J(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:y(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await j.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Ot.create(t,a);await Ot.setup(c.path,t);let u=J();await O.startTaskInWorkspace(n,{id:J(),description:i,sessionId:J(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${y(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:y(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=Nn.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=Nn.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await Nn.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Ln=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Nn.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Ln||Ln.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Ln.items){let i=Nn.slugify(o);try{let a=await Ot.create(t,i);await Ot.setup(a.path,t);let c=J();await O.startTaskInWorkspace(e,{id:J(),description:o.title,sessionId:J(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Ln.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${y(a)}`)}}Ln=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([O.getActiveTasks(e),Ot.list(t)]),o=await O.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
1304
- Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(p=>p.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",m=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${m}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
1305
- Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await O.getActiveTasks(e),n=await Ot.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Ot.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},jO=new tn;Ce();import Re from"chalk";te();var IS=BigInt(300*1e9),xl=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>IS&&this.marks.delete(t)}recordTiming(e,t,s,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)$.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){$.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){$.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 $.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,h)=>g+h,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=n.filter(p=>"metric"in p&&p.metric==="heap_used"),c=n.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),h=c.map(b=>b.value);o.memory={avgHeapMB:p(g.reduce((b,k)=>b+k,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:h.length>0?p(h.reduce((b,k)=>b+k,0)/h.length):0}}let u=n.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=n.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=n.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let h=g.context?.command||"unknown";p[h]||(p[h]=[]),p[h].push(g.value)}o.commandDurations={};for(let[g,h]of Object.entries(p))o.commandDurations[g]={avg:Math.round(h.reduce((b,k)=>b+k,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},jS=new xl,mg=jS;U();Qe();xt();var vs={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function hi(r,e,t){return t==="below"?r<=e?Re.green("\u2713"):Re.yellow("\u26A0"):r>=e?Re.green("\u2713"):Re.yellow("\u26A0")}l(hi,"statusIcon");var Fn=class extends ke{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 j.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 mg.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1306
- ${Re.dim("No performance data yet.")}`),console.log(`${Re.dim("Metrics are collected automatically as you use the CLI.")}
1402
+ `)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,l)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,p=a[l.priority?.toLowerCase()||"none"]??4;return d-p})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
1403
+ `)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},VS=new Wl,Yn=VS;Tr();ft();W();Ze();bt();var Qn=null,un=class extends he{static{u(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:w(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t),i=this.slugify(e),a=await Ut.create(t,i,{branch:s.branch});await Ut.setup(a.path,t);let c=z();return await M.startTaskInWorkspace(o,{id:z(),description:e,sessionId:z(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:w(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Ut.create(t,a);await Ut.setup(c.path,t);let l=z();await M.startTaskInWorkspace(n,{id:z(),description:i,sessionId:z(),workspaceId:l,worktreePath:c.path},l),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${w(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:w(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=Yn.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=Yn.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await Yn.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Qn=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Yn.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Qn||Qn.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Qn.items){let i=Yn.slugify(o);try{let a=await Ut.create(t,i);await Ut.setup(a.path,t);let c=z();await M.startTaskInWorkspace(e,{id:z(),description:o.title,sessionId:z(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Qn.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${w(a)}`)}}Qn=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([M.getActiveTasks(e),Ut.list(t)]),o=await M.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
1404
+ Parallel sessions (${s.length}):`);for(let a of s){let l=n.find(m=>m.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",p=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${l} | ${a.description}${p}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
1405
+ Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await M.getActiveTasks(e),n=await Ut.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Ut.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},gN=new un;Ae();import Ie from"chalk";Y();var JS=BigInt(300*1e9),ql=class{static{u(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>JS&&this.marks.delete(t)}recordTiming(e,t,s,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)_.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){_.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){_.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 _.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=u(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,y)=>S+y,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:h.length>0?m(h.reduce((S,y)=>S+y,0)/h.length):0}}let l=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(l.length>0){let m=l.filter(g=>g.receivedSync).length;o.contextCorrectness={total:l.length,receivedSync:m,rate:Math.round(m/l.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,y)=>S+y,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},zS=new ql,Dg=zS;W();Ze();bt();var $s={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function $i(r,e,t){return t==="below"?r<=e?Ie.green("\u2713"):Ie.yellow("\u26A0"):r>=e?Ie.green("\u2713"):Ie.yellow("\u26A0")}u($i,"statusIcon");var Zn=class extends he{static{u(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.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 Dg.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1406
+ ${Ie.dim("No performance data yet.")}`),console.log(`${Ie.dim("Metrics are collected automatically as you use the CLI.")}
1307
1407
  `),{success:!0,message:"No data"};if(console.log(`
1308
- ${Re.cyan("Performance Report")} ${Re.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=hi(i.startup.avg,vs.startup.max,"below");console.log(` Startup: avg ${Re.bold(`${i.startup.avg}ms`)} ${Re.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Re.dim(`target: <${vs.startup.max}ms`)}`)}if(i.memory){let c=hi(i.memory.peakHeapMB,vs.heapMB.max,"below");console.log(` Memory: avg ${Re.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Re.dim(`target: <${vs.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=hi(i.contextCorrectness.rate,vs.contextRate.min,"above");console.log(` Context: ${Re.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Re.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Re.dim(`target: ${vs.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=hi(i.subtaskHandoff.rate,vs.handoffRate.min,"above");console.log(` Handoff: ${Re.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Re.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Re.dim(`target: ${vs.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1309
- ${Re.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Re.bold(`${u.avg}ms`)} ${Re.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)}}}};li();ss();Ce();ye();yr();import HS from"node:fs/promises";import WS from"node:http";import GS from"node:path";import se from"chalk";ye();B();import $S from"node:fs/promises";import MS from"node:path";var gg="https://api.prjct.app",pg={apiKey:null,apiUrl:gg,userId:null,email:null,lastAuth:null},Al=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 Pe(this.configPath);return this.cachedConfig=e??{...pg},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await Ve(MS.dirname(this.configPath)),await le(this.configPath,s),await $S.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||gg}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...pg},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}},_S=new Al,mt=_S;Fs();var OS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function NS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(NS,"camelToSnake");function LS(r){let e={};for(let[t,s]of Object.entries(r))e[NS(t)]=s;return e}l(LS,"snakeCaseKeys");function FS(r,e){let[t,s]=e.type.split("."),n=OS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=LS(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(FS,"mapCliEventToWebFormat");function fg(r,e){return e.map(t=>FS(r,t)).filter(t=>t!==null)}l(fg,"mapCliEventsToWebFormat");var Rl=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=fg(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(),bn("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 mt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([mt.getApiUrl(),mt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),bn("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: ${bn("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))}},Un=new Rl;wa();ws();Ht();Hs();ft();var Dl=class{static{l(this,"SyncManager")}async hasAuth(){return await mt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Un.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 ys.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 Un.pushEvents(e,n);if(o.success)return await ys.clearPending(e),await ys.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 ys.getLastSync(e))?.timestamp,n=await Un.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 ys.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 O.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 O.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await pe.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Ue.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Ue.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await Ye.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await pe.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}}},US=new Dl,hg=US;U();Le();B();Vo();Qe();It();xt();var Hn=class extends ke{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 mt.write({apiKey:o,...i?{apiUrl:i}:{}}),await Un.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(se.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1408
+ ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=$i(i.startup.avg,$s.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: <${$s.startup.max}ms`)}`)}if(i.memory){let c=$i(i.memory.peakHeapMB,$s.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: <${$s.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=$i(i.contextCorrectness.rate,$s.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: ${$s.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=$i(i.subtaskHandoff.rate,$s.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: ${$s.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1409
+ ${Ie.dim("Command Durations:")}`);for(let[c,l]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${l.avg}ms`)} ${Ie.dim(`(min ${l.min}, max ${l.max}, n=${l.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}};Ci();cs();Ae();Se();Ar();import nb from"node:fs/promises";import rb from"node:http";import ob from"node:path";import ne from"chalk";Se();B();import KS from"node:fs/promises";import XS from"node:path";var $g="https://api.prjct.app",Ig={apiKey:null,apiUrl:$g,userId:null,email:null,lastAuth:null},Gl=class{static{u(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 Te(this.configPath);return this.cachedConfig=e??{...Ig},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await Ke(XS.dirname(this.configPath)),await le(this.configPath,s),await KS.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||$g}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Ig},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}},YS=new Gl,yt=YS;Ks();var QS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function ZS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}u(ZS,"camelToSnake");function eb(r){let e={};for(let[t,s]of Object.entries(r))e[ZS(t)]=s;return e}u(eb,"snakeCaseKeys");function tb(r,e){let[t,s]=e.type.split("."),n=QS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=eb(a),l=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:l,data:{...c,project_id:r},project_id:r}}u(tb,"mapCliEventToWebFormat");function _g(r,e){return e.map(t=>tb(r,t)).filter(t=>t!==null)}u(_g,"mapCliEventsToWebFormat");var Bl=class{static{u(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=_g(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(),Dn("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 yt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([yt.getApiUrl(),yt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),Dn("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: ${Dn("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))}},er=new Bl;_a();Cs();Nt();Rs();ft();var Vl=class{static{u(this,"SyncManager")}async hasAuth(){return await yt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await er.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 Es.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 er.pushEvents(e,n);if(o.success)return await Es.clearPending(e),await Es.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(l=>l.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 Es.getLastSync(e))?.timestamp,n=await er.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 Es.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 M.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 M.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await re.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Pe.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Pe.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await Je.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await re.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}}},sb=new Vl,Mg=sb;W();We();B();ai();Ze();_t();bt();var tr=class extends he{static{u(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 yt.write({apiKey:o,...i?{apiUrl:i}:{}}),await er.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1310
1410
  - **Status**: Connected
1311
1411
  - **Key**: \`${o.substring(0,12)}...\`
1312
- - **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(se.dim(`Key: ${o.substring(0,12)}...`)),f.info(se.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1412
+ - **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
1313
1413
  - **Status**: Key saved (server unreachable)
1314
- - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await mt.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1315
- - **Status**: Logged out`:""};default:{let o=await mt.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1414
+ - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await yt.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1415
+ - **Status**: Logged out`:""};default:{let o=await yt.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1316
1416
  - **Authenticated**: Yes
1317
1417
  - **Email**: ${o.email||"N/A"}
1318
1418
  - **Key**: \`${o.apiKeyPrefix}\`
1319
1419
  - **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"}
1320
1420
  Key: ${o.apiKeyPrefix}
1321
- Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${se.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await mt.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1322
- Key: ${t.apiKeyPrefix}`),f.info(`Run ${se.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1421
+ 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 yt.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
1422
+ Key: ${t.apiKeyPrefix}`),f.info(`Run ${ne.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1323
1423
  - **Email**: ${t.email}
1324
1424
  - **Key**: \`${t.apiKeyPrefix}\`
1325
1425
 
1326
- 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=WS.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),m=c.searchParams.get("user_id");if(u){await mt.saveAuth(u,m||"",d||"");let p=`${s}/api`;await mt.write({apiUrl:p}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1327
- Key: ${u.substring(0,12)}...
1426
+ 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=rb.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let l=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(l){await yt.saveAuth(l,p||"",d||"");let m=`${s}/api`;await yt.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",l.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),l?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
1427
+ Key: ${l.substring(0,12)}...
1328
1428
  Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
1329
1429
  - **Email**: ${d}
1330
- - **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
1430
+ - **Key**: \`${l.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
1331
1431
  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
1332
- 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(se.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await _(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 ${se.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 mt.getStatus()).authenticated?(await mt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await j.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await hg.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>
1432
+ 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 l=process.platform,d=l==="darwin"?`open "${c}"`:l==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await O(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 ${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 yt.getStatus()).authenticated?(await yt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await I.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await Mg.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>
1333
1433
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1334
1434
  <title>prjct CLI Connected</title>
1335
1435
  <style>
@@ -1384,31 +1484,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
1384
1484
  <h1>Authentication Failed</h1>
1385
1485
  <div class="msg">${e}</div>
1386
1486
  <p class="hint">Return to your terminal and try again.</p>
1387
- </div></body></html>`}async start(){let e=await xe.checkInstallation(),t=(dt(),at(jt)),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}...
1487
+ </div></body></html>`}async start(){let e=await je.checkInstallation(),t=(mt(),lt(Mt)),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}...
1388
1488
  `),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1389
1489
 
1390
1490
  Please install one first:
1391
1491
  - Claude Code: https://docs.anthropic.com/claude-code
1392
1492
  - Gemini CLI: https://geminicli.com/docs
1393
- - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await xe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1493
+ - OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await je.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1394
1494
  \u2705 Installed ${a.installed?.length??0} commands to:
1395
- ${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1396
- \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(()=>(Ro(),Ka));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(`
1495
+ ${R.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1496
+ \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(()=>(Go(),dc));await a();let l=await c({autoRepair:!0});l.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: ${l.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(`
1397
1497
  \u{1F389} Setup complete!`),console.log(`
1398
1498
  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...
1399
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await xe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await xe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1499
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await je.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await je.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1400
1500
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1401
1501
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1402
- \u{1F4DD} Installing global configuration...`);let s=await xe.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=(dt(),at(jt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1403
- \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(()=>(Ro(),Ka));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(`
1502
+ \u{1F4DD} Installing global configuration...`);let s=await je.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=(mt(),lt(Mt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1503
+ \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:l}=await Promise.resolve().then(()=>(Go(),dc));await c();let d=await l({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): ${w(c)}`)}return await this.setupMcpServers(),console.log(`
1404
1504
  \u{1F389} Setup complete!
1405
1505
  `),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
1406
- \u{1F50C} Configuring MCP servers...`);try{await is.install();let e=await is.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=as();await qs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await $c("linear",jc.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=as();await qs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await $c("jira",jc.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=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=GS.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1506
+ \u{1F50C} Configuring MCP servers...`);try{await ps.install();let e=await ps.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=fs();await tn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Kc("linear",zc.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=fs();await tn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Kc("jira",zc.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=R.getClaudeDir(),t=R.getClaudeSettingsPath(),s=ob.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
1407
1507
  # prjct Status Line for Claude Code
1408
1508
  # Shows version update notifications and current task
1409
1509
 
1410
1510
  # Current CLI version (embedded at install time)
1411
- CLI_VERSION="${Ee}"
1511
+ CLI_VERSION="${Re}"
1412
1512
 
1413
1513
  # Read JSON context from stdin (provided by Claude Code)
1414
1514
  read -r json
@@ -1459,14 +1559,14 @@ fi
1459
1559
 
1460
1560
  # Default: show prjct branding
1461
1561
  echo "\u26A1 prjct"
1462
- `;await HS.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Pe(t)??{}}catch{}return o.statusLine={type:"command",command:s},await le(t,o),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(se.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(se.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(se.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(se.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(se.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(se.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(se.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(` ${se.bold.cyan("prjct")}${se.magenta("/")}${se.green("cli")} ${se.dim.white(`v${Ee} installed`)}`),console.log(""),console.log(` ${se.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${se.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${se.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(se.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(se.bold.cyan("\u{1F680} Quick Start")),console.log(se.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(` ${se.bold("1.")} Initialize your project:`),console.log(` ${se.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${se.bold("2.")} Start your first task:`),console.log(` ${se.green('prjct task "build auth"')}`),console.log(""),console.log(` ${se.bold("3.")} Ship & celebrate:`),console.log(` ${se.green('prjct ship "user login"')}`),console.log(""),console.log(se.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(` ${se.dim("Documentation:")} ${se.cyan("https://prjct.app")}`),console.log(` ${se.dim("Report issues:")} ${se.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(se.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ao();Ce();q();B();import yg from"node:path";var VS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],BS=`# Changelog
1562
+ `;await nb.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Te(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${Re} 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("")}};To();Ae();K();B();import Og from"node:path";var ib=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],ab=`# Changelog
1463
1563
 
1464
1564
  All notable changes to this project will be documented in this file.
1465
1565
 
1466
1566
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
1467
1567
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
1468
- `,yi=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of VS){let n=yg.join(this.projectPath,s);if(await C(n)){let o=await Ie(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=yg.join(this.projectPath,e);return await Tt(t,`${BS}
1469
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await Ie(t.filePath),n=e.date||Vl(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Tt(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}
1568
+ `,_i=class{static{u(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of ib){let n=Og.join(this.projectPath,s);if(await C(n)){let o=await _e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Og.join(this.projectPath,e);return await Ct(t,`${ab}
1569
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await _e(t.filePath),n=e.date||lu(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Ct(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}
1470
1570
  ${a}`}return`${e.trimEnd()}
1471
1571
 
1472
1572
  ${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
@@ -1476,31 +1576,31 @@ ${a}`}return`${n}
1476
1576
 
1477
1577
  ${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(`
1478
1578
  `)}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(`
1479
- `)}};vc();Le();B();import Wn from"node:path";var wi=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=Wn.join(this.projectPath,"package.json"),t=await Pe(e,null);return t?.version?{current:t.version,next:Gn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Wn.join(this.projectPath,"Cargo.toml"),t=await Ie(e,"");if(!t)return null;let s=JS(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Wn.join(this.projectPath,"pyproject.toml"),t=await Ie(e,"");if(!t)return null;let s=qS(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ps(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Wn.join(this.projectPath,e[0]),s=await Ie(t,"");if(!s)return null;let n=zS(s);return n?{current:n,next:Gn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Wn.join(this.projectPath,e),s=await Ie(t,"");if(!s)return null;let n=s.trim();return wg(n)?{current:n,next:Gn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await _("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1480
- `);for(let s of t){let n=s.trim().replace(/^v/,"");if(wg(n))return{current:n,next:Gn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Wn.join(this.projectPath,"VERSION");return await Tt(e,`0.1.0
1481
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await As("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 Tt(e.file,`${e.next}
1482
- `);break}}async writeJsonVersion(e,t){let s=await Pe(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await Ie(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Tt(e,n)}async writeXmlVersion(e,t){let s=await Ie(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Tt(e,n)}};function wg(r){return/^\d+\.\d+\.\d+/.test(r)}l(wg,"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 JS(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(JS,"parseTomlVersion");function qS(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(qS,"parsePyprojectVersion");function zS(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(zS,"parseCsprojVersion");Hs();ft();U();q();Le();Vs();vn();Qe();oi();U();Le();import At from"chalk";async function Bt(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ae.getRulesForCommand(r,e).filter(m=>m.position===t),a=i.filter(m=>m.type==="gate");for(let m of a){let p=m.description||m.action;console.log(`
1483
- ${At.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await _(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let h=Date.now()-g,b=h>1e3?`${(h/1e3).toFixed(1)}s`:`${h}ms`;console.log(`${At.green("\u2713")} ${At.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${At.red("\u2717")} gate failed: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
1484
- ${y(g)}
1485
- `,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
1486
- ${At.dim(`[instruction] ${t}-${e}: ${p}`)}`),n.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
1487
- ${At.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await _(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${At.green("\u2713")} ${At.dim(`(${h})`)}`)}catch(p){console.log(`${At.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
1488
- ${y(p)}
1489
- `}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
1490
- ${At.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await _(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${At.green("\u2713")} ${At.dim(`step passed (${h})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${At.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
1491
- ${y(p)}
1492
- `,n}}return n}l(Bt,"executeWorkflowRules");xt();var Vn=class extends ke{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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await O.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await O.completeTask(o)),i||(i="current work");let c=await Bt(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 wi(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new yi(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let k=await this._gitPush(t);g=k.success?"pushed":k.message}await Ye.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:S()}),await nt.learnDecision(o,"commit_footer","prjct","ship"),await nt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Bt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Gs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(k){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(k))}if(s.md){let k=Uo("ship",!0),E=L(we(`Shipped: ${i}`,`Version: ${d}`),Y("Results",$e([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?Y("Agent Instructions",$e(b)):null,de(k.map(R=>({label:R.desc,command:R.cmd}))));console.log(E)}else f.done(`v${d} shipped`),Pt("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 _("git add .");let s=`feat: ${e}
1493
-
1494
- Generated with [p/](https://www.prjct.app/)`;return await As("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return D(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await _("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return D(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};ss();qa();ye();nl();sc();U();Qe();It();xt();import{execSync as $r}from"node:child_process";import Si from"node:fs/promises";import jr from"node:path";import Jn from"chalk";function Pg(){try{return!!$r("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(Pg,"isHomebrewInstall");function Cg(){try{let e=$r("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(Cg,"getCurrentVersion");var qn=class extends ke{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await Co.updateVersion(Ee)}catch{}try{await new ei().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=Cg();if(e)return Pg()?(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(Pg()){try{$r("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}$r("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else $r("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Cg();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 Do(i),c=await Io(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 ts().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 ts().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${y(n)}`)}try{await new ts().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(()=>(dt(),jt)),o=await n(),i=jr.join(kt("node:os").homedir());if(o.gemini.installed){let a=jr.join(i,".gemini","GEMINI.md");try{let c=await Si.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let m=jr.join(jr.dirname(kt.resolve("../../package.json")),"templates","global","GEMINI.md"),p=await Si.readFile(m,"utf-8"),g=p.substring(p.indexOf(u),p.indexOf(d)+d.length),h=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),k=h+g+b,E="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",R="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(k.includes(E)&&k.includes(R)){let W=k.substring(0,k.indexOf(E)),z=k.substring(k.indexOf(R)+R.length);k=`${(W+z).replace(/\n{3,}/g,`
1579
+ `)}};Nc();We();B();import sr from"node:path";var Mi=class{static{u(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=sr.join(this.projectPath,"package.json"),t=await Te(e,null);return t?.version?{current:t.version,next:nr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=sr.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=cb(t);return s?{current:s,next:nr(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=sr.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=lb(t);return s?{current:s,next:nr(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Ss(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=sr.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=ub(s);return n?{current:n,next:nr(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=sr.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Ng(n)?{current:n,next:nr(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(`
1580
+ `);for(let s of t){let n=s.trim().replace(/^v/,"");if(Ng(n))return{current:n,next:nr(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=sr.join(this.projectPath,"VERSION");return await Ct(e,`0.1.0
1581
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Fs("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 Ct(e.file,`${e.next}
1582
+ `);break}}async writeJsonVersion(e,t){let s=await Te(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Ct(e,n)}async writeXmlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Ct(e,n)}};function Ng(r){return/^\d+\.\d+\.\d+/.test(r)}u(Ng,"isSemver");function nr(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}u(nr,"bumpPatch");function cb(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}u(cb,"parseTomlVersion");function lb(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}u(lb,"parsePyprojectVersion");function ub(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}u(ub,"parseCsprojVersion");Rs();ft();W();K();We();es();_n();Ze();Fr();W();We();import Dt from"chalk";async function Kt(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=be.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(`
1583
+ ${Dt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await O(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(`${Dt.green("\u2713")} ${Dt.dim(`gate passed (${S})`)}`)}catch(g){return console.log(`${Dt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
1584
+ ${w(g)}
1585
+ `,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
1586
+ ${Dt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let l=i.filter(p=>p.type==="hook");for(let p of l){console.log(`
1587
+ ${Dt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await O(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(`${Dt.green("\u2713")} ${Dt.dim(`(${h})`)}`)}catch(m){console.log(`${Dt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
1588
+ ${w(m)}
1589
+ `}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
1590
+ ${Dt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await O(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(`${Dt.green("\u2713")} ${Dt.dim(`step passed (${h})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Dt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
1591
+ ${w(m)}
1592
+ `,n}}return n}u(Kt,"executeWorkflowRules");bt();var rr=class extends he{static{u(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await M.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await M.completeTask(o)),i||(i="current work");let c=await Kt(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 Mi(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new _i(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let y=await this._gitPush(t);g=y.success?"pushed":y.message}await Je.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:b()}),await it.learnDecision(o,"commit_footer","prjct","ship"),await it.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Kt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),S=[...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=ni("ship",!0),E=L(ue(`Shipped: ${i}`,`Version: ${d}`),X("Results",De([`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",De(S)):null,oe(y.map(A=>({label:A.desc,command:A.cmd}))));console.log(E)}else f.done(`v${d} shipped`),At("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async _createShipCommit(e,t){try{await O("git add .");let s=`feat: ${e}
1593
+
1594
+ Generated with [p/](https://www.prjct.app/)`;return await Fs("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return j(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await O("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return j(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};cs();lc();Se();kl();yc();W();Ze();_t();bt();import{execSync as Br}from"node:child_process";import Ni from"node:fs/promises";import Gr from"node:path";import ir from"chalk";function Gg(){try{return!!Br("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}u(Gg,"isHomebrewInstall");function Bg(){try{let e=Br("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}}u(Bg,"getCurrentVersion");var ar=class extends he{static{u(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 Ho.updateVersion(Re)}catch{}try{await new yi().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=Bg();if(e)return Gg()?(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(Gg()){try{Br("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Br("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Br("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Bg();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 Vo(i),c=await Jo(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let l of a.errors)t.errors.push(`${i.slice(0,8)}: ${l.file}: ${l.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 as().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 as().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${w(n)}`)}try{await new as().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(()=>(mt(),Mt)),o=await n(),i=Gr.join(vt("node:os").homedir());if(o.gemini.installed){let a=Gr.join(i,".gemini","GEMINI.md");try{let c=await Ni.readFile(a,"utf-8"),l="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(l)&&c.includes(d)){let p=Gr.join(Gr.dirname(vt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await Ni.readFile(p,"utf-8"),g=m.substring(m.indexOf(l),m.indexOf(d)+d.length),h=c.substring(0,c.indexOf(l)),S=c.substring(c.indexOf(d)+d.length),y=h+g+S,E="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",A="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(y.includes(E)&&y.includes(A)){let F=y.substring(0,y.indexOf(E)),J=y.substring(y.indexOf(A)+A.length);y=`${(F+J).replace(/\n{3,}/g,`
1495
1595
 
1496
1596
  `).trim()}
1497
- `}await Si.writeFile(a,k,"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(()=>(Eg(),vg));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?Jn.green("\u2713"):c?Jn.red("\u2717"):Jn.yellow("\u26A0");console.log(` ${u} ${Jn.bold(i)}`);for(let d of a.details)console.log(` ${Jn.dim(d)}`);for(let d of a.errors)console.log(` ${Jn.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(`
1498
- `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=jr.join(A.getGlobalBasePath(),"projects");try{return(await Si.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Nc();Ce();kr();ac();U();Qe();Rn();xt();import De from"chalk";var zn=class extends ke{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 j.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 yt.getAll(n);if(i.length===0)return console.log(`
1499
- ${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
1500
- `),{success:!0,message:"No data"};let a=Bo(i,o);await Mo.saveMetrics(n,a),console.log(`
1501
- ${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1502
- ${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=lp(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1503
- ${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await j.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Ss,...s.velocity}}catch{}return Ss}};el();import ib from"node:fs/promises";import ab from"node:path";gr();q();Rn();var Ag=l(r=>ma.includes(r),"isValidPoint"),sn=l(r=>pa[r],"pointsToMinutes"),xg=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"),Rg=l(r=>{let e=sn(r);return`${xg(e.min)}\u2013${xg(e.max)}`},"pointsToTimeRange"),Dg=l(async(r,e)=>{let s=(await yt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+St(c.actualDuration),0)/s.length;return{points:eb(o),basedOn:s.length}},"suggestFromHistory"),eb=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of ma){let n=Math.abs(pa[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");Ce();ye();U();B();import jl from"node:fs/promises";import tb from"node:os";import bi from"node:path";var $l=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=bi.join(tb.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await jl.mkdir(this.commandsPath,{recursive:!0});let s=bi.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await jl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=bi.join(this.commandsPath,`${e}.md`);return await jl.unlink(t),{success:!0}}catch(t){return D(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=bi.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1597
+ `}await Ni.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(()=>(qg(),Wg));await s()?(await n()||o(),await new Promise(l=>setTimeout(l,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 l=a.success?ir.green("\u2713"):c?ir.red("\u2717"):ir.yellow("\u26A0");console.log(` ${l} ${ir.bold(i)}`);for(let d of a.details)console.log(` ${ir.dim(d)}`);for(let d of a.errors)console.log(` ${ir.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 l=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${l})`);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(`
1598
+ `)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=Gr.join(R.getGlobalBasePath(),"projects");try{return(await Ni.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Zc();Ae();Dr();Xo();W();Ze();Un();bt();import $e from"chalk";var cr=class extends he{static{u(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.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 St.getAll(n);if(i.length===0)return console.log(`
1599
+ ${$e.dim("No velocity data yet.")}`),console.log(`${$e.dim("Complete tasks with estimates to build velocity history.")}
1600
+ `),{success:!0,message:"No data"};let a=ci(i,o);await In.saveMetrics(n,a),console.log(`
1601
+ ${$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 p of c){let m=p.estimationAccuracy>=80?$e.green:p.estimationAccuracy>=60?$e.yellow:$e.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${$e.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let l=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: ${l} ${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(`
1602
+ ${$e.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${$e.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${$e.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${$e.green("\u2713")} ${p.category} tasks estimated within ${$e.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=Rm(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1603
+ ${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.bold(m)}`)}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 I.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...As,...s.velocity}}catch{}return As}};hl();import Tb from"node:fs/promises";import vb from"node:path";xr();K();Un();var Jg=u(r=>Ra.includes(r),"isValidPoint"),dn=u(r=>Aa[r],"pointsToMinutes"),Vg=u(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"),zg=u(r=>{let e=dn(r);return`${Vg(e.min)}\u2013${Vg(e.max)}`},"pointsToTimeRange"),Kg=u(async(r,e)=>{let s=(await St.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+Et(c.actualDuration),0)/s.length;return{points:hb(o),basedOn:s.length}},"suggestFromHistory"),hb=u(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Ra){let n=Math.abs(Aa[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");Ae();Se();W();B();import zl from"node:fs/promises";import yb from"node:os";import Li from"node:path";var Kl=class{static{u(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Li.join(yb.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await zl.mkdir(this.commandsPath,{recursive:!0});let s=Li.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await zl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:w(s)}}}async deleteWorkflowTemplate(e){try{let t=Li.join(this.commandsPath,`${e}.md`);return await zl.unlink(t),{success:!0}}catch(t){return j(t)?{success:!0}:{success:!1,error:w(t)}}}async templateExists(e){let t=Li.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
1504
1604
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1505
1605
  ---
1506
1606
 
@@ -1536,46 +1636,47 @@ Suggest relevant actions based on the workflow results:
1536
1636
  - View rules: \`prjct workflow ${e} --md\`
1537
1637
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1538
1638
  - Run again: \`p. ${e}\`
1539
- `}},Ml=new $l;vt();yr();cl();function sb(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(sb,"complexityToPoints");async function nb(r,e){let t=jn.detectTaskType(e),s=await Dg(r,t);if(s){let a=sn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=jn.estimateComplexity(e),o=sb(n.level),i=sn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(nb,"estimateTaskForStart");var _l=nb;Le();async function Ti(r){try{let{stdout:e}=await _("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(Ti,"getGitBranch");async function Ig(r,e=20){try{let{stdout:t}=await _("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
1540
- `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(Ig,"getModifiedFiles");ye();te();q();var Kn="session-snapshot",rb=30,Ol=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Ti(t),o=await Ig(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:S(),resumeHint:c};return P.setDoc(e,Kn,u),u}getSnapshot(e){try{return P.getDoc(e,Kn)}catch{return null}}clearSnapshot(e){try{P.deleteDoc(e,Kn)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!P.exists(s))continue;let n=P.getDoc(s,Kn);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=rb){let t=await A.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,Kn);i&&new Date(i.timestamp).getTime()<s&&(P.deleteDoc(o,Kn),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${ct(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: ${ct(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1541
- `)}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 ${ct(t*1e3)} of work`),s.join(" ")}},Es=new Ol;yn();te();var Nl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){P.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1542
- 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
1639
+ `}},Xl=new Kl;xt();Ar();El();function wb(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}u(wb,"complexityToPoints");async function kb(r,e){let t=qn.detectTaskType(e),s=await Kg(r,t);if(s){let a=dn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=qn.estimateComplexity(e),o=wb(n.level),i=dn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}u(kb,"estimateTaskForStart");var Yl=kb;We();async function Fi(r){try{let{stdout:e}=await O("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}u(Fi,"getGitBranch");async function Xg(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(`
1640
+ `).filter(s=>s.length>0).slice(0,e)}catch{return[]}}u(Xg,"getModifiedFiles");Se();Y();K();var lr="session-snapshot",Sb=30,Ql=class{static{u(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Fi(t),o=await Xg(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),l={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 T.setDoc(e,lr,l),l}getSnapshot(e){try{return T.getDoc(e,lr)}catch{return null}}clearSnapshot(e){try{T.deleteDoc(e,lr)}catch{}}async listAllSnapshots(){let e=await R.listProjects(),t=[];for(let s of e)try{if(!T.exists(s))continue;let n=T.getDoc(s,lr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=Sb){let t=await R.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!T.exists(o))continue;let i=T.getDoc(o,lr);i&&new Date(i.timestamp).getTime()<s&&(T.deleteDoc(o,lr),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${ut(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: ${ut(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
1641
+ `)}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 ${ut(t*1e3)} of work`),s.join(" ")}},_s=new Ql;Cn();Y();var Zl=class{static{u(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){T.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
1642
+ VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=T.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,l=i.size>0?a/i.size:0;T.run(e,`UPDATE context_feedback
1543
1643
  SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
1544
- 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
1644
+ WHERE id = ?`,JSON.stringify(s),c,l,new Date().toISOString(),n.id)}getFeedback(e,t){let s=T.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=T.query(e,`SELECT * FROM context_feedback
1545
1645
  WHERE actual_files IS NOT NULL
1546
- ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(k=>d.has(k)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let h=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let k of b){let E=i.get(k)??0;i.set(k,E+g)}for(let k of h)if(!b.has(k)){let E=i.get(k)??0;i.set(k,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}},Mr=new Nl;ul();Ht();ft();oi();qo();U();q();Vo();Vs();vn();Qe();pl();Rn();xt();ye();U();q();Ms();te();import vi from"node:fs/promises";import jg from"node:path";var Xn="1.0.0";function ob(){return{version:Xn,lastUpdated:"",checksums:{}}}l(ob,"getDefaultChecksums");var Ll=class{static{l(this,"IndexStorage")}getIndexPath(e){return jg.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await vi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Xn?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 ob()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await vi.readFile(e);return Eu(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:Xn,lastUpdated:S(),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 vi.readdir(t);await Promise.all(s.map(n=>vi.unlink(jg.join(t,n))))}catch(s){if(!D(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!==Xn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Xn)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!==Xn?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)}},$g=new Ll;function Mg(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(Mg,"rankPatterns");function _g(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=$g.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(_g,"detectDomainsFromTask");function Fl(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Mg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1646
+ 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 l=JSON.parse(c.keywords),d=new Set(l),p=[...o].filter(y=>d.has(y)).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 y of S){let E=i.get(y)??0;i.set(y,E+g)}for(let y of h)if(!S.has(y)){let E=i.get(y)??0;i.set(y,E-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,l]of i)s.set(c,l/a);return s}},Vr=new Zl;Ti();Nt();ft();Fr();ui();W();K();ai();es();_n();Ze();Rl();Un();bt();Se();W();K();Bs();Y();import Ui from"node:fs/promises";import Yg from"node:path";var ur="1.0.0";function bb(){return{version:ur,lastUpdated:"",checksums:{}}}u(bb,"getDefaultChecksums");var eu=class{static{u(this,"IndexStorage")}getIndexPath(e){return Yg.join(R.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Ui.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==ur?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 bb()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Ui.readFile(e);return qu(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,l]of t)c in n?n[c]!==l&&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:ur,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{T.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await Ui.readdir(t);await Promise.all(s.map(n=>Ui.unlink(Yg.join(t,n))))}catch(s){if(!j(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!==ur?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===ur)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!==ur?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=T.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=T.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)}},pn=new eu;function Qg(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)}u(Qg,"rankPatterns");function Zg(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=pn.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"]}u(Zg,"detectDomainsFromTask");function tu(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Qg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
1547
1647
 
1548
- ${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),p;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let b=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(m.some(k=>b.includes(k))){p=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
1648
+ ${n.map((a,c)=>{let l=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(y=>S.includes(y))){m=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${l}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
1549
1649
  `)}).join(`
1550
1650
 
1551
- `)}`}l(Fl,"buildPatternBriefing");function Ul(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(`
1552
- `)}l(Ul,"buildContextContract");var cb=[{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}],Yn=class extends ke{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 j.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 Bt(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 is.ensureReady()}catch(he){return ht("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(he)}),{success:!1,error:y(he)}}let p=await _l(o,c),g=await O.getCurrentTask(o),h=await O.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(lr(),Xr)),k=await b.detect(t);if(k){let he=h.find(st=>st.worktreePath===k.path);if(he)return ht("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:he.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:he}}let E;if(g&&!k){let he=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let st=await b.create(t,he);await b.setup(st.path,t),E=st.path,Fo("info",`Parallel session created: \`${st.branch}\` at \`${st.path}\``)}catch{return ht("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(E||k){let he=J();await O.startTaskInWorkspace(o,{id:J(),description:c,sessionId:J(),workspaceId:he,worktreePath:E||k.path,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes},he)}else await O.startTask(o,{id:J(),description:c,sessionId:J(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes});let W=A.getGlobalProjectPath(o),z=Lc(c),w;try{w=Mr.getHistoricalBoosts(o,z),w.size===0&&(w=void 0)}catch{}let N=({bug:30,chore:40,improvement:80,feature:100}[p.taskType]??80)>=80?15:10,[fe,Ne,,Rt]=await Promise.all([Ti(t),qe.getActive(o).catch(()=>null),db(W),xn(c,t,{maxFiles:N,minScore:.15,historicalBoosts:w}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),tt=null;try{let he=Es.getSnapshot(o);he&&(tt=Es.formatContinuityContext(he),Es.clearSnapshot(o))}catch{}let pt=null;if(Ne?.analyzedAt){let he=new Date(Ne.analyzedAt),st=Math.floor((Date.now()-he.getTime())/(1e3*60*60*24));st>7&&(pt=Fo("warn",`Analysis is ${st} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Ne||(pt=Fo("info","No project analysis found. Run `p. sync` for better context targeting."));let us=null;if(w&&w.size>0){let he=[...w.entries()].filter(([,st])=>st>.3).sort((st,Oi)=>Oi[1]-st[1]).slice(0,5);he.length>0&&(us=`### Previously Useful Files
1553
- ${he.map(([Oi])=>`\`${Oi}\``).join(", ")}`)}let Ri=_g(c,o),Di=Pr({description:c,branch:fe,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Ri}),Ii=Nm(Rt.files.map(he=>({path:he.path,description:he.reasons.join(", ")}))),ji=Rt.files.map(he=>he.path),$i=Fl(Ne,ji),Mi=Ul(Rt.files,Ne),_i=de([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ne=lb(),Qg=ub(o);console.log(L(tt,pt,Di,Mi,Ii,us,$i,Qg,ne,_i));try{let he=await O.getCurrentTask(o);he&&Mr.recordSuggestions(o,he.id,z,Rt.files.map(st=>st.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:S()}),await Bt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Zo.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await _l(o,c);return await O.startTask(o,{id:J(),description:c,sessionId:J(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),xr("working"),Pt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:S()}),await Bt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:Ag,pointsToMinutes:sn,pointsToTimeRange:Rg,storeEstimate:l(async p=>{let g=sn(p);return await O.updateCurrentTask(o,{estimatedPoints:p,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await O.getCurrentTask(o);if(!i)return s.md?ht("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?Qt(new Date(i.startedAt)):void 0,c=Pr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Om(u,d):"",p=de([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,p))}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")?ht("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 j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(lr(),Xr)),i=await o.detect(e),a=await O.getCurrentTask(n),c;if(i){let fe=(await O.getActiveTasks(n)).find(Ne=>Ne.worktreePath===i.path);fe&&(a=fe,c=fe.workspaceId)}if(!a)return t.md?ht("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await Bt(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,m="",p=0;if(a.startedAt){let N=new Date(a.startedAt);m=Qt(N),p=Math.round((Date.now()-N.getTime())/6e4)}let g=a.estimatedMinutes,h=a.estimatedPoints,b=a.type||"feature",k=a.linearId;try{await yt.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:S(),estimatedDuration:g?Og(g):"0m",actualDuration:m||"0m",variance:g?gb(p-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,k].filter(Boolean)})}catch{}let E="";if(h&&g){let N=p-g,fe=g>0?Math.round((p-g)/g*100):0,Ne=N>=0?"+":"";E=` | est: ${h}pt (${Og(g)}) \u2192 ${Ne}${fe}%`}let R=[],W=null,z=null;try{if(R=await pb(e,a.startedAt),R.length>0){Mr.completeFeedback(n,a.id,R);let N=Mr.getFeedback(n,a.id);N&&(W=N.precision,z=N.recall)}}catch{}c?await O.completeTaskInWorkspace(n,c,t.feedback):await O.completeTask(n,t.feedback);try{Es.clearSnapshot(n)}catch{}let w=a.linearId,M=w!=null?await qs("linear",as()).catch(()=>!1):!1;if(t.md){let N=m?` (${m})`:"",fe=null;if(R.length>0){let tt=R.slice(0,20).map(pt=>`\`${pt}\``);fe=`### Files Modified (${R.length})
1554
- ${tt.join(", ")}`}let Ne=null;if(W!==null&&z!==null){let tt=Math.round(W*100),pt=Math.round(z*100);Ne=`### Context Accuracy
1651
+ `)}`}u(tu,"buildPatternBriefing");function su(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(`
1652
+ `)}u(su,"buildContextContract");var Eb=[{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}],dr=class extends he{static{u(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 I.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 Kt(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 ps.ensureReady()}catch(ke){return ht("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(ke)}),{success:!1,error:w(ke)}}let m=await Yl(o,c),g=await M.getCurrentTask(o),h=await M.getActiveTasks(o),{worktreeService:S}=await Promise.resolve().then(()=>(Tr(),uo)),y=await S.detect(t);if(y){let ke=h.find(ot=>ot.worktreePath===y.path);if(ke)return ht("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:ke.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:ke}}let E;if(g&&!y){let ke=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let ot=await S.create(t,ke);await S.setup(ot.path,t),E=ot.path,Vt("info",`Parallel session created: \`${ot.branch}\` at \`${ot.path}\``)}catch{return ht("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(E||y){let ke=z();await M.startTaskInWorkspace(o,{id:z(),description:c,sessionId:z(),workspaceId:ke,worktreePath:E||y.path,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes},ke)}else await M.startTask(o,{id:z(),description:c,sessionId:z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let F=R.getGlobalProjectPath(o),J=el(c),k;try{k=Vr.getHistoricalBoosts(o,J),k.size===0&&(k=void 0)}catch{}let N=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[we,He,,It]=await Promise.all([Fi(t),Qe.getActive(o).catch(()=>null),xb(F),Ln(c,t,{maxFiles:N,minScore:.15,historicalBoosts:k}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),rt=null;try{let ke=_s.getSnapshot(o);ke&&(rt=_s.formatContinuityContext(ke),_s.clearSnapshot(o))}catch{}let wt=null;if(He?.analyzedAt){let ke=new Date(He.analyzedAt),ot=Math.floor((Date.now()-ke.getTime())/(1e3*60*60*24));ot>7&&(wt=Vt("warn",`Analysis is ${ot} days old. Run \`p. sync\` to refresh patterns and file index.`))}else He||(wt=Vt("info","No project analysis found. Run `p. sync` for better context targeting."));let Xt=null;if(k&&k.size>0){let ke=[...k.entries()].filter(([,ot])=>ot>.3).sort((ot,Qi)=>Qi[1]-ot[1]).slice(0,5);ke.length>0&&(Xt=`### Previously Useful Files
1653
+ ${ke.map(([Qi])=>`\`${Qi}\``).join(", ")}`)}let Bi=Zg(c,o),Vi=$n({description:c,branch:we,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:Bi}),Ji=Uc(It.files.map(ke=>({path:ke.path,description:ke.reasons.join(", ")}))),zi=It.files.map(ke=>ke.path),Ki=tu(He,zi),Xi=su(It.files,He),Yi=oe([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ie=Pb(),yf=Cb(o);console.log(L(rt,wt,Vi,Xi,Ji,Xt,Ki,yf,ie,Yi));try{let ke=await M.getCurrentTask(o);ke&&Vr.recordSuggestions(o,ke.id,J,It.files.map(ot=>ot.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:b()}),await Kt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await hi.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 Yl(o,c);return await M.startTask(o,{id:z(),description:c,sessionId:z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),Nr("working"),At("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:b()}),await Kt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:Jg,pointsToMinutes:dn,pointsToTimeRange:zg,storeEstimate:u(async m=>{let g=dn(m);return await M.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await M.getCurrentTask(o);if(!i)return s.md?ht("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?rs(new Date(i.startedAt)):void 0,c=$n({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),l=i.subtasks||[],d=i.currentSubtaskIndex,p=l.length>0?Fc(l,d):"",m=oe([{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=w(n);return s.md?o.includes("Cannot run")||o.includes("working state")?ht("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 I.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(Tr(),uo)),i=await o.detect(e),a=await M.getCurrentTask(n),c;if(i){let we=(await M.getActiveTasks(n)).find(He=>He.worktreePath===i.path);we&&(a=we,c=we.workspaceId)}if(!a)return t.md?ht("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 l=await Kt(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!l.success)return{success:!1,error:l.gatesFailed.length>0?`Blocked: ${l.gatesFailed.join(", ")}`:`Hook failed: ${l.hooksFailed.join(", ")}`};let d=a.description,p="",m=0;if(a.startedAt){let N=new Date(a.startedAt);p=rs(N),m=Math.round((Date.now()-N.getTime())/6e4)}let g=a.estimatedMinutes,h=a.estimatedPoints,S=a.type||"feature",y=a.linearId;try{await St.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:b(),estimatedDuration:g?ef(g):"0m",actualDuration:p||"0m",variance:g?jb(m-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[S,y].filter(Boolean)})}catch{}let E="";if(h&&g){let N=m-g,we=g>0?Math.round((m-g)/g*100):0,He=N>=0?"+":"";E=` | est: ${h}pt (${ef(g)}) \u2192 ${He}${we}%`}let A=[],F=null,J=null;try{if(A=await Ab(e,a.startedAt),A.length>0){Vr.completeFeedback(n,a.id,A);let N=Vr.getFeedback(n,a.id);N&&(F=N.precision,J=N.recall)}}catch{}c?await M.completeTaskInWorkspace(n,c,t.feedback):await M.completeTask(n,t.feedback);try{_s.clearSnapshot(n)}catch{}let k=a.linearId,D=k!=null?await tn("linear",fs()).catch(()=>!1):!1;if(t.md){let N=p?` (${p})`:"",we=null;if(A.length>0){let rt=A.slice(0,10).map(Xt=>`\`${Xt}\``),wt=A.length>10?`, +${A.length-10} more`:"";we=`### Files Modified (${A.length})
1654
+ ${rt.join(", ")}${wt}`}let He=null;if(F!==null&&J!==null){let rt=Math.round(F*100),wt=Math.round(J*100);He=`### Context Accuracy
1555
1655
  | Metric | Value |
1556
1656
  |--------|-------|
1557
- | Precision | ${tt}% of suggested files were used |
1558
- | Recall | ${pt}% of modified files were suggested |`}let Rt=null;try{let{prjctDb:tt}=(te(),at(to)),pt=tt.getDoc(n,"rpi:current:research"),us=tt.getDoc(n,"rpi:current:plan");pt?us||(Rt=`### RPI Phase: Plan Ready
1559
- Research is available. Create your implementation plan next.`):Rt="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(we("Completed",`${d}${N}`),rt({Duration:m||"unknown",...E?{Variance:E.replace(" | ","")}:{}}),fe,Ne,Rt,de([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let N=m?` (${m}${E})`:"";w&&M?f.done(`${d}${N} \u2192 Linear linked (update via MCP)`):f.done(`${d}${N}`),xr("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:m,estimatedPoints:h,estimatedMinutes:g,actualMinutes:p,timestamp:S()}),await Bt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:m}}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 j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await pe.getActiveTasks(n);if(o.length===0)return t.md?ht("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(Y("Queue",`${o.length} task${o.length!==1?"s":""}`),$e(i,!0),de([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await O.getCurrentTask(o);if(!i)return s.md?ht("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=Qt(new Date(i.startedAt))),await O.pauseTask(o,e);try{await Es.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(we("Task Paused",`**Paused:** ${i.description}`),rt({Reason:e||void 0,"Duration worked":a||void 0}),de([{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})`:""}`),xr("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:S()}),{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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await O.getCurrentTask(o);if(i)return s.md?ht("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 O.resumeTask(o);return a?(s.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),de([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),xr("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:S()}),{success:!0,task:a.description}):(s.md?ht("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 j.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 cb){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=et.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=et.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ae.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(we("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),de([{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=et.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=et.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=Ae.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(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),de([{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=et.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=et.getAllWorkflows(t).map(k=>k.name).join(", "),b=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=Ae.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(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),de([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ae.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(we("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ae.resetRules(e);return t.md?console.log(L(we("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=Ae.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 Ae.updateRule(t,o,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),de([{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=Ae.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 Ae.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(we("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(Y("Multiple matches",`${a.length} rules match "${n}"`),$e(c),de(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(Y("Workflow Help","Manage hooks, gates, and steps for your workflow"),Y("Commands",$e(["`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"])),Y("Natural Language (EN/ES)",$e(['`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=Ae.getRulesForCommand(t,e):o=Ae.getAllRules(t),o.length===0)return s.md?console.log(L(Y("Workflow Rules","No rules configured"),de([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(mb(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(Y(c,u),a.length>0?_m(a.join(`
1560
-
1561
- `),""):null,de([{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=Ae.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 ii(t),i=0,a=[],c=Ae.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=Ae.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=Ae.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(we("Workflow Initialized",`Added ${a.length} default ship rules`),$e(a),de([{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(!et.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(et.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(et.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=et.createWorkflow(t,{name:i,description:a}),d=await Ml.generateWorkflowTemplate(i,a);if(!d.success){et.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${m}`):f.fail(m),{success:!1,error:m}}return n.md?console.log(L(we("Workflow Created",`Created workflow: ${i}`),Y("Description",a),Y("Template",`Installed at ${d.path}`),de([{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(`
1562
- 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=et.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(Y("Built-in Workflows",a.join(`
1563
- `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Y("Custom Workflows",a.join(`
1564
- `)))}console.log(L(...i,de([{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(`
1657
+ | Precision | ${rt}% of suggested files were used |
1658
+ | Recall | ${wt}% of modified files were suggested |`}let It=null;try{let{prjctDb:rt}=(Y(),lt(ho)),wt=rt.getDoc(n,"rpi:current:research"),Xt=rt.getDoc(n,"rpi:current:plan");wt?Xt||(It=`### RPI Phase: Plan Ready
1659
+ Research is available. Create your implementation plan next.`):It="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(ue("Completed",`${d}${N}`),Oe({Duration:p||"unknown",...E?{Variance:E.replace(" | ","")}:{}}),we,He,It,oe([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let N=p?` (${p}${E})`:"";k&&D?f.done(`${d}${N} \u2192 Linear linked (update via MCP)`):f.done(`${d}${N}`),Nr("completed"),At("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:p,estimatedPoints:h,estimatedMinutes:g,actualMinutes:m,timestamp:b()}),await Kt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:p}}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 I.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await re.getActiveTasks(n);if(o.length===0)return t.md?ht("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let a=o.slice(0,10).map(c=>{let l=c.type?` [${c.type}]`:"",d=c.priority?` ${c.priority}`:"";return`${c.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${l}${d}`});o.length>10&&a.push(`...and ${o.length-10} more`),console.log(L(X("Queue",`${o.length} task${o.length!==1?"s":""}`),De(a,!0),oe([{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 I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await M.getCurrentTask(o);if(!i)return s.md?ht("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=rs(new Date(i.startedAt))),await M.pauseTask(o,e);try{await _s.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(ue("Task Paused",`**Paused:** ${i.description}`),Oe({Reason:e||void 0,"Duration worked":a||void 0}),oe([{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})`:""}`),Nr("paused"),At("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(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 I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await M.getCurrentTask(o);if(i)return s.md?ht("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 M.resumeTask(o);return a?(s.md?console.log(L(ue("Task Resumed",`**Resumed:** ${a.description}`),oe([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Nr("working"),At("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?ht("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 I.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 Eb){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 l=Le.getWorkflow(t,c||"");if(!c||!l||!l.enabled){let m=Le.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=be.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(ue("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),oe([{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=Le.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Le.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 l=be.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(ue("Gate Added",`#${l} [gate] before ${o} \u2192 \`${c}\``),oe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${l} --md`}]))):f.done(`gate #${l} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:l}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Le.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=Le.getAllWorkflows(t).map(y=>y.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 l=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=be.addRule(t,{type:"instruction",command:o,position:l,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ue("Instruction Added",`#${m} [instruction] ${l} ${o} \u2192 \`${p}\``),oe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${l} ${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(!be.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(ue("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=be.resetRules(e);return t.md?console.log(L(ue("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 l=be.getRuleById(t,o);if(!l){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}if(!l.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!0,message:d}}return be.updateRule(t,o,{enabled:!1}),s.md?console.log(L(ue("Rule Disabled",`#${o} [${l.type}] ${l.action}`),oe([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${l.action}`),{success:!0,ruleId:o}}let i=be.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let l=`No rules matching "${n}"`;return s.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}if(a.length===1){let l=a[0];return be.updateRule(t,l.id,{enabled:!1}),s.md?console.log(L(ue("Rule Disabled",`#${l.id} [${l.type}] ${l.action}`))):f.done(`disabled rule #${l.id}: ${l.action}`),{success:!0,ruleId:l.id}}let c=a.slice(0,5);if(s.md){let l=c.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&l.push(`...and ${a.length-5} more`),console.log(L(X("Multiple matches",`${a.length} rules match "${n}"`),De(l),oe(c.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let l of c)console.log(` #${l.id} [${l.type}] ${l.position} ${l.command} -> ${l.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(l=>l.id)}}async _workflowHelp(e){return e.md?console.log(L(X("Workflow Help","Manage hooks, gates, and steps for your workflow"),X("Commands",De(["`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)",De(['`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=be.getRulesForCommand(t,e):o=be.getAllRules(t),o.length===0)return s.md?console.log(L(X("Workflow Rules","No rules configured"),oe([{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(Rb(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",l=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(X(c,l),a.length>0?Lc(a.join(`
1660
+
1661
+ `),""):null,oe([{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=be.getRulesForCommand(e,"ship").filter(l=>l.position==="before");if(n.length>0){let l=`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(`> ${l}`):f.warn(l),{success:!1,error:l}}let o=await vi(t),i=0,a=[],c=be.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 l=be.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(`#${l} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let l=be.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(`#${l} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(L(ue("Workflow Initialized",`Added ${a.length} default ship rules`),De(a),oe([{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 l of a)console.log(` ${l}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let l='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}let[,i,a]=o;if(!Le.isValidName(i)){let l='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}if(Le.isReservedName(i)){let l=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}if(Le.getWorkflow(t,i)){let l=`Workflow '${i}' already exists`;return n.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}try{let l=Le.createWorkflow(t,{name:i,description:a}),d=await Xl.generateWorkflowTemplate(i,a);if(!d.success){Le.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(ue("Workflow Created",`Created workflow: ${i}`),X("Description",a),X("Template",`Installed at ${d.path}`),oe([{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(`
1662
+ Run with: p. ${i}`)),{success:!0,workflowId:l,name:i,templatePath:d.path}}catch(l){let d=w(l);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Le.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(`
1663
+ `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Custom Workflows",a.join(`
1664
+ `)))}console.log(L(...i,oe([{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(`
1565
1665
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1566
- 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(!et.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Ml.deleteWorkflowTemplate(n),s.md?console.log(L(we("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 j.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=et.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 Bt(o,i,"before",{projectPath:t});if(!c.success){if(s.md)ht("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 Bt(o,i,"after",{projectPath:t}),s.md?console.log(L(we(`Workflow: ${i}`,a.description||""),de([{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 Es.cleanup();return t.md?console.log(we("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Es.listAllSnapshots();if(s.length===0)return t.md?ht("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=ct(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(Y("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),$e(n),de([{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=ct(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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await O.getCurrentTask(o);if(!i)return s.md?ht("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(Y("Tokens",m))):f.fail(m),{success:!1,error:m}}let d=await O.addTokens(o,c,u);return d?(s.md?console.log(L(Y("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),rt({"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 lb(){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(`
1567
- `)}l(lb,"buildEfficiencySection");function ub(r){try{let{prjctDb:e}=(te(),at(to)),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(`
1568
- `)}catch{return null}}l(ub,"buildRpiSection");function Og(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(Og,"formatMinutesToDuration");async function db(r){try{let e=ab.join(r,"analysis","repo-analysis.json"),t=await ib.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e),null}}l(db,"loadRepoAnalysis");function mb(r,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),n=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,h)=>{let b=g.map(W=>` ${W.enabled?h:"o"} #${W.id} ${W.action}`),k=[p,...b],R=Math.max(...k.map(W=>W.length))+2;u.push(`+${"-".repeat(R)}+`);for(let W of k)u.push(`| ${W.padEnd(R-1)}|`);u.push(`+${"-".repeat(R)}+`)},"drawBox"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),n.length>0&&(d("HOOKS (before)",n,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),c.length>0&&(m(u),d("STEPS (after)",c,">")),u.join(`
1569
- `)}l(mb,"buildFlowDiagram");async function pb(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(`
1666
+ 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(!Le.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Xl.deleteWorkflowTemplate(n),s.md?console.log(L(ue("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 I.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 l="Usage: prjct workflow run <name>";return s.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}let a=Le.getWorkflow(o,i);if(!a||!a.enabled){let l=`Workflow '${i}' not found`;return s.md?console.log(`> ${l}`):f.warn(l),{success:!1,error:l}}let c=await Kt(o,i,"before",{projectPath:t});if(!c.success){if(s.md)ht("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let l of c.gatesFailed)console.log(` \u2717 ${l}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Kt(o,i,"after",{projectPath:t}),s.md?console.log(L(ue(`Workflow: ${i}`,a.description||""),oe([{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 _s.cleanup();return t.md?console.log(ue("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await _s.listAllSnapshots();if(s.length===0)return t.md?ht("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let o=s.slice(0,10).map(i=>{let a=ut(Date.now()-new Date(i.timestamp).getTime()),c=i.projectName||i.projectId.slice(0,8),l=i.subtaskCount&&i.activeSubtaskIndex!==void 0?` (${i.activeSubtaskIndex+1}/${i.subtaskCount})`:"";return`[${i.taskStatus}] **${c}** \u2014 ${i.taskDescription}${l} (${a} ago)`});s.length>10&&o.push(`...and ${s.length-10} more`),console.log(L(X("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),De(o),oe([{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=ut(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 I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await M.getCurrentTask(o);if(!i)return s.md?ht("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),l=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(l)){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 M.addTokens(o,c,l);return d?(s.md?console.log(L(X("Tokens Recorded",`+${c.toLocaleString()} in / +${l.toLocaleString()} out`),Oe({"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(w(n)),{success:!1,error:w(n)}}}};function Pb(){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(`
1667
+ `)}u(Pb,"buildEfficiencySection");function Cb(r){try{let{prjctDb:e}=(Y(),lt(ho)),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(`
1668
+ `)}catch{return null}}u(Cb,"buildRpiSection");function ef(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`}u(ef,"formatMinutesToDuration");async function xb(r){try{let e=vb.join(r,"analysis","repo-analysis.json"),t=await Tb.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return j(e),null}}u(xb,"loadRepoAnalysis");function Rb(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"),l=[],d=u((m,g,h)=>{let S=g.map(F=>` ${F.enabled?h:"o"} #${F.id} ${F.action}`),y=[m,...S],A=Math.max(...y.map(F=>F.length))+2;l.push(`+${"-".repeat(A)}+`);for(let F of y)l.push(`| ${F.padEnd(A-1)}|`);l.push(`+${"-".repeat(A)}+`)},"drawBox"),p=u(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(l)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(l)),n.length>0&&(d("HOOKS (before)",n,">"),p(l)),o.length>0&&(d("STEPS (before)",o,">"),p(l)),l.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(l),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(l),d("HOOKS (after)",a,">")),c.length>0&&(p(l),d("STEPS (after)",c,">")),l.join(`
1669
+ `)}u(Rb,"buildFlowDiagram");async function Ab(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(`
1570
1670
  `)){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(`
1571
1671
  `)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
1572
- `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(pb,"getFilesModifiedSinceTaskStart");function gb(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(gb,"formatVariance");var Qn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Yn,this.planning=new Xs,this.shipping=new Vn,this.analytics=new Mn,this.performanceCmds=new Fn,this.maintenance=new On,this.analysis=new Zs,this.setupCmds=new Hn,this.updateCmds=new qn,this.velocityCmds=new zn,this.contextCmds=new en,this.parallelCmds=new tn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async 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)}},kU=new Qn;ui();var Ng={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}},Lg=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"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"]}];li();ss();ye();U();B();xt();import{execSync as Ei}from"node:child_process";import wt from"node:fs/promises";import fb from"node:os";import ls from"node:path";import hb from"node:readline";import Te from"chalk";var Pi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",_r="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Ug(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ls.join(r,s.name);if(s.isDirectory())e+=await Ug(n);else try{let o=await wt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Ug,"getDirectorySize");function Fg(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(Fg,"formatSize");async function yb(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(yb,"countDirectoryItems");function wb(){let r={homebrew:!1,npm:!1};try{Ei("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ei("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(wb,"detectInstallation");async function kb(){let r=[],e=ju(),t=A.getGlobalBasePath(),s=await C(t),n=s?await yb(ls.join(t,"projects")):0,o=s?await Ug(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=ls.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let R=await wt.readFile(i,"utf-8");c=R.includes(Pi)&&R.includes(_r)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=ls.join(e.claude.config,"prjct-statusline.sh"),p=await C(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,h=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let b=ls.join(e.gemini.config,"GEMINI.md"),k=await C(b),E=!1;if(k)try{let R=await wt.readFile(b,"utf-8");E=R.includes(Pi)&&R.includes(_r)}catch{}return k&&E&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(kb,"gatherUninstallItems");async function Sb(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Pi)||!e.includes(_r))return!1;let t=e.indexOf(Pi),s=e.indexOf(_r)+_r.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1573
-
1574
- `).trim(),!n||n.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${n}
1575
- `,"utf-8"),!0}catch{return!1}}l(Sb,"removePrjctSection");async function bb(){let r=fb.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ls.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await Hg(s,ls.join(t,".prjct-cli")),t}catch{return null}}l(bb,"createBackup");async function Hg(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ls.join(r,s.name),o=ls.join(e,s.name);s.isDirectory()?await Hg(n,o):await wt.copyFile(n,o)}}l(Hg,"copyDirectory");async function Tb(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await Sb(o.path)&&s.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${y(i)}`)}try{await new ts().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ei(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Ei("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(Tb,"performUninstall");async function vb(r){let e=hb.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(vb,"promptConfirmation");async function Eb(r={},e=process.cwd()){let t=await kb(),s=wb(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Te.yellow(`
1576
- 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(Te.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Te.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Fg(c.size)})`)),console.log(` ${Te.cyan(u.padEnd(35))} ${d}`),console.log(` ${Te.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Te.cyan("Homebrew".padEnd(35))} ${Te.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Te.cyan("npm global".padEnd(35))} ${Te.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Te.dim(` Total size: ${Fg(o)}`)),console.log("")),r.dryRun)return console.log(Te.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Te.blue("Creating backup..."));let c=await bb();c?(console.log(Te.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Te.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Te.yellow('Type "uninstall" to confirm:')),!await vb("> ")))return console.log(Te.yellow(`
1577
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await Tb(t,s,r);if(console.log(""),i.length>0&&console.log(Te.green(`Removed ${i.length} items`)),a.length>0){console.log(Te.yellow(`
1578
- ${a.length} errors:`));for(let c of a)console.log(Te.red(` - ${c}`))}return console.log(""),console.log(Te.green("prjct has been uninstalled.")),console.log(Te.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(Eb,"uninstall");var Ci=class extends ke{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Eb(e,t)}};var Ps=new Yn,xi=new Xs,Pb=new Vn,Wg=new Mn,Cb=new Fn,Cs=new On,Zn=new Zs,Or=new Hn,xb=new en,Ab=new zn,Hl=new tn,Rb=new Ci,Db=new qn;function Ib(){for(let[r,e]of Object.entries(Ng))F.registerCategory(r,e)}l(Ib,"registerCategories");function jb(){if(F.has("work"))return;Ib();let r=l(e=>Lg.find(t=>t.name===e),"getMeta");F.registerMethod("task",Ps,"now",r("task")),F.registerMethod("done",Ps,"done",r("done")),F.registerMethod("next",Ps,"next",r("next")),F.registerMethod("pause",Ps,"pause",r("pause")),F.registerMethod("resume",Ps,"resume",r("resume")),F.registerMethod("workflow",Ps,"workflow",r("workflow")),F.registerMethod("tokens",Ps,"tokens",r("tokens")),F.registerMethod("sessions",Ps,"sessions",r("sessions")),F.registerMethod("init",xi,"init",r("init")),F.registerMethod("bug",xi,"bug",r("bug")),F.registerMethod("idea",xi,"idea",r("idea")),F.registerMethod("spec",xi,"spec",r("spec")),F.registerMethod("ship",Pb,"ship",r("ship")),F.registerMethod("dash",Wg,"dash",r("dash")),F.registerMethod("help",Wg,"help",r("help")),F.registerMethod("perf",Cb,"perf",r("perf")),F.registerMethod("velocity",Ab,"velocity",r("velocity")),F.registerMethod("cleanup",Cs,"cleanup",r("cleanup")),F.registerMethod("cleanup-projects",Cs,"cleanupProjects",r("cleanup-projects")),F.registerMethod("design",Cs,"design",r("design")),F.registerMethod("recover",Cs,"recover",r("recover")),F.registerMethod("undo",Cs,"undo",r("undo")),F.registerMethod("redo",Cs,"redo",r("redo")),F.registerMethod("history",Cs,"history",r("history")),F.registerMethod("enrich",Cs,"enrich",r("enrich")),F.registerMethod("analyze",Zn,"analyze",r("analyze")),F.registerMethod("sync",Zn,"sync",r("sync")),F.registerMethod("stats",Zn,"stats",r("stats")),F.registerMethod("status",Zn,"status",r("status")),F.registerMethod("seal",Zn,"seal",r("seal")),F.registerMethod("verify",Zn,"verify",r("verify")),F.registerMethod("start",Or,"start",r("start")),F.registerMethod("setup",Or,"setup",r("setup")),F.registerMethod("login",Or,"login",r("login")),F.registerMethod("logout",Or,"logout",r("logout")),F.registerMethod("auth",Or,"auth",r("auth")),F.registerMethod("uninstall",Rb,"uninstall",r("uninstall")),F.registerMethod("update",Db,"update",r("update")),F.registerMethod("context",xb,"context",r("context")),F.registerMethod("parallel",Hl,"parallel",r("parallel")),F.registerMethod("worktree",Hl,"parallel",r("worktree")),F.registerMethod("conductor",Hl,"parallel",r("conductor"))}l(jb,"registerAllCommands");jb();Ce();ur();It();import{Hono as Gb}from"hono";import{cors as Vb}from"hono/cors";import{logger as Bb}from"hono/logger";import{secureHeaders as Jb}from"hono/secure-headers";ye();te();ws();Ht();Hs();ft();U();es();import $b from"node:fs/promises";import Mb from"node:path";import{Hono as _b}from"hono";function Ob(r){return A.getGlobalProjectPath(r)}l(Ob,"getProjectDataPath");function Gg(r,e){let t=new _b,s=Ob(r);return t.get("/state",async n=>{let o=await O.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await pe.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Ue.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 Ye.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([O.read(r),pe.read(r),Ue.read(r),Ye.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 O.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=Mb.join(s,"context",`${o}.md`),c=await $b.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return D(a)||H.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Gg,"createRoutes");ye();te();ws();Ht();Hs();ft();import er from"node:fs/promises";import Nb from"node:path";import{Hono as Lb}from"hono";var Fb=A.getGlobalBasePath(),tr=Nb.join(Fb,"projects");function Ai(r){return P.getDoc(r,"project")}l(Ai,"getProjectConfig");async function Wl(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(Wl,"calculateDuration");function Vg(){let r=new Lb;return r.get("/projects",async e=>{try{await er.mkdir(tr,{recursive:!0});let s=(await er.readdir(tr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Ai(o),a=await O.read(o),c=await pe.read(o),u=await Ue.read(o),d=await Ye.read(o),m=a?.currentTask,p=await Wl(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return 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(Ai(t)),O.read(t),pe.read(t),Ue.read(t),Ye.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Wl(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(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)>=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:p,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 O.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 O.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 O.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 O.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 O.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 O.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([O.read(t),pe.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 O.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(m=>typeof m=="string").slice(0,20):[],d=await Ue.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 er.mkdir(tr,{recursive:!0});let s=(await er.readdir(tr,{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 O.read(c),d=await pe.read(c),m=await Ue.read(c),p=await Ye.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await er.mkdir(tr,{recursive:!0});let n=(await er.readdir(tr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=Ai(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let m=await O.read(d),p=Ai(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Wl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}l(Vg,"createExtendedRoutes");import{streamSSE as Ub}from"hono/streaming";var Bg=3600*1e3,Hb=300*1e3,Wb=3e4;function Jg(){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()>Bg&&t(i)},Hb),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 Ub(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")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Wb),p=setTimeout(()=>{t(a)},Bg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}l(Jg,"createSSEManager");function qg(r){let e=new Gb,t=Jg();e.use("*",Jb()),r.enableCors!==!1&&e.use("*",Vb({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("*",Bb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ee,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=Gg(r.projectId,r.projectPath);e.route("/api",s);let n=Vg();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(js())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: ${js()?"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(qg,"createServer");var zg=3478;te();Il();var zb=50,sr=null,Nr=null,ge=null,ve=null;async function Kg(r){let e=_e.socket(),t=_e.pid(),s=_e.runDir();if(Oe.mkdirSync(s,{recursive:!0}),Oe.existsSync(t)){let i=parseInt(Oe.readFileSync(t,"utf-8").trim(),10);Zb(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Oe.unlinkSync(t)}Oe.existsSync(e)&&Oe.unlinkSync(e),sT();let n=eT(),o=null;if(n)try{o=Oe.statSync(n).mtimeMs}catch{}if(ve={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:kg,idleTimer:null,entryPath:n,entryMtime:o},ge=new Qn,sr=qb(i=>Kb(i)),sr.listen(e,()=>{Oe.chmodSync(e,384),Oe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Xg()}),sr.on("error",i=>{console.error("Daemon socket error:",i.message),nr(1)}),!r.noHttp)try{let i=process.cwd(),a=await j.getProjectId(i);if(a){let c=r.port||zg;Nr=qg({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Nr.start()}}catch{}if(process.on("SIGTERM",()=>nr(0)),process.on("SIGINT",()=>nr(0)),process.on("SIGHUP",()=>{ge=new Qn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Kg,"startDaemon");function Kb(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Sg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Bn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1579
- `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await Xb(o);r.write(Bn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Bn(i))}}}),r.on("error",()=>{})}l(Kb,"handleConnection");async function Xb(r){if(!ve||!ge)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Xg(),ve.commandsServed++,ve.lastActivity=Date.now(),ve.commandsServed%zb===0&&$.checkpointAll(),Yg()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),nr(0)},200)),r.command==="daemon")return Qb(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 Yb(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1672
+ `)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}u(Ab,"getFilesModifiedSinceTaskStart");function jb(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`}u(jb,"formatVariance");var pr=class{static{u(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new dr,this.planning=new rn,this.shipping=new rr,this.analytics=new Bn,this.performanceCmds=new Zn,this.maintenance=new Jn,this.analysis=new cn,this.setupCmds=new tr,this.updateCmds=new ar,this.velocityCmds=new cr,this.contextCmds=new ln,this.obsidianCmds=new Xn,this.parallelCmds=new un,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},s1=new pr;xi();var tf={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}},sf=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Ci();cs();Se();W();B();bt();import{execSync as Hi}from"node:child_process";import Tt from"node:fs/promises";import Db from"node:os";import ys from"node:path";import Ib from"node:readline";import Ce from"chalk";var Wi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Jr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function rf(r){let e=0;try{let t=await Tt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ys.join(r,s.name);if(s.isDirectory())e+=await rf(n);else try{let o=await Tt.stat(n);e+=o.size}catch{}}}catch{}return e}u(rf,"getDirectorySize");function nf(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]}`}u(nf,"formatSize");async function $b(r){try{return(await Tt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}u($b,"countDirectoryItems");function _b(){let r={homebrew:!1,npm:!1};try{Hi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Hi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}u(_b,"detectInstallation");async function Mb(){let r=[],e=Yu(),t=R.getGlobalBasePath(),s=await C(t),n=s?await $b(ys.join(t,"projects")):0,o=s?await rf(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=ys.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let A=await Tt.readFile(i,"utf-8");c=A.includes(Wi)&&A.includes(Jr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let l=e.claude.router,d=await C(l);r.push({path:l,type:"file",description:"Claude router",exists:d});let p=ys.join(e.claude.config,"prjct-statusline.sh"),m=await C(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,h=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let S=ys.join(e.gemini.config,"GEMINI.md"),y=await C(S),E=!1;if(y)try{let A=await Tt.readFile(S,"utf-8");E=A.includes(Wi)&&A.includes(Jr)}catch{}return y&&E&&r.push({path:S,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}u(Mb,"gatherUninstallItems");async function Ob(r){try{let e=await Tt.readFile(r,"utf-8");if(!e.includes(Wi)||!e.includes(Jr))return!1;let t=e.indexOf(Wi),s=e.indexOf(Jr)+Jr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
1673
+
1674
+ `).trim(),!n||n.trim().length===0?await Tt.unlink(r):await Tt.writeFile(r,`${n}
1675
+ `,"utf-8"),!0}catch{return!1}}u(Ob,"removePrjctSection");async function Nb(){let r=Db.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ys.join(r,`.prjct-backup-${e}`);try{await Tt.mkdir(t,{recursive:!0});let s=R.getGlobalBasePath();return await C(s)&&await of(s,ys.join(t,".prjct-cli")),t}catch{return null}}u(Nb,"createBackup");async function of(r,e){await Tt.mkdir(e,{recursive:!0});let t=await Tt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ys.join(r,s.name),o=ys.join(e,s.name);s.isDirectory()?await of(n,o):await Tt.copyFile(n,o)}}u(of,"copyDirectory");async function Lb(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await Ob(o.path)&&s.push(o.path):o.type==="directory"?(await Tt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await Tt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${w(i)}`)}try{await new as().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Hi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||Hi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${w(o)}`)}}return{deleted:s,errors:n}}u(Lb,"performUninstall");async function Fb(r){let e=Ib.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}u(Fb,"promptConfirmation");async function Ub(r={},e=process.cwd()){let t=await Mb(),s=_b(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Ce.yellow(`
1676
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,l)=>c+(l.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of n){let l=R.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${nf(c.size)})`)),console.log(` ${Ce.cyan(l.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${nf(o)}`)),console.log("")),r.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Ce.blue("Creating backup..."));let c=await Nb();c?(console.log(Ce.green(`Backup created: ${R.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await Fb("> ")))return console.log(Ce.yellow(`
1677
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await Lb(t,s,r);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1678
+ ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}u(Ub,"uninstall");var qi=class extends he{static{u(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Ub(e,t)}};var Ms=new dr,Gi=new rn,Hb=new rr,af=new Bn,Wb=new Zn,Os=new Jn,mr=new cn,zr=new tr,qb=new ln,Gb=new cr,Bb=new Xn,nu=new un,Vb=new qi,Jb=new ar;function zb(){for(let[r,e]of Object.entries(tf))U.registerCategory(r,e)}u(zb,"registerCategories");function Kb(){if(U.has("work"))return;zb();let r=u(e=>sf.find(t=>t.name===e),"getMeta");U.registerMethod("task",Ms,"now",r("task")),U.registerMethod("done",Ms,"done",r("done")),U.registerMethod("next",Ms,"next",r("next")),U.registerMethod("pause",Ms,"pause",r("pause")),U.registerMethod("resume",Ms,"resume",r("resume")),U.registerMethod("workflow",Ms,"workflow",r("workflow")),U.registerMethod("tokens",Ms,"tokens",r("tokens")),U.registerMethod("sessions",Ms,"sessions",r("sessions")),U.registerMethod("init",Gi,"init",r("init")),U.registerMethod("bug",Gi,"bug",r("bug")),U.registerMethod("idea",Gi,"idea",r("idea")),U.registerMethod("spec",Gi,"spec",r("spec")),U.registerMethod("ship",Hb,"ship",r("ship")),U.registerMethod("dash",af,"dash",r("dash")),U.registerMethod("help",af,"help",r("help")),U.registerMethod("perf",Wb,"perf",r("perf")),U.registerMethod("velocity",Gb,"velocity",r("velocity")),U.registerMethod("cleanup",Os,"cleanup",r("cleanup")),U.registerMethod("cleanup-projects",Os,"cleanupProjects",r("cleanup-projects")),U.registerMethod("design",Os,"design",r("design")),U.registerMethod("recover",Os,"recover",r("recover")),U.registerMethod("undo",Os,"undo",r("undo")),U.registerMethod("redo",Os,"redo",r("redo")),U.registerMethod("history",Os,"history",r("history")),U.registerMethod("enrich",Os,"enrich",r("enrich")),U.registerMethod("analyze",mr,"analyze",r("analyze")),U.registerMethod("sync",mr,"sync",r("sync")),U.registerMethod("stats",mr,"stats",r("stats")),U.registerMethod("status",mr,"status",r("status")),U.registerMethod("seal",mr,"seal",r("seal")),U.registerMethod("verify",mr,"verify",r("verify")),U.registerMethod("start",zr,"start",r("start")),U.registerMethod("setup",zr,"setup",r("setup")),U.registerMethod("login",zr,"login",r("login")),U.registerMethod("logout",zr,"logout",r("logout")),U.registerMethod("auth",zr,"auth",r("auth")),U.registerMethod("uninstall",Vb,"uninstall",r("uninstall")),U.registerMethod("update",Jb,"update",r("update")),U.registerMethod("context",qb,"context",r("context")),U.registerMethod("obsidian",Bb,"obsidian",r("obsidian")),U.registerMethod("parallel",nu,"parallel",r("parallel")),U.registerMethod("worktree",nu,"parallel",r("worktree")),U.registerMethod("conductor",nu,"parallel",r("conductor"))}u(Kb,"registerAllCommands");Kb();Ae();vr();_t();import au from"node:fs";import Ns from"node:path";import{Hono as aT}from"hono";import{cors as cT}from"hono/cors";import{logger as lT}from"hono/logger";import{secureHeaders as uT}from"hono/secure-headers";Se();Y();Cs();Nt();Rs();ft();W();is();import Xb from"node:fs/promises";import Yb from"node:path";import{Hono as Qb}from"hono";function Zb(r){return R.getGlobalProjectPath(r)}u(Zb,"getProjectDataPath");function cf(r,e){let t=new Qb,s=Zb(r);return t.get("/state",async n=>{let o=await M.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await re.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Pe.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=T.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await Je.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([M.read(r),re.read(r),Pe.read(r),Je.read(r)]),l=T.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:l||{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 M.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=Yb.join(s,"context",`${o}.md`),c=await Xb.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return j(a)||q.error(`Context read error: ${w(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}u(cf,"createRoutes");Se();Ps();import ss from"node:fs/promises";import iu from"node:path";import{Hono as sT}from"hono";Y();function eT(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}u(eT,"rowToComment");function tT(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}u(tT,"generateId");var ru=class{static{u(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=tT(),i=new Date().toISOString();return T.run(e,`INSERT INTO queue_task_comments (id, task_id, author, content, created_at, updated_at)
1679
+ VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return T.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(eT)}updateComment(e,t,s){return T.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(T.run(e,"UPDATE queue_task_comments SET content = ?, updated_at = ? WHERE id = ?",s,new Date().toISOString(),t),!0):!1}deleteComment(e,t){return T.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(T.run(e,"DELETE FROM queue_task_comments WHERE id = ?",t),!0):!1}},Kr=new ru;Ti();Y();Cs();xn();Bo();Nt();Rs();ft();Xo();Fr();var nT=R.getGlobalBasePath(),gr=iu.join(nT,"projects");function Xr(r){return T.getDoc(r,"project")}u(Xr,"getProjectConfig");async function ou(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`}u(ou,"calculateDuration");function lf(){let r=new sT;return r.get("/projects",async e=>{try{await ss.mkdir(gr,{recursive:!0});let s=(await ss.readdir(gr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Xr(o),a=await M.read(o),c=await re.read(o),l=await Pe.read(o),d=await Je.read(o),p=a?.currentTask,m=await ou(p?.startedAt),g=i;return{id:o,name:g?.name||o.slice(0,8),path:g?.repoPath||g?.path||null,stack:g?.stack||null,branch:g?.currentBranch||null,fileCount:g?.fileCount||null,lastSync:g?.lastSync||null,version:g?.version||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:l?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0,tasksToday:0,tasksThisWeek:0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:String(o.name||"").localeCompare(String(i.name||""))),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Xr(t)),M.read(t),re.read(t),Pe.read(t),Je.read(t)]),c=T.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await ou(n.currentTask.startedAt));let l=new Date,d=new Date(l.getFullYear(),l.getMonth(),l.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(S=>!S.completed||!S.completedAt?!1:new Date(S.completedAt)>=d)?.length||0,g=o?.tasks?.filter(S=>!S.completed||!S.completedAt?!1:new Date(S.completedAt)>=p)?.length||0,h=null;try{let S=T.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");if(S){let y=JSON.parse(S.analysis);h={architecture:y.architecture,patterns:(y.patterns||[]).slice(0,6),antiPatterns:(y.antiPatterns||[]).slice(0,4),techDebt:(y.techDebt||[]).slice(0,4),conventions:y.conventions,stack:y.stack,analyzedAt:y.analyzedAt,commitHash:y.commitHash}}}catch{}return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},analysis:h,stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(S=>!S.completed)?.length||0,ideasCount:i?.ideas?.filter(S=>S.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 M.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 M.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 M.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 M.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 M.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 M.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([M.read(t),re.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},l={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await M.write(t,l),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",l=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await Pe.addIdea(t,n,{priority:c,tags:l});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 ss.mkdir(gr,{recursive:!0});let s=(await ss.readdir(gr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let l=await M.read(c),d=await re.read(c),p=await Pe.read(c),m=await Je.read(c);l?.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 ss.mkdir(gr,{recursive:!0});let n=(await ss.readdir(gr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=Xr(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,l=o?[o]:n;for(let d of l){let p=await M.read(d),m=Xr(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await ou(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/queue",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{description:n,priority:o,type:i,section:a}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"description required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"description too long (max 5000 chars)"},400);let c=await re.addTask(t,{description:n,priority:o||"medium",type:i||"feature",section:a||"active"});return e.json({success:!0,task:c})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await re.getTask(t,s);if(!n)return e.json({error:"Task not found"},404);let o=Kr.getComments(t,s);return e.json({task:n,comments:o})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json().catch(()=>({})),o={};if(n.priority&&typeof n.priority=="string"){if(!["low","medium","high","critical","normal","urgent"].includes(n.priority))return e.json({success:!1,error:"Invalid priority"},400);o.priority=n.priority}if(n.section&&typeof n.section=="string"){if(!["active","backlog","previously_active"].includes(n.section))return e.json({success:!1,error:"Invalid section"},400);o.section=n.section}return typeof n.description=="string"&&(o.description=n.description),typeof n.body=="string"&&(o.body=n.body),typeof n.type=="string"&&(o.type=n.type),Object.keys(o).length>0&&!await re.updateTask(t,s,o)?e.json({success:!1,error:"Task not found"},404):e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{return await re.removeTask(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/:taskId/comments",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json(),{content:o,author:i}=n;if(!o?.trim())return e.json({error:"Content required"},400);let a=Kr.addComment(t,s,o.trim(),i);return e.json({comment:a})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId/comments/:commentId",async e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{let n=await e.req.json(),{content:o}=n;return o?.trim()?Kr.updateComment(t,s,o.trim())?e.json({success:!0}):e.json({error:"Not found"},404):e.json({error:"Content required"},400)}catch(n){return e.json({error:String(n)},500)}}),r.delete("/projects/:id/queue/:taskId/comments/:commentId",e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{return Kr.deleteComment(t,s),e.json({success:!0})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{let n=await e.req.json().catch(()=>({})),{priority:o,tags:i}=n;if(o){if(!["low","medium","high"].includes(o))return e.json({success:!1,error:"Invalid priority"},400);await Pe.setPriority(t,s,o)}if(i&&Array.isArray(i)){let a=i.filter(c=>typeof c=="string").slice(0,20);a.length>0&&await Pe.addTags(t,s,a)}return e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await Pe.removeIdea(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas/:ideaId/archive",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await Pe.archive(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id/task",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{description:n,type:o,branch:i}=s,a={};return n&&typeof n=="string"&&(a.description=n),o&&typeof o=="string"&&(a.type=o),i&&typeof i=="string"&&(a.branch=i),Object.keys(a).length===0?e.json({success:!1,error:"No valid fields to update"},400):await M.updateCurrentTask(t,a)?e.json({success:!0}):e.json({success:!1,error:"No active task"},400)}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{name:n,description:o,stack:i,techStack:a,repoPath:c}=s,l=R.getGlobalProjectPath(t),d=iu.join(l,"project.json"),p={};try{let m=await ss.readFile(d,"utf-8");p=JSON.parse(m)}catch{p={projectId:t}}return n!==void 0&&(p.name=n),o!==void 0&&(p.description=o),i!==void 0&&(p.stack=i),a!==void 0&&(p.techStack=a),c!==void 0&&(p.repoPath=c),await ss.mkdir(iu.dirname(d),{recursive:!0}),await ss.writeFile(d,JSON.stringify(p,null,2)),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id",async e=>{let t=e.req.param("id");try{T.close(t);let s=R.getGlobalProjectPath(t);return await ss.rm(s,{recursive:!0,force:!0}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflow-graph",e=>{let t=e.req.param("id");try{let s=T.getDoc(t,"workflow-graph");return e.json({edges:s?.edges||[]})}catch{return e.json({edges:[]})}}),r.put("/projects/:id/workflow-graph",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{edges:n}=s;return T.setDoc(t,"workflow-graph",{edges:n||[]}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflows",e=>{let t=e.req.param("id");try{let s=Le.getAllWorkflows(t),n=be.getAllRules(t);return e.json({workflows:s,rules:n})}catch{return e.json({workflows:[],rules:[]})}}),r.patch("/projects/:id/workflows/:name",async e=>{let{id:t,name:s}=e.req.param();try{let n=await e.req.json().catch(()=>({})),{enabled:o}=n,i=Le.getWorkflow(t,s);return i?(Le.updateWorkflow(t,s,{enabled:o??!i.enabled}),e.json({success:!0})):e.json({success:!1,error:"Workflow not found"},404)}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/workflow-rules",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{type:n,command:o,position:i,action:a,description:c,enabled:l,timeoutMs:d}=s,p=be.addRule(t,{type:n,command:o,position:i,action:a,description:c||null,enabled:l??!0,timeoutMs:d??3e4,createdAt:new Date().toISOString(),sortOrder:0});return e.json({success:!0,id:p})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.patch("/projects/:id/workflow-rules/:ruleId",async e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{let n=await e.req.json();return be.updateRule(t,s,n),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.delete("/projects/:id/workflow-rules/:ruleId",e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{return be.removeRule(t,s),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/projects/:id/metrics",async e=>{let t=e.req.param("id");try{let s=await ms.getSummary(t),n=await ms.getDailyStats(t,90);return e.json({...s,dailyStats:n})}catch{return e.json({totalTokensSaved:0,avgCompressionRate:0,syncCount:0,dailyStats:[]})}}),r.get("/projects/:id/velocity",async e=>{let t=e.req.param("id");try{let s=await In.getMetrics(t);return e.json(s)}catch{return e.json({averageVelocity:0,velocityTrend:"stable",sprints:[]})}}),r.get("/projects/:id/analysis/full",e=>{let t=e.req.param("id");try{let s=jo.getActive(t),n=jo.getHistory(t,10);return e.json({analysis:s,history:n})}catch{return e.json({analysis:null,history:[]})}}),r.get("/projects/:id/index",async e=>{let t=e.req.param("id");try{let s=await pn.readIndex(t),n=await pn.readDomains(t),o=await pn.readScores(t),i=await pn.readCategories(t);return e.json({index:s,domains:n,scores:o?.slice(0,100),categories:i})}catch{return e.json({index:null,domains:null,scores:[],categories:null})}}),r.get("/projects/:id/archives",e=>{let t=e.req.param("id"),s=e.req.query("type")||void 0,n=Number(e.req.query("limit"))||50;try{let o=gt.getArchived(t,s,n),i=gt.getStats(t);return e.json({items:o,stats:i})}catch{return e.json({items:[],stats:{total:0,byType:{}}})}}),r.get("/projects/:id/context-health",e=>{let t=e.req.param("id");try{let s=Hr.getSummary(t,30),n=Hr.getTransitions(t,50);return e.json({summary:s,transitions:n})}catch{return e.json({summary:null,transitions:[]})}}),r.get("/projects/:id/context-feedback",e=>{let t=e.req.param("id");try{let s=T.query(t,"SELECT * FROM context_feedback ORDER BY created_at DESC LIMIT 50");return e.json({feedback:s})}catch{return e.json({feedback:[]})}}),r.get("/projects/:id/state/full",async e=>{let t=e.req.param("id");try{let s=await M.read(t);return e.json(s)}catch{return e.json({currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""})}}),r.get("/projects/:id/events",e=>{let t=e.req.param("id"),s=Number(e.req.query("limit"))||100,n=Number(e.req.query("offset"))||0,o=e.req.query("type")||void 0;try{let i=o?T.query(t,"SELECT * FROM events WHERE type = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?",o,s,n):T.query(t,"SELECT * FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?",s,n),a=T.get(t,"SELECT COUNT(*) as c FROM events");return e.json({events:i,total:a?.c||0,limit:s,offset:n})}catch{return e.json({events:[],total:0})}}),r.get("/projects/:id/memory",e=>{let t=e.req.param("id");try{let s=T.query(t,"SELECT * FROM memory ORDER BY updated_at DESC LIMIT 200");return e.json({items:s})}catch{return e.json({items:[]})}}),r.get("/projects/:id/sessions",e=>{let t=e.req.param("id");try{let s=T.query(t,"SELECT * FROM sessions ORDER BY started_at DESC LIMIT 50"),n=T.query(t,"SELECT * FROM agent_sessions ORDER BY started_at DESC LIMIT 50");return e.json({sessions:s,agentSessions:n})}catch{return e.json({sessions:[],agentSessions:[]})}}),r.get("/projects/:id/tasks",e=>{let t=e.req.param("id");try{let s=T.query(t,"SELECT * FROM tasks ORDER BY started_at DESC LIMIT 100"),n=T.query(t,"SELECT * FROM subtasks ORDER BY sort_order ASC");return e.json({tasks:s,subtasks:n})}catch{return e.json({tasks:[],subtasks:[]})}}),r.get("/projects/:id/kv",e=>{let t=e.req.param("id");try{let s=T.query(t,"SELECT key, value FROM kv_store ORDER BY key"),n={};for(let o of s)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return e.json(n)}catch{return e.json({})}}),r.get("/projects/:id/issues",e=>{let t=e.req.param("id");try{let s=T.getDoc(t,"issues");return e.json({issues:s?.issues||[]})}catch{return e.json({issues:[]})}}),r.get("/projects/:id/roadmap",e=>{let t=e.req.param("id");try{let s=T.getDoc(t,"roadmap");return e.json(s||{features:[],backlog:[]})}catch{return e.json({features:[],backlog:[]})}}),r.get("/projects/:id/config",async e=>{let t=e.req.param("id");try{let s=Xr(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}u(lf,"createExtendedRoutes");import{streamSSE as rT}from"hono/streaming";var uf=3600*1e3,oT=300*1e3,iT=3e4;function df(){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))}u(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>uf&&t(i)},oT),e&&typeof e=="object"&&"unref"in e&&e.unref())}u(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return u(n,"stopReaper"),s(),{handleConnection(o){return rT(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),l=new AbortController,d={id:a,connectedAt:c,send:u((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"send"),close:u(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},iT),m=setTimeout(()=>{t(a)},uf);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:l}),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=>{l.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,l]of r)try{l.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}u(df,"createSSEManager");function pf(r){let e=new aT,t=df();e.use("*",uT()),r.enableCors!==!1&&e.use("*",cT({origin:u(c=>{if(!c)return c;try{let l=new URL(c);return l.hostname==="localhost"||l.hostname==="127.0.0.1"?c:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",lT()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:Re,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=cf(r.projectId,r.projectPath);e.route("/api",s);let n=lf();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ns.resolve(__dirname,"..","dist","web"),Ns.resolve(__dirname,"..","..","dist","web"),Ns.resolve(process.cwd(),"dist","web"),Ns.resolve(__dirname,"..","web")].find(c=>au.existsSync(Ns.join(c,"index.html")))||null;if(i){let c={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2"};e.get("/assets/*",async l=>{let d=Ns.join(i,l.req.path);try{let p=au.readFileSync(d),m=Ns.extname(d);return new Response(p,{headers:{"Content-Type":c[m]||"application/octet-stream","Cache-Control":"public, max-age=31536000, immutable"}})}catch{return l.notFound()}}),e.get("*",l=>{if(l.req.path.startsWith("/api"))return l.notFound();try{let d=au.readFileSync(Ns.join(i,"index.html"),"utf-8");return l.html(d)}catch{return l.json({error:"Dashboard not built. Run: cd web && bun run build"},404)}})}let a=null;return{app:e,async start(){let c=r.port,l=r.host||"0.0.0.0";if(qs())a=Bun.serve({port:c,hostname:l,fetch:e.fetch});else{let{serve:d}=await import("@hono/node-server"),p=d({fetch:e.fetch,port:c,hostname:l});a={stop:u(()=>p.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${l}:${c}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${qs()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${c}`)},stop(){t.shutdown(),a&&(a.stop(),a=null,console.log("Server stopped"))},broadcast(c,l){t.broadcast(c,l)}}}u(pf,"createServer");var mf=3478;Y();Jl();var pT=50,fr=null,Yr=null,ye=null,xe=null;async function gf(r){let e=Fe.socket(),t=Fe.pid(),s=Fe.runDir();if(Ue.mkdirSync(s,{recursive:!0}),Ue.existsSync(t)){let i=parseInt(Ue.readFileSync(t,"utf-8").trim(),10);yT(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ue.unlinkSync(t)}Ue.existsSync(e)&&Ue.unlinkSync(e),ST();let n=wT(),o=null;if(n)try{o=Ue.statSync(n).mtimeMs}catch{}if(xe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Lg,idleTimer:null,entryPath:n,entryMtime:o},ye=new pr,fr=dT(i=>mT(i)),fr.listen(e,()=>{Ue.chmodSync(e,384),Ue.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),ff()}),fr.on("error",i=>{console.error("Daemon socket error:",i.message),hr(1)}),!r.noHttp)try{let i=process.cwd(),a=await I.getProjectId(i);if(a){let c=r.port||mf;Yr=pf({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Yr.start()}}catch{}if(process.on("SIGTERM",()=>hr(0)),process.on("SIGINT",()=>hr(0)),process.on("SIGHUP",()=>{ye=new pr,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}u(gf,"startDaemon");function mT(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Fg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(or(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
1680
+ `))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await gT(o);r.write(or(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(or(i))}}}),r.on("error",()=>{})}u(mT,"handleConnection");async function gT(r){if(!xe||!ye)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ff(),xe.commandsServed++,xe.lastActivity=Date.now(),xe.commandsServed%pT===0&&_.checkpointAll(),hf()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),hr(0)},200)),r.command==="daemon")return hT(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 fT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1580
1681
  `)||o.message||void 0,stderr:t.join(`
1581
- `)||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(Xb,"handleRequest");async function Yb(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return ge.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 ge.status(r.cwd,{json:t.json===!0,md:s});case"stats":return ge.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ge.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return ge.seal(r.cwd,{json:t.json===!0});case"rollback":return ge.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return ge.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ge.task(e,r.cwd,{md:s});case"done":return ge.done(r.cwd,{md:s});case"next":return ge.next(r.cwd,{md:s});case"pause":return ge.pause(e||"",r.cwd,{md:s});case"resume":return ge.resume(e,r.cwd,{md:s});case"bug":return ge.bug(e||"",r.cwd,{md:s});case"idea":return ge.idea(e||"",r.cwd,{md:s});case"ship":return ge.ship(e,r.cwd,{md:s});case"dash":return ge.dash(e||"default",r.cwd,{md:s});case"workflow":return ge.workflowPrefs(e,r.cwd,{md:s});case"sessions":return ge.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ge.design(e||"",t,r.cwd);case"analysis-payload":return ge.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ge.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return ge.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return ge.analyze(t,r.cwd);case"cleanup":return ge.cleanup(t,r.cwd);case"cleanup-projects":return ge.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return F.execute(r.command,e,r.cwd)}}l(Yb,"executeCommand");function Qb(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:_e.socket(),uptime:ve?Date.now()-ve.startedAt:0,commandsServed:ve?.commandsServed??0,lastActivity:ve?new Date(ve.lastActivity).toISOString():null,registeredCommands:F.list().length,stale:Yg()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>nr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(Qb,"handleDaemonCommand");function Xg(){ve&&(ve.idleTimer&&clearTimeout(ve.idleTimer),ve.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ve.idleTimeoutMs/1e3/60} minutes, shutting down`),nr(0)},ve.idleTimeoutMs),ve.idleTimer.unref&&ve.idleTimer.unref())}l(Xg,"resetIdleTimer");function nr(r){console.log("Daemon shutting down..."),ve?.idleTimer&&clearTimeout(ve.idleTimer),Nr&&(Nr.stop(),Nr=null),sr&&(sr.close(),sr=null),$.close();let e=_e.socket(),t=_e.pid();try{Oe.existsSync(e)&&Oe.unlinkSync(e)}catch{}try{Oe.existsSync(t)&&Oe.unlinkSync(t)}catch{}process.exit(r)}l(nr,"shutdown");function Zb(r){try{return process.kill(r,0),!0}catch{return!1}}l(Zb,"isProcessRunning");function eT(){let r=kt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Oe.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Oe.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(Oe.existsSync(n))return n;let s=process.argv[1];return s&&Oe.existsSync(s)?s:null}l(eT,"resolveEntryPath");var tT=1024*1024;function sT(){let r=_e.log();try{if(Oe.statSync(r).size>tT){let t=`${r}.1`;try{Oe.unlinkSync(t)}catch{}Oe.renameSync(r,t)}}catch{}}l(sT,"rotateLog");function Yg(){if(!ve?.entryPath||ve.entryMtime===null)return!1;try{return Oe.statSync(ve.entryPath).mtimeMs!==ve.entryMtime}catch{return!1}}l(Yg,"isCodeStale");var Gl=process.argv.slice(2),nT=parseInt(Gl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,rT=Gl.includes("--no-http"),oT=Gl.includes("--foreground");Kg({port:nT,noHttp:rT,foreground:oT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1682
+ `)||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}}}u(gT,"handleRequest");async function fT(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return ye.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 ye.status(r.cwd,{json:t.json===!0,md:s});case"stats":return ye.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ye.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return ye.seal(r.cwd,{json:t.json===!0});case"rollback":return ye.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return ye.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ye.task(e,r.cwd,{md:s});case"done":return ye.done(r.cwd,{md:s});case"next":return ye.next(r.cwd,{md:s});case"pause":return ye.pause(e||"",r.cwd,{md:s});case"resume":return ye.resume(e,r.cwd,{md:s});case"bug":return ye.bug(e||"",r.cwd,{md:s});case"idea":return ye.idea(e||"",r.cwd,{md:s});case"ship":return ye.ship(e,r.cwd,{md:s});case"dash":return ye.dash(e||"default",r.cwd,{md:s});case"workflow":return ye.workflowPrefs(e,r.cwd,{md:s});case"sessions":return ye.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ye.design(e||"",t,r.cwd);case"analysis-payload":return ye.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ye.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return ye.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return ye.analyze(t,r.cwd);case"cleanup":return ye.cleanup(t,r.cwd);case"cleanup-projects":return ye.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return U.execute(r.command,e,r.cwd)}}u(fT,"executeCommand");function hT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Fe.socket(),uptime:xe?Date.now()-xe.startedAt:0,commandsServed:xe?.commandsServed??0,lastActivity:xe?new Date(xe.lastActivity).toISOString():null,registeredCommands:U.list().length,stale:hf()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>hr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}u(hT,"handleDaemonCommand");function ff(){xe&&(xe.idleTimer&&clearTimeout(xe.idleTimer),xe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${xe.idleTimeoutMs/1e3/60} minutes, shutting down`),hr(0)},xe.idleTimeoutMs),xe.idleTimer.unref&&xe.idleTimer.unref())}u(ff,"resetIdleTimer");function hr(r){console.log("Daemon shutting down..."),xe?.idleTimer&&clearTimeout(xe.idleTimer),Yr&&(Yr.stop(),Yr=null),fr&&(fr.close(),fr=null),_.close();let e=Fe.socket(),t=Fe.pid();try{Ue.existsSync(e)&&Ue.unlinkSync(e)}catch{}try{Ue.existsSync(t)&&Ue.unlinkSync(t)}catch{}process.exit(r)}u(hr,"shutdown");function yT(r){try{return process.kill(r,0),!0}catch{return!1}}u(yT,"isProcessRunning");function wT(){let r=vt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ue.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ue.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(Ue.existsSync(n))return n;let s=process.argv[1];return s&&Ue.existsSync(s)?s:null}u(wT,"resolveEntryPath");var kT=1024*1024;function ST(){let r=Fe.log();try{if(Ue.statSync(r).size>kT){let t=`${r}.1`;try{Ue.unlinkSync(t)}catch{}Ue.renameSync(r,t)}}catch{}}u(ST,"rotateLog");function hf(){if(!xe?.entryPath||xe.entryMtime===null)return!1;try{return Ue.statSync(xe.entryPath).mtimeMs!==xe.entryMtime}catch{return!1}}u(hf,"isCodeStale");var cu=process.argv.slice(2),bT=parseInt(cu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,TT=cu.includes("--no-http"),vT=cu.includes("--foreground");gf({port:bT,noHttp:TT,foreground:vT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});