prjct-cli 1.56.10 → 1.56.12

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,7 +5,7 @@ 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 Yr=Object.defineProperty;var bf=Object.getOwnPropertyDescriptor;var vf=Object.getOwnPropertyNames;var Tf=Object.prototype.hasOwnProperty;var u=(r,e)=>Yr(r,"name",{value:e,configurable:!0}),It=(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 $t=(r,e)=>{for(var t in e)Yr(r,t,{get:e[t],enumerable:!0})},Ef=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vf(e))!Tf.call(r,n)&&n!==t&&Yr(r,n,{get:()=>e[n],enumerable:!(s=bf(e,n))||s.enumerable});return r};var it=r=>Ef(Yr({},"__esModule",{value:!0}),r);import{z as Ee}from"zod";function Pf(r){return r instanceof gn}function de(r){return Pf(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fn,Av,jv,Dv,Iv,$v,Mv,gn,Qr,Zr,wr,ns=P(()=>{"use strict";fn={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}},Av=fn.create("FileError",Ee.object({path:Ee.string(),operation:Ee.enum(["read","write","delete","create","copy"]),reason:Ee.string().optional()})),jv=fn.create("ValidationError",Ee.object({field:Ee.string(),expected:Ee.string(),received:Ee.string().optional(),message:Ee.string().optional()})),Dv=fn.create("PermissionError",Ee.object({action:Ee.string(),resource:Ee.string(),reason:Ee.string().optional()})),Iv=fn.create("TaskError",Ee.object({taskId:Ee.string().optional(),operation:Ee.enum(["create","update","complete","pause","resume","delete"]),reason:Ee.string()})),$v=fn.create("SessionError",Ee.object({sessionId:Ee.string().optional(),reason:Ee.string()})),Mv=fn.create("SyncError",Ee.object({projectId:Ee.string().optional(),operation:Ee.enum(["push","pull","auth","connect"]),reason:Ee.string()})),gn=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)}},Qr=class r extends gn{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")}},Zr=class r extends gn{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")}},wr=class r extends gn{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(Pf,"isPrjctError");u(de,"getErrorMessage")});function Cf(r){return r instanceof Error&&"code"in r}function j(r){return Cf(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(Cf,"isNodeError");u(j,"isNotFoundError");u(w,"getErrorMessage")});import{formatDistanceToNowStrict as Uv}from"date-fns";function ru(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 ou(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 ks(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 hn(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 Tt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var X=P(()=>{"use strict";u(ru,"formatDate");u(ou,"getYearMonthDay");u(b,"getTimestamp");u(ks,"getDaysAgo");u(ut,"formatDuration");u(rs,"calculateDuration");u(hn,"parseVarianceMinutes");u(Tt,"parseDurationMinutes")});var iu,au,cu,Xi=P(()=>{"use strict";iu=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"]),au=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],cu=/(?:import|from)\s+['"]([^'"]+)['"]/g});import du from"node:fs/promises";async function mu(r,e){let t;try{t=await du.readFile(r,"utf-8")}catch(o){if(j(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await lu(r,t),uu(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await lu(r,t),uu(r,xf(n.error)),null)}async function lu(r,e){let t=`${r}.backup`;try{await du.writeFile(t,e,"utf-8")}catch{}}function uu(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 xf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var pu=P(()=>{"use strict";W();u(mu,"safeRead");u(lu,"createBackup");u(uu,"logCorruption");u(xf,"formatZodError")});import Et from"node:fs/promises";import kr from"node:path";async function yn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Et.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let l=String(c.name);if(iu.has(l)||e.skipDotfiles&&l.startsWith(".")&&(!n||!n.has(l)))continue;let d=kr.join(i,l);c.isDirectory()?await o(d):c.isFile()&&t.push(kr.relative(r,d))}}return u(o,"walk"),await o(r),t}async function wn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function ve(r,e=null,t){if(t)return await mu(r,t)??e;try{let s=await Et.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=kr.dirname(r);await Et.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Et.writeFile(r,n,"utf-8")}async function Me(r,e=""){try{return await Et.readFile(r,"utf-8")}catch(t){if(j(t))return e;throw t}}async function Pt(r,e){let t=kr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.writeFile(r,e,"utf-8")}async function gu(r,e){let t=kr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.appendFile(r,`${e}
8
+ var Yr=Object.defineProperty;var bf=Object.getOwnPropertyDescriptor;var vf=Object.getOwnPropertyNames;var Tf=Object.prototype.hasOwnProperty;var u=(r,e)=>Yr(r,"name",{value:e,configurable:!0}),It=(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 $t=(r,e)=>{for(var t in e)Yr(r,t,{get:e[t],enumerable:!0})},Ef=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of vf(e))!Tf.call(r,n)&&n!==t&&Yr(r,n,{get:()=>e[n],enumerable:!(s=bf(e,n))||s.enumerable});return r};var it=r=>Ef(Yr({},"__esModule",{value:!0}),r);import{z as Ee}from"zod";function Pf(r){return r instanceof gn}function de(r){return Pf(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fn,Av,jv,Dv,Iv,$v,Mv,gn,Qr,Zr,wr,ns=P(()=>{"use strict";fn={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}},Av=fn.create("FileError",Ee.object({path:Ee.string(),operation:Ee.enum(["read","write","delete","create","copy"]),reason:Ee.string().optional()})),jv=fn.create("ValidationError",Ee.object({field:Ee.string(),expected:Ee.string(),received:Ee.string().optional(),message:Ee.string().optional()})),Dv=fn.create("PermissionError",Ee.object({action:Ee.string(),resource:Ee.string(),reason:Ee.string().optional()})),Iv=fn.create("TaskError",Ee.object({taskId:Ee.string().optional(),operation:Ee.enum(["create","update","complete","pause","resume","delete"]),reason:Ee.string()})),$v=fn.create("SessionError",Ee.object({sessionId:Ee.string().optional(),reason:Ee.string()})),Mv=fn.create("SyncError",Ee.object({projectId:Ee.string().optional(),operation:Ee.enum(["push","pull","auth","connect"]),reason:Ee.string()})),gn=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)}},Qr=class r extends gn{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")}},Zr=class r extends gn{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")}},wr=class r extends gn{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(Pf,"isPrjctError");u(de,"getErrorMessage")});function Cf(r){return r instanceof Error&&"code"in r}function j(r){return Cf(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(Cf,"isNodeError");u(j,"isNotFoundError");u(w,"getErrorMessage")});import{formatDistanceToNowStrict as Uv}from"date-fns";function ru(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 ou(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 ks(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 hn(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 Tt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var X=P(()=>{"use strict";u(ru,"formatDate");u(ou,"getYearMonthDay");u(b,"getTimestamp");u(ks,"getDaysAgo");u(ut,"formatDuration");u(rs,"calculateDuration");u(hn,"parseVarianceMinutes");u(Tt,"parseDurationMinutes")});var iu,au,cu,Xi=P(()=>{"use strict";iu=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",".worktrees"]),au=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],cu=/(?:import|from)\s+['"]([^'"]+)['"]/g});import du from"node:fs/promises";async function mu(r,e){let t;try{t=await du.readFile(r,"utf-8")}catch(o){if(j(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await lu(r,t),uu(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await lu(r,t),uu(r,xf(n.error)),null)}async function lu(r,e){let t=`${r}.backup`;try{await du.writeFile(t,e,"utf-8")}catch{}}function uu(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 xf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var pu=P(()=>{"use strict";W();u(mu,"safeRead");u(lu,"createBackup");u(uu,"logCorruption");u(xf,"formatZodError")});import Et from"node:fs/promises";import kr from"node:path";async function yn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Et.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let l=String(c.name);if(iu.has(l)||e.skipDotfiles&&l.startsWith(".")&&(!n||!n.has(l)))continue;let d=kr.join(i,l);c.isDirectory()?await o(d):c.isFile()&&t.push(kr.relative(r,d))}}return u(o,"walk"),await o(r),t}async function wn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function ve(r,e=null,t){if(t)return await mu(r,t)??e;try{let s=await Et.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=kr.dirname(r);await Et.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Et.writeFile(r,n,"utf-8")}async function Me(r,e=""){try{return await Et.readFile(r,"utf-8")}catch(t){if(j(t))return e;throw t}}async function Pt(r,e){let t=kr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.writeFile(r,e,"utf-8")}async function gu(r,e){let t=kr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.appendFile(r,`${e}
9
9
  `,"utf-8")}async function C(r){try{return await Et.access(r),!0}catch(e){if(j(e))return!1;throw e}}async function Ss(r){try{return(await Et.stat(r)).isDirectory()}catch(e){if(j(e))return!1;throw e}}async function Xe(r){await Et.mkdir(r,{recursive:!0})}async function bs(r,e={}){try{let s=await Et.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";Xi();pu();W();u(yn,"walkDir");u(wn,"batchProcess");u(ve,"readJson");u(le,"writeJson");u(Me,"readFile");u(Pt,"writeFile");u(gu,"appendLine");u(C,"fileExists");u(Ss,"dirExists");u(Xe,"ensureDir");u(bs,"listFiles")});var Zi={};$t(Zi,{PACKAGE_ROOT:()=>dt,VERSION:()=>Re,compareVersions:()=>fu,getPackageInfo:()=>Rf,getPackageRoot:()=>Yi,getVersion:()=>Fs,isCompatible:()=>Af,needsMigration:()=>jf,resetPackageRoot:()=>Qi});import Ki from"node:fs";import eo from"node:path";function Yi(){if(kn)return kn;let r=__dirname;for(let e=0;e<5;e++){let t=eo.join(r,"package.json");if(Ki.existsSync(t))try{if(JSON.parse(Ki.readFileSync(t,"utf-8")).name==="prjct-cli")return kn=r,r}catch{}r=eo.dirname(r)}return kn=eo.join(__dirname,"..","..",".."),kn}function Fs(){if(Sr)return Sr;try{let r=eo.join(Yi(),"package.json"),e=JSON.parse(Ki.readFileSync(r,"utf-8"));return Sr=e.version,to=e,Sr}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Rf(){return to||Fs(),to}function fu(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 Af(r){let e=Fs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function jf(r,e=null){let t=e||Fs();return fu(r,t)<0}function Qi(r){kn=r,Sr=null,to=null}var Sr,to,kn,Re,dt,_t=P(()=>{"use strict";W();Sr=null,to=null,kn=null;u(Yi,"getPackageRoot");u(Fs,"getVersion");u(Rf,"getPackageInfo");u(fu,"compareVersions");u(Af,"isCompatible");u(jf,"needsMigration");u(Qi,"resetPackageRoot");Re=Fs(),dt=Yi()});var yu={};$t(yu,{execAsync:()=>O,execFileAsync:()=>Us});import{exec as Df,execFile as If}from"node:child_process";import{promisify as hu}from"node:util";var O,Us,We=P(()=>{"use strict";O=hu(Df),Us=hu(If)});async function so(r){try{let{stdout:e}=await O(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function $f(){let r=await so("gh api user --jq .login");return r.success&&r.output||(r=await so("git config --global github.user"),r.success&&r.output)?r.output:null}async function Mf(){let r=await so("git config user.name");return r.success&&r.output?r.output:null}async function _f(){let r=await so("git config user.email");return r.success&&r.output?r.output:null}async function Sn(){let[r,e,t]=await Promise.all([$f(),Mf(),_f()]);return{github:r,email:t,name:e||r||"Unknown"}}var no=P(()=>{"use strict";We();u(so,"execCommand");u($f,"detectGitHubUsername");u(Mf,"detectGitName");u(_f,"detectGitEmail");u(Sn,"detect")});var br=P(()=>{"use strict"});import{z as Yt}from"zod";function wu(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 lT,uT,dT,bn,mT,ro=P(()=>{"use strict";lT=Yt.enum(["opus","sonnet","haiku"]),uT=Yt.enum(["2.5-pro","2.5-flash","2.0-flash"]),dT=Yt.string().min(1),bn=Yt.object({provider:Yt.string(),model:Yt.string(),cliVersion:Yt.string().optional(),recordedAt:Yt.string()}),mT=Yt.object({preferredModel:Yt.string().optional(),lastAnalysisModel:bn.optional()});u(wu,"compareSemver")});function vs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var vn,Hs=P(()=>{"use strict";u(vs,"isExpired");vn=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 Of from"node:fs/promises";import Nf from"node:os";import ku from"node:path";async function bu(){try{let r=await Of.readFile(Su,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||vs(e.timestamp,Ff)?null:e.detection}catch{return null}}async function vu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(Su,e)}var Lf,Su,Ff,Tu=P(()=>{"use strict";Hs();B();Lf=ku.join(Nf.homedir(),".prjct-cli","cache"),Su=ku.join(Lf,"providers.json"),Ff=10*60*1e3;u(bu,"readProviderCache");u(vu,"writeProviderCache")});var Ot={};$t(Ot,{AntigravityProvider:()=>sa,ClaudeProvider:()=>oo,CodexProvider:()=>na,CursorProvider:()=>Pu,GeminiProvider:()=>ta,Providers:()=>mt,WindsurfProvider:()=>Cu,detectAllProviders:()=>vr,detectAntigravity:()=>co,detectCodex:()=>Ws,detectCursorProject:()=>Au,detectProvider:()=>io,detectWindsurfProject:()=>ju,getActiveProvider:()=>qf,getCapabilities:()=>Hf,getCommandsDir:()=>Kf,getGlobalContextPath:()=>Jf,getGlobalSettingsPath:()=>zf,getProjectCommandsPath:()=>Yf,getProviderBranding:()=>ao,getSkillsPath:()=>Xf,hasProviderConfig:()=>Gf,needsCursorRouterRegeneration:()=>Bf,needsWindsurfRouterRegeneration:()=>Vf,selectProvider:()=>ra,validateCliVersion:()=>Ru});import Ts from"node:os";import Ve from"node:path";function Hf(r,e){return{...Uf[r],...e}}async function xu(r){try{let{stdout:e}=await O(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Wf(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 io(r){let e=mt[r];if(!e.cliCommand)return{installed:!1};let t=await xu(e.cliCommand);if(!t)return{installed:!1};let s=await Wf(e.cliCommand),n=Ru(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Ru(r,e){let t=mt[r];return!t.minCliVersion||!e?null:wu(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 vr(r=!1){if(!r){let i=await bu();if(i)return i}let[e,t,s]=await Promise.all([io("claude"),io("gemini"),Ws()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await vu(o).catch(()=>{}),o}async function qf(r){if(r&&mt[r])return mt[r];let e=await vr();return e.claude.installed&&!e.gemini.installed?oo:e.gemini.installed&&!e.claude.installed?ta:oo}async function Gf(r){let e=mt[r];return e.configDir?C(e.configDir):!1}function ao(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 Au(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 Bf(r){let e=await Au(r);return e.detected&&!e.routerInstalled}async function ju(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 Vf(r){let e=await ju(r);return e.detected&&!e.routerInstalled}async function co(){let r=sa.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 Ws(){let r=na.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await xu("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 Jf(r){let e=mt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function zf(r){let e=mt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Xf(r){return mt[r].skillsDir}function Kf(r){return mt[r].commandsDir}function Yf(r,e){let t=mt[r];return Ve.join(e,t.commandsDir)}async function ra(){let r=await vr(),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 Uf,oo,ta,sa,Pu,Cu,na,mt,pt=P(()=>{"use strict";br();ro();We();B();Tu();Uf={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(Hf,"getCapabilities");oo={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"},ta={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"},sa={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"},Pu={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"},Cu={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"},na={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"},mt={claude:oo,gemini:ta,cursor:Pu,antigravity:sa,windsurf:Cu,codex:na};u(xu,"whichCommand");u(Wf,"getCliVersion");u(io,"detectProvider");u(Ru,"validateCliVersion");u(vr,"detectAllProviders");u(qf,"getActiveProvider");u(Gf,"hasProviderConfig");u(ao,"getProviderBranding");u(Au,"detectCursorProject");u(Bf,"needsCursorRouterRegeneration");u(ju,"detectWindsurfProject");u(Vf,"needsWindsurfRouterRegeneration");u(co,"detectAntigravity");u(Ws,"detectCodex");u(Jf,"getGlobalContextPath");u(zf,"getGlobalSettingsPath");u(Xf,"getSkillsPath");u(Kf,"getCommandsDir");u(Yf,"getProjectCommandsPath");u(ra,"selectProvider")});import Qf from"node:crypto";import Qt from"node:fs/promises";import oa from"node:os";import V from"node:path";import{globSync as Zf}from"glob";var ia,eh,R,Se=P(()=>{"use strict";X();B();ia=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(oa.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 Qf.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 Ss(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await Xe(this.globalBaseDir),await Xe(this.globalProjectsDir),await Xe(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 Xe(V.join(t,n));return await Xe(V.join(t,"planning","tasks")),await Xe(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=ou(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 Xe(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 m=V.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path: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 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 Ss(t)}getDisplayPath(e){let t=oa.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(pt(),it(Ot)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(pt(),it(Ot)).getActiveProvider();return(pt(),it(Ot)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(oa.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
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=Zf(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"),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}},eh=new ia,R=eh});var lo={};$t(lo,{default:()=>Ut,worktreeService:()=>Iu});import aa from"node:fs/promises";import Zt from"node:path";var Du,ca,Iu,Ut,Tr=P(()=>{"use strict";We();B();Du=".worktrees",ca=class{static{u(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=Zt.join(n,Du,t),i=s.branch||`feat/${t}`;await aa.mkdir(Zt.join(n,Du),{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
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 aa.copyFile(s,Zt.join(e,".env"));let n=Zt.join(t,".prjct"),o=Zt.join(e,".prjct");await C(n)&&!await C(o)&&await aa.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(`
@@ -532,7 +532,7 @@ Data:
532
532
 
533
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(`
534
534
  `)}function Yu(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 xr(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 Pa=P(()=>{"use strict";u(Ku,"generateAnalysisDiff");u(Ea,"formatAnalysisDiffMd");u(Yu,"formatAnalysisDiffText");u(xr,"diffStringArray")});var Ca,xa,Qu,Rr=P(()=>{"use strict";Ca=[1,2,3,5,8,13,21],xa={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}},Qu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Ah from"node:fs/promises";import jh from"node:path";function Cn(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 Dh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...Cn(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(...Cn(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(...Cn(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(...Cn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...Cn(g))}}let c=/\/\/\s*(.+)/g,l;for(;(l=c.exec(r))!==null;){let p=l[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&&!td.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function Ih(r){return r.split(/\s+/).flatMap(e=>Cn(e)).filter(e=>e.length>1&&!td.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function $h(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await Ah.readFile(jh.join(r,a),"utf-8"),l=Dh(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,m]of l)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 Mh(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function _h(r,e){let t=Ih(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=Mh(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),m=c+1.2*(1-.75+.75*(l.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 Oh(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]))};M.setDoc(r,sd,t)}function Ao(r){let e=M.getDoc(r,sd);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 nd(r,e){let t=await $h(r);return Oh(e,t),t}function rd(r,e,t=15){let s=Ao(r);return s?_h(e,s).slice(0,t):[]}var td,sd,Ra=P(()=>{"use strict";Rr();Y();B();td=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(Cn,"splitIdentifier");u(Dh,"tokenizeFile");u(Ih,"tokenizeQuery");u($h,"buildIndex");u(Mh,"idf");u(_h,"score");sd="bm25-index";u(Oh,"saveIndex");u(Ao,"loadIndex");u(nd,"indexProject");u(rd,"queryFiles")});import Aa from"node:fs/promises";import Es from"node:path";import{z as Q}from"zod";async function Hh(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=Es.join(e,"package.json"),n=await Aa.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(p=>p.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 Wh(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 Vh(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=Uh[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 qh(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=Es.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 Gh(r,e){let t=Date.now();try{let s=await Jh(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 Bh(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=Es.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 od(r,e){let t=Date.now(),s=await Promise.all([Hh(r,e),Wh(r,e),qh(r,e),Gh(r,e),Bh(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 Vh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Aa.readdir(n,{withFileTypes:!0});for(let i of o){let a=Es.join(n,i.name),c=Es.relative(r,a);if(!t.some(l=>l.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let l=Es.extname(i.name);l&&e.add(l)}}}}catch{}}return u(s,"scanDir"),await s(r),Array.from(e)}async function Jh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Aa.readdir(n,{withFileTypes:!0});for(let i of o){let a=Es.join(n,i.name),c=Es.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 Nh,Lh,Fh,ja,VP,Uh,id=P(()=>{"use strict";W();B();ro();Nh=Q.enum(["draft","verified","sealed"]),Lh=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()}),Fh=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()}),ja=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(Lh),antiPatterns:Q.array(Fh),analyzedAt:Q.string(),modelMetadata:bn.optional(),status:Nh.default("draft"),commitHash:Q.string().optional(),signature:Q.string().optional(),sealedAt:Q.string().optional(),verifiedAt:Q.string().optional()}),VP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Uh={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(Hh,"verifyFrameworks");u(Wh,"verifyLanguages");u(qh,"verifyPatternLocations");u(Gh,"verifyFileCount");u(Bh,"verifyAntiPatternFiles");u(od,"semanticVerify");u(Vh,"getProjectExtensions");u(Jh,"countProjectFiles")});var Da,Ps,Ia=P(()=>{"use strict";Se();X();B();Da=class{static{u(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await ve(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await ve(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 ve(t,null)}},Ps=new Da});var Ye,us=P(()=>{"use strict";Ia();Hs();X();Y();Ye=class{static{u(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new vn({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=v.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){v.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 Ps.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 v.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var $a,Qe,xn=P(()=>{"use strict";id();Pa();X();Vs();us();$a=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"};ja.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 ja.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Ku(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await od(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 Cr(JSON.stringify(t))}},Qe=new $a});var Ma,jo,Wt,Rn=P(()=>{"use strict";X();Y();Ma=class{static{u(this,"LLMAnalysisStorage")}save(e,t){let s=v.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=v.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?v.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return v.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 Ma,Wt=jo});import{z as T}from"zod";var zh,Do,Xh,Kh,Yh,_a,cd,ld,ud,Oa,ad,Qh,Zh,ey,dd,md,pd,ty,sy,wC,Na=P(()=>{"use strict";ro();zh=T.enum(["low","medium","high","critical"]),Do=T.enum(["feature","bug","improvement","chore"]),Xh=T.enum(["active","backlog","previously_active"]),Kh=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Yh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),_a=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()}),cd=T.object({output:T.string().min(1,"Subtask output is required"),summary:_a}),ld=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Kh,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:_a.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),ud=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Oa=T.object({id:T.string(),description:T.string(),type:Do.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(ld).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:ud.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:bn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),ad=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:Do.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(ld).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:ud.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:bn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Qh=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()}),Zh=T.object({taskId:T.string(),title:T.string(),classification:Do,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(_a),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:Qh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),ey=Oa.extend({workspaceId:T.string(),worktreePath:T.string().optional(),agentSessionId:T.string().optional(),jiraId:T.string().optional(),jiraUuid:T.string().optional(),dispatchedFrom:T.string().optional()}),dd=T.object({currentTask:Oa.nullable(),previousTask:ad.nullable().optional(),pausedTasks:T.array(ad).optional(),taskHistory:T.array(Zh).optional(),activeTasks:T.array(ey).optional(),lastUpdated:T.string()}),md=T.object({id:T.string(),description:T.string(),body:T.string().optional(),priority:zh,type:Do,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Xh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),pd=T.object({tasks:T.array(md),lastUpdated:T.string()}),ty=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),sy=T.object({type:Yh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),wC=T.object({projectId:T.string(),currentTask:Oa.nullable(),queue:T.array(md),stats:ty,recentActivity:T.array(sy),lastSync:T.string()})});var Ar,La,Xs,Fa=P(()=>{"use strict";Ar={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"}},La=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=Ar[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 Ar[e]}getPrompt(e){return Ar[e].prompt}getValidCommands(e){return Ar[e].transitions}formatNextSteps(e){return Ar[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}`}})}},Xs=new La});var ds,Ua,ft,Cs=P(()=>{"use strict";Ct();X();Y();ds={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ua=class{static{u(this,"ArchiveStorage")}archive(e,t){let s=z(),n=b();return v.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 v.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?v.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):v.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=v.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=v.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(v.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);v.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return v.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Ua});var Ha,_,ht=P(()=>{"use strict";Ct();Na();X();Fa();Cs();us();Ha=class extends Ye{static{u(this,"StateStorage")}constructor(){super("state.json",dd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Xs.getCurrentState(e),n=Xs.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,...m}=i,p={...m,startedAt:b(),sessionId:i.sessionId??z()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:b()})),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[];ft.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(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)],l=[...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:l,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}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(m=>m.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,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 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=cd.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:
535
+ `)}function xr(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 Pa=P(()=>{"use strict";u(Ku,"generateAnalysisDiff");u(Ea,"formatAnalysisDiffMd");u(Yu,"formatAnalysisDiffText");u(xr,"diffStringArray")});var Ca,xa,Qu,Rr=P(()=>{"use strict";Ca=[1,2,3,5,8,13,21],xa={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}},Qu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Ah from"node:fs/promises";import jh from"node:path";function Cn(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 Dh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...Cn(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(...Cn(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(...Cn(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(...Cn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...Cn(g))}}let c=/\/\/\s*(.+)/g,l;for(;(l=c.exec(r))!==null;){let p=l[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&&!td.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function Ih(r){return r.split(/\s+/).flatMap(e=>Cn(e)).filter(e=>e.length>1&&!td.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function $h(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await Ah.readFile(jh.join(r,a),"utf-8"),l=Dh(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,m]of l)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 Mh(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function _h(r,e){let t=Ih(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=Mh(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),m=c+1.2*(1-.75+.75*(l.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 Oh(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]))};M.setDoc(r,sd,t)}function Ao(r){let e=M.getDoc(r,sd);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 nd(r,e){let t=await $h(r);return Oh(e,t),t}function rd(r,e,t=15){let s=Ao(r);return s?_h(e,s).slice(0,t):[]}var td,sd,Ra=P(()=>{"use strict";Rr();Y();B();td=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(Cn,"splitIdentifier");u(Dh,"tokenizeFile");u(Ih,"tokenizeQuery");u($h,"buildIndex");u(Mh,"idf");u(_h,"score");sd="bm25-index";u(Oh,"saveIndex");u(Ao,"loadIndex");u(nd,"indexProject");u(rd,"queryFiles")});import Aa from"node:fs/promises";import Es from"node:path";import{z as Q}from"zod";async function Hh(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=Es.join(e,"package.json"),n=await Aa.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(p=>p.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 Wh(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 Vh(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=Uh[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 qh(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=Es.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 Gh(r,e){let t=Date.now();try{let s=await Jh(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 Bh(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=Es.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 od(r,e){let t=Date.now(),s=await Promise.all([Hh(r,e),Wh(r,e),qh(r,e),Gh(r,e),Bh(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 Vh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Aa.readdir(n,{withFileTypes:!0});for(let i of o){let a=Es.join(n,i.name),c=Es.relative(r,a);if(!t.some(l=>l.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let l=Es.extname(i.name);l&&e.add(l)}}}}catch{}}return u(s,"scanDir"),await s(r),Array.from(e)}async function Jh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Aa.readdir(n,{withFileTypes:!0});for(let i of o){let a=Es.join(n,i.name),c=Es.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 Nh,Lh,Fh,ja,VP,Uh,id=P(()=>{"use strict";W();B();ro();Nh=Q.enum(["draft","verified","sealed"]),Lh=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()}),Fh=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()}),ja=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(Lh),antiPatterns:Q.array(Fh),analyzedAt:Q.string(),modelMetadata:bn.optional(),status:Nh.default("draft"),commitHash:Q.string().optional(),signature:Q.string().optional(),sealedAt:Q.string().optional(),verifiedAt:Q.string().optional()}),VP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Uh={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(Hh,"verifyFrameworks");u(Wh,"verifyLanguages");u(qh,"verifyPatternLocations");u(Gh,"verifyFileCount");u(Bh,"verifyAntiPatternFiles");u(od,"semanticVerify");u(Vh,"getProjectExtensions");u(Jh,"countProjectFiles")});var Da,Ps,Ia=P(()=>{"use strict";Se();X();B();Da=class{static{u(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await ve(t,[])??[],n=Array.isArray(s)?s:[];n.push(e),await le(t,n)}async getPending(e){let t=R.getSyncPendingPath(e),s=await ve(t,[])??[];return Array.isArray(s)?s:[]}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 ve(t,null)}},Ps=new Da});var Ye,us=P(()=>{"use strict";Ia();Hs();X();Y();Ye=class{static{u(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new vn({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=v.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){v.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 Ps.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 v.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var $a,Qe,xn=P(()=>{"use strict";id();Pa();X();Vs();us();$a=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"};ja.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 ja.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Ku(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await od(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 Cr(JSON.stringify(t))}},Qe=new $a});var Ma,jo,Wt,Rn=P(()=>{"use strict";X();Y();Ma=class{static{u(this,"LLMAnalysisStorage")}save(e,t){let s=v.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=v.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?v.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return v.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 Ma,Wt=jo});import{z as T}from"zod";var zh,Do,Xh,Kh,Yh,_a,cd,ld,ud,Oa,ad,Qh,Zh,ey,dd,md,pd,ty,sy,wC,Na=P(()=>{"use strict";ro();zh=T.enum(["low","medium","high","critical"]),Do=T.enum(["feature","bug","improvement","chore"]),Xh=T.enum(["active","backlog","previously_active"]),Kh=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Yh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),_a=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()}),cd=T.object({output:T.string().min(1,"Subtask output is required"),summary:_a}),ld=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Kh,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:_a.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),ud=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Oa=T.object({id:T.string(),description:T.string(),type:Do.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(ld).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:ud.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:bn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),ad=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:Do.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(ld).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:ud.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:bn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Qh=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()}),Zh=T.object({taskId:T.string(),title:T.string(),classification:Do,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(_a),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:Qh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),ey=Oa.extend({workspaceId:T.string(),worktreePath:T.string().optional(),agentSessionId:T.string().optional(),jiraId:T.string().optional(),jiraUuid:T.string().optional(),dispatchedFrom:T.string().optional()}),dd=T.object({currentTask:Oa.nullable(),previousTask:ad.nullable().optional(),pausedTasks:T.array(ad).optional(),taskHistory:T.array(Zh).optional(),activeTasks:T.array(ey).optional(),lastUpdated:T.string()}),md=T.object({id:T.string(),description:T.string(),body:T.string().optional(),priority:zh,type:Do,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Xh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),pd=T.object({tasks:T.array(md),lastUpdated:T.string()}),ty=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),sy=T.object({type:Yh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),wC=T.object({projectId:T.string(),currentTask:Oa.nullable(),queue:T.array(md),stats:ty,recentActivity:T.array(sy),lastSync:T.string()})});var Ar,La,Xs,Fa=P(()=>{"use strict";Ar={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"}},La=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=Ar[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 Ar[e]}getPrompt(e){return Ar[e].prompt}getValidCommands(e){return Ar[e].transitions}formatNextSteps(e){return Ar[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}`}})}},Xs=new La});var ds,Ua,ft,Cs=P(()=>{"use strict";Ct();X();Y();ds={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ua=class{static{u(this,"ArchiveStorage")}archive(e,t){let s=z(),n=b();return v.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 v.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?v.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):v.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=v.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=v.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(v.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);v.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return v.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Ua});var Ha,_,ht=P(()=>{"use strict";Ct();Na();X();Fa();Cs();us();Ha=class extends Ye{static{u(this,"StateStorage")}constructor(){super("state.json",dd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Xs.getCurrentState(e),n=Xs.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,...m}=i,p={...m,startedAt:b(),sessionId:i.sessionId??z()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return Array.isArray(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[];ft.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(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)],l=[...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:l,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}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(m=>m.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,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 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=cd.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:
536
536
  ${h.join(`
537
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,m=l.length,p=Math.round(d/m*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<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},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:m,percentage:p}}),g<m?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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(l/c*100);return await this.update(e,m=>({...m,currentTask:{...m.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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(l/c*100);return await this.update(e,m=>({...m,currentTask:{...m.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}},_=new Ha});import gd from"node:fs/promises";import fd from"node:path";async function qa(r,e,t,s){let[n,o,i,a]=await Promise.all([oy(r,e,s),iy(r),ay(r),cy(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,ny).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 oy(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=rd(r,n,Wa*2);for(let a of o){if(s.length>=Wa)break;try{let c=fd.join(e,a.path),l=await gd.readFile(c,"utf-8");l.length>Io*3?s.push({path:a.path,content:`${l.slice(0,Io)}
538
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>=Wa)break;if(!s.some(c=>c.path===a))try{let c=fd.join(e,a),l=await gd.readFile(c,"utf-8");s.push({path:a,content:l.slice(0,Io),reason:"entry point"})}catch{}}return s}async function iy(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 ay(r){try{return(await _.getTaskHistory(r)).slice(0,ry).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function cy(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,Wa,ny,ry,hd=P(()=>{"use strict";Ra();xn();Rn();ht();as();Io=800,Wa=6,ny=8,ry=5;u(qa,"buildAnalysisPayload");u(oy,"selectCodeSamples");u(iy,"getExistingPatterns");u(ay,"getTaskHistory");u(cy,"getPreviousAnalysisSummary")});var $o=P(()=>{"use strict"});import ms from"chalk";function yd(r){return Math.ceil(r.length/4)}function wd(r){let e=r.split(`
@@ -648,7 +648,7 @@ echo "prjct"
648
648
  INSERT OR IGNORE INTO sessions
649
649
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
650
650
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
651
- `).run($(h.id),$(h.projectId)??r,$(h.task)??"",$(h.status)??"completed",$(h.startedAt)??new Date().toISOString(),$(h.pausedAt),$(h.completedAt),Rs(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 m=Z.join(a,"archive");try{let h=await te.readdir(m);for(let y of h){let E=Z.join(m,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(m).catch(()=>[])).length===0&&await te.rmdir(m).catch(()=>{})}catch{}try{(await te.readdir(a)).length===0&&await te.rmdir(a).catch(()=>{})}catch{}let p=Z.join(e,"index"),g=[...mc.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=Z.join(p,h),y=await Gt(S);if(y===null)continue;let E=mc.find(A=>A.filename===h);E&&(v.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(y),new Date().toISOString()),gm(r,E.key,y));try{await te.unlink(S)}catch{}s++}return s}var pc,mc,gc=P(()=>{"use strict";Se();W();Y();pc=[{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"}],mc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];u(Bo,"migrateJsonToSqlite");u(Qy,"createBackup");u(dc,"copyFiles");u(pm,"populateNormalized");u(Zy,"populateTasksFromState");u(ew,"populateQueueTasks");u(tw,"populateIdeas");u(sw,"populateShippedFeatures");u(nw,"populateMetricsDaily");u(rw,"populateAnalysis");u(gm,"populateIndexTables");u(ow,"populateCategoriesIndex");u(iw,"migrateChecksums");u(aw,"migrateFileScores");u(cw,"migrateEventsJsonl");u(lw,"migrateLearningsJsonl");u(uw,"migrateSessionFiles");u(dw,"cleanupJsonFiles");u($,"toStr");u(Rs,"toNum");u(Gt,"readJsonSafe");u(Vo,"sweepLegacyJson")});function Jo(r){return[...r].sort((e,t)=>{let s=hm[e.section]-hm[t.section];return s!==0?s:fm[e.priority]-fm[t.priority]})}function fc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var fm,hm,zo=P(()=>{"use strict";fm={critical:0,high:1,medium:2,low:3},hm={active:0,previously_active:1,backlog:2};u(Jo,"sortBySectionAndPriority");u(fc,"uniqueBy")});var hc,re,Lt=P(()=>{"use strict";Ct();Na();zo();X();Cs();us();hc=class extends Ye{static{u(this,"QueueStorage")}constructor(){super("queue.json",pd)}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: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=ks(ds.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;ft.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 hc});import{z as se}from"zod";var mw,ym,pw,gw,fw,hw,yw,ww,kw,wm,km=P(()=>{"use strict";mw=se.enum(["feature","fix","improvement","refactor"]),ym=se.enum(["pass","warning","fail","skipped"]),pw=se.enum(["added","changed","fixed","removed"]),gw=se.object({hours:se.number(),minutes:se.number(),totalMinutes:se.number()}),fw=se.object({filesChanged:se.number().nullable().optional(),linesAdded:se.number().nullable().optional(),linesRemoved:se.number().nullable().optional(),commits:se.number().nullable().optional()}),hw=se.object({description:se.string(),type:pw.optional()}),yw=se.object({lintStatus:ym.nullable().optional(),lintDetails:se.string().optional(),testStatus:ym.nullable().optional(),testDetails:se.string().optional()}),ww=se.object({hash:se.string().optional(),message:se.string().optional(),branch:se.string().optional()}),kw=se.object({id:se.string(),name:se.string(),version:se.string().nullable().optional(),type:mw,agent:se.string().optional(),description:se.string().optional(),changes:se.array(hw).optional(),codeSnippets:se.array(se.string()).optional(),commit:ww.optional(),codeMetrics:fw.optional(),qualityMetrics:yw.optional(),quantitativeImpact:se.string().optional(),duration:gw.optional(),tasksCompleted:se.number().nullable().optional(),shippedAt:se.string(),featureId:se.string().optional()}),wm=se.object({shipped:se.array(kw),lastUpdated:se.string()})});var yc,Je,As=P(()=>{"use strict";Ct();km();X();Cs();us();yc=class extends Ye{static{u(this,"ShippedStorage")}constructor(){super("shipped.json",wm)}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()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=ks(ds.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;ft.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 yc});import{z as ge}from"zod";var Sw,bw,Sm,pA,gA,fA,js,bm,Dr=P(()=>{"use strict";Sw=ge.enum(["improving","stable","declining"]),bw=ge.object({sprintNumber:ge.number(),startDate:ge.string(),endDate:ge.string(),pointsCompleted:ge.number(),tasksCompleted:ge.number(),avgVariance:ge.number(),estimationAccuracy:ge.number()}),Sm=ge.object({category:ge.string(),avgVariance:ge.number(),taskCount:ge.number()}),pA=ge.object({totalPoints:ge.number(),sprints:ge.number(),estimatedDate:ge.string()}),gA=ge.object({sprints:ge.array(bw),averageVelocity:ge.number(),velocityTrend:Sw,estimationAccuracy:ge.number(),overEstimated:ge.array(Sm),underEstimated:ge.array(Sm),lastUpdated:ge.string()}),fA=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)}),js={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},bm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var wc,$n,Xo=P(()=>{"use strict";Dr();us();wc=class extends Ye{static{u(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:bm,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}},$n=new wc});var Ir,kc,Sc,vm=P(()=>{"use strict";Pr();X();Ir=3,kc=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(`
651
+ `).run($(h.id),$(h.projectId)??r,$(h.task)??"",$(h.status)??"completed",$(h.startedAt)??new Date().toISOString(),$(h.pausedAt),$(h.completedAt),Rs(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 m=Z.join(a,"archive");try{let h=await te.readdir(m);for(let y of h){let E=Z.join(m,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(m).catch(()=>[])).length===0&&await te.rmdir(m).catch(()=>{})}catch{}try{(await te.readdir(a)).length===0&&await te.rmdir(a).catch(()=>{})}catch{}let p=Z.join(e,"index"),g=[...mc.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=Z.join(p,h),y=await Gt(S);if(y===null)continue;let E=mc.find(A=>A.filename===h);E&&(v.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(y),new Date().toISOString()),gm(r,E.key,y));try{await te.unlink(S)}catch{}s++}return s}var pc,mc,gc=P(()=>{"use strict";Se();W();Y();pc=[{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"}],mc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];u(Bo,"migrateJsonToSqlite");u(Qy,"createBackup");u(dc,"copyFiles");u(pm,"populateNormalized");u(Zy,"populateTasksFromState");u(ew,"populateQueueTasks");u(tw,"populateIdeas");u(sw,"populateShippedFeatures");u(nw,"populateMetricsDaily");u(rw,"populateAnalysis");u(gm,"populateIndexTables");u(ow,"populateCategoriesIndex");u(iw,"migrateChecksums");u(aw,"migrateFileScores");u(cw,"migrateEventsJsonl");u(lw,"migrateLearningsJsonl");u(uw,"migrateSessionFiles");u(dw,"cleanupJsonFiles");u($,"toStr");u(Rs,"toNum");u(Gt,"readJsonSafe");u(Vo,"sweepLegacyJson")});function Jo(r){return[...r].sort((e,t)=>{let s=hm[e.section]-hm[t.section];return s!==0?s:fm[e.priority]-fm[t.priority]})}function fc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var fm,hm,zo=P(()=>{"use strict";fm={critical:0,high:1,medium:2,low:3},hm={active:0,previously_active:1,backlog:2};u(Jo,"sortBySectionAndPriority");u(fc,"uniqueBy")});var hc,re,Lt=P(()=>{"use strict";Ct();Na();zo();X();Cs();us();hc=class extends Ye{static{u(this,"QueueStorage")}constructor(){super("queue.json",pd)}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: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=ks(ds.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;ft.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 hc});import{z as se}from"zod";var mw,ym,pw,gw,fw,hw,yw,ww,kw,wm,km=P(()=>{"use strict";mw=se.enum(["feature","fix","improvement","refactor"]),ym=se.enum(["pass","warning","fail","skipped"]),pw=se.enum(["added","changed","fixed","removed"]),gw=se.object({hours:se.number(),minutes:se.number(),totalMinutes:se.number()}),fw=se.object({filesChanged:se.number().nullable().optional(),linesAdded:se.number().nullable().optional(),linesRemoved:se.number().nullable().optional(),commits:se.number().nullable().optional()}),hw=se.object({description:se.string(),type:pw.optional()}),yw=se.object({lintStatus:ym.nullable().optional(),lintDetails:se.string().optional(),testStatus:ym.nullable().optional(),testDetails:se.string().optional()}),ww=se.object({hash:se.string().optional(),message:se.string().optional(),branch:se.string().optional()}),kw=se.object({id:se.string(),name:se.string(),version:se.string().nullable().optional(),type:mw,agent:se.string().optional(),description:se.string().optional(),changes:se.array(hw).optional(),codeSnippets:se.array(se.string()).optional(),commit:ww.optional(),codeMetrics:fw.optional(),qualityMetrics:yw.optional(),quantitativeImpact:se.string().optional(),duration:gw.optional(),tasksCompleted:se.number().nullable().optional(),shippedAt:se.string(),featureId:se.string().optional()}),wm=se.object({shipped:se.array(kw),lastUpdated:se.string()})});var yc,Je,As=P(()=>{"use strict";Ct();km();X();Cs();us();yc=class extends Ye{static{u(this,"ShippedStorage")}constructor(){super("shipped.json",wm)}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,...Array.isArray(n.shipped)?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()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=ks(ds.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;ft.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 yc});import{z as ge}from"zod";var Sw,bw,Sm,pA,gA,fA,js,bm,Dr=P(()=>{"use strict";Sw=ge.enum(["improving","stable","declining"]),bw=ge.object({sprintNumber:ge.number(),startDate:ge.string(),endDate:ge.string(),pointsCompleted:ge.number(),tasksCompleted:ge.number(),avgVariance:ge.number(),estimationAccuracy:ge.number()}),Sm=ge.object({category:ge.string(),avgVariance:ge.number(),taskCount:ge.number()}),pA=ge.object({totalPoints:ge.number(),sprints:ge.number(),estimatedDate:ge.string()}),gA=ge.object({sprints:ge.array(bw),averageVelocity:ge.number(),velocityTrend:Sw,estimationAccuracy:ge.number(),overEstimated:ge.array(Sm),underEstimated:ge.array(Sm),lastUpdated:ge.string()}),fA=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)}),js={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},bm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var wc,$n,Xo=P(()=>{"use strict";Dr();us();wc=class extends Ye{static{u(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:bm,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}},$n=new wc});var Ir,kc,Sc,vm=P(()=>{"use strict";Pr();X();Ir=3,kc=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
652
  `)}},Sc=new kc});import{z as x}from"zod";var Tm,vw,Tw,Em,Ew,Pw,Cw,xw,Rw,Aw,jw,Pm,Dw,Iw,xA,Cm,xm,Rm,Am,$w,Ko,jm=P(()=>{"use strict";Tm=x.number().min(1).max(5),vw=x.enum(["exceeded","met","partial","failed"]),Tw=x.enum(["definitely","probably","maybe","no"]),Em=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ew=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:Em.optional(),explanation:x.string().optional()})}),Pw=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),Cw=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),xw=x.object({metrics:x.array(Pw),acceptanceCriteria:x.array(Cw),overallSuccess:vw,successScore:x.number().min(0).max(100)}),Rw=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),Aw=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(Rw)}),jw=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:Tw,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),Pm=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:Tm,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:Ew,success:xw.optional(),learnings:Aw,roi:jw,rating:Tm,taskOutcomes:x.array(Pm).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),Iw=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:Em,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),xA=x.object({outcomes:x.array(Dw),taskOutcomes:x.array(Pm).optional(),aggregates:Iw.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),Cm={outcomes:[],taskOutcomes:[],lastUpdated:""},xm=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"),Rm=u((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Am=u(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),$w=u(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Ko=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=>$w(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),{}),l=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:l}},"aggregateOutcomes")});var bc,Dm,Im=P(()=>{"use strict";jm();us();X();bc=class extends Ye{static{u(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Cm,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Ko([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?Ko(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Ko(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Tt(e.duration)||60,s=t/60,n=t/60,o=xm(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Rm(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:Am(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}}},Dm=new bc});import vc from"node:fs/promises";import Yo from"node:path";var Tc,Ec,$m,Mm=P(()=>{"use strict";W();B();Tc=".prjct/.prjct-state.md",Ec=class{static{u(this,"LocalStateGenerator")}async generate(e,t){let s=Yo.join(e,Tc);await vc.mkdir(Yo.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await vc.writeFile(s,n,"utf-8")}async remove(e){try{await vc.unlink(Yo.join(e,Tc))}catch(t){if(!j(t))throw t}}async exists(e){let t=Yo.join(e,Tc);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
653
  `)}},$m=new Ec});var Pc,xt,Qs=P(()=>{"use strict";Ae();Cs();Y();Pc=class{static{u(this,"MemoryService")}async log(e,t,s,n){try{let o=await I.getProjectId(e);if(!o)return;M.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?M.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?M.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;M.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 M.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=M.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=ds.MEMORY_MAX_ENTRIES)return 0;let n=s-ds.MEMORY_MAX_ENTRIES,o=M.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);ft.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&&M.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},xt=new Pc});import Mw from"node:path";function _w(r){return Bs(Mw.resolve(r))}function $r(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Ow(r){return fc(r,e=>`${$r(e.name)}::${$r(e.source)}`)}function Nw(r){return fc(r,e=>`${$r(e.issue)}::${$r(e.file)}::${$r(e.source)}`)}var Cc,Lw,_m,Om=P(()=>{"use strict";Y();zo();Vs();u(_w,"repoHash");u($r,"normalizeKey");u(Ow,"dedupePatterns");u(Nw,"dedupeAntiPatterns");Cc=class{static{u(this,"PatternExtractor")}async extract(e){let t=_w(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=Ow([...s,...n]),a=Nw([...o]),c=`analysis:derived-rules:${t}`;return v.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}}},Lw=new Cc,_m=Lw});import Mr from"node:fs/promises";import Fw from"node:os";import _r from"node:path";function Uw(r){return`# ${r.projectName}
654
654
  ${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function Hw(r){return r.patterns.length===0?"":`