prjct-cli 1.38.2 → 1.38.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,11 @@ 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 ey=Object.getOwnPropertyDescriptor;var ty=Object.getOwnPropertyNames;var ny=Object.prototype.hasOwnProperty;var l=(r,e)=>Yr(r,"name",{value:e,configurable:!0}),Dn=(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 w=(r,e)=>()=>(r&&(e=r(r=0)),e);var jn=(r,e)=>{for(var t in e)Yr(r,t,{get:e[t],enumerable:!0})},sy=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ty(e))!ny.call(r,s)&&s!==t&&Yr(r,s,{get:()=>e[s],enumerable:!(n=ey(e,s))||n.enumerable});return r};var Pt=r=>sy(Yr({},"__esModule",{value:!0}),r);var Fu=w(()=>{"use strict"});var Qr,_u=w(()=>{"use strict";Qr={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var sr,Zr=w(()=>{"use strict";sr={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Nu(r){return r instanceof Error&&"code"in r}function P(r){return Nu(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(Nu,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Lu=w(()=>{"use strict"});var Uu=w(()=>{"use strict";Lu()});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Hu,ls=w(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Hu=["frontend","backend","devops","docs","testing","database","general"];l(eo,"calculateConfidence")});var ia=w(()=>{"use strict"});var aa=w(()=>{"use strict";Fu();_u();Zr();F();Uu();ls();ia()});var z={};jn(z,{calculateDuration:()=>fy,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>cy,getDateKey:()=>ly,getDateRange:()=>py,getDaysAgo:()=>gn,getDaysFromNow:()=>dy,getEndOfDay:()=>yy,getStartOfDay:()=>hy,getTimestamp:()=>b,getTodayKey:()=>Gu,getYearMonthDay:()=>ca,isToday:()=>my,isWithinLastDays:()=>gy,parseDate:()=>uy,toRelative:()=>wy});import{formatDistanceToNowStrict as ay}from"date-fns";function us(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function cy(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Gu(){return us(new Date)}function ly(r){return us(r)}function ca(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function uy(r){return new Date(r)}function b(){return new Date().toISOString()}function gn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function dy(r){let e=new Date;return e.setDate(e.getDate()+r),e}function py(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function my(r){return us(r)===Gu()}function gy(r,e){let t=gn(e);return r>=t}function nn(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function fy(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function hy(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function yy(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function wy(r){let e=typeof r=="string"?new Date(r):r;return ay(e,{addSuffix:!0})}var oe=w(()=>{"use strict";l(us,"formatDate");l(cy,"formatMonth");l(Gu,"getTodayKey");l(ly,"getDateKey");l(ca,"getYearMonthDay");l(uy,"parseDate");l(b,"getTimestamp");l(gn,"getDaysAgo");l(dy,"getDaysFromNow");l(py,"getDateRange");l(my,"isToday");l(gy,"isWithinLastDays");l(nn,"formatDuration");l(fy,"calculateDuration");l(hy,"getStartOfDay");l(yy,"getEndOfDay");l(wy,"toRelative")});import Vu from"node:fs/promises";async function Bu(r,e){let t;try{t=await Vu.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await zu(r,t),Wu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await zu(r,t),Wu(r,ky(s.error)),null)}async function zu(r,e){let t=`${r}.backup`;try{await Vu.writeFile(t,e,"utf-8")}catch{}}function Wu(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 ky(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ju=w(()=>{"use strict";F();l(Bu,"safeRead");l(zu,"createBackup");l(Wu,"logCorruption");l(ky,"formatZodError")});var ye={};jn(ye,{appendLine:()=>la,appendToFile:()=>by,atomicWrite:()=>Sy,copyFile:()=>Ey,deleteDir:()=>vy,deleteFile:()=>Py,dirExists:()=>to,ensureDir:()=>Rt,fileExists:()=>R,getFileExtension:()=>Dy,getFileModifiedTime:()=>Ty,getFileNameWithoutExtension:()=>jy,getFileSize:()=>xy,listFiles:()=>sn,moveFile:()=>Ay,prependToFile:()=>Cy,readFile:()=>Qe,readJson:()=>Gt,readLines:()=>Iy,writeFile:()=>zt,writeJson:()=>$n,writeLines:()=>Ry});import he from"node:fs/promises";import ds from"node:path";async function Gt(r,e=null,t){if(t)return await Bu(r,t)??e;try{let n=await he.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function $n(r,e,t=2){let n=JSON.stringify(e,null,t);await he.writeFile(r,n,"utf-8")}async function Qe(r,e=""){try{return await he.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function zt(r,e){let t=ds.dirname(r);await he.mkdir(t,{recursive:!0}),await he.writeFile(r,e,"utf-8")}async function Sy(r,e){let t=ds.dirname(r);await he.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await he.writeFile(n,e,"utf-8"),await he.rename(n,r)}async function by(r,e){await he.appendFile(r,e,"utf-8")}async function la(r,e){let t=ds.dirname(r);await he.mkdir(t,{recursive:!0}),await he.appendFile(r,`${e}
9
- `,"utf-8")}async function Cy(r,e){try{let t=await he.readFile(r,"utf-8");await he.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await he.writeFile(r,e,"utf-8");else throw t}}async function R(r){try{return await he.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function to(r){try{return(await he.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Rt(r){await he.mkdir(r,{recursive:!0})}async function Py(r){try{return await he.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function vy(r){try{return await he.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function sn(r,e={}){try{let n=await he.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(P(t))return[];throw t}}async function xy(r){return(await he.stat(r)).size}async function Ty(r){return(await he.stat(r)).mtime}async function Ey(r,e){await he.copyFile(r,e)}async function Ay(r,e){await he.rename(r,e)}async function Iy(r){return(await Qe(r,"")).split(`
8
+ var Yr=Object.defineProperty;var ey=Object.getOwnPropertyDescriptor;var ty=Object.getOwnPropertyNames;var ny=Object.prototype.hasOwnProperty;var l=(r,e)=>Yr(r,"name",{value:e,configurable:!0}),Dn=(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 w=(r,e)=>()=>(r&&(e=r(r=0)),e);var jn=(r,e)=>{for(var t in e)Yr(r,t,{get:e[t],enumerable:!0})},sy=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ty(e))!ny.call(r,s)&&s!==t&&Yr(r,s,{get:()=>e[s],enumerable:!(n=ey(e,s))||n.enumerable});return r};var Pt=r=>sy(Yr({},"__esModule",{value:!0}),r);var Fu=w(()=>{"use strict"});var Qr,_u=w(()=>{"use strict";Qr={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var rr,Zr=w(()=>{"use strict";rr={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Nu(r){return r instanceof Error&&"code"in r}function P(r){return Nu(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l(Nu,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Lu=w(()=>{"use strict"});var Uu=w(()=>{"use strict";Lu()});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Hu,ls=w(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Hu=["frontend","backend","devops","docs","testing","database","general"];l(eo,"calculateConfidence")});var ia=w(()=>{"use strict"});var aa=w(()=>{"use strict";Fu();_u();Zr();F();Uu();ls();ia()});var z={};jn(z,{calculateDuration:()=>fy,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>cy,getDateKey:()=>ly,getDateRange:()=>py,getDaysAgo:()=>gn,getDaysFromNow:()=>dy,getEndOfDay:()=>yy,getStartOfDay:()=>hy,getTimestamp:()=>b,getTodayKey:()=>Gu,getYearMonthDay:()=>ca,isToday:()=>my,isWithinLastDays:()=>gy,parseDate:()=>uy,toRelative:()=>wy});import{formatDistanceToNowStrict as ay}from"date-fns";function us(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function cy(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Gu(){return us(new Date)}function ly(r){return us(r)}function ca(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function uy(r){return new Date(r)}function b(){return new Date().toISOString()}function gn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function dy(r){let e=new Date;return e.setDate(e.getDate()+r),e}function py(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function my(r){return us(r)===Gu()}function gy(r,e){let t=gn(e);return r>=t}function nn(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function fy(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function hy(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function yy(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function wy(r){let e=typeof r=="string"?new Date(r):r;return ay(e,{addSuffix:!0})}var oe=w(()=>{"use strict";l(us,"formatDate");l(cy,"formatMonth");l(Gu,"getTodayKey");l(ly,"getDateKey");l(ca,"getYearMonthDay");l(uy,"parseDate");l(b,"getTimestamp");l(gn,"getDaysAgo");l(dy,"getDaysFromNow");l(py,"getDateRange");l(my,"isToday");l(gy,"isWithinLastDays");l(nn,"formatDuration");l(fy,"calculateDuration");l(hy,"getStartOfDay");l(yy,"getEndOfDay");l(wy,"toRelative")});import Vu from"node:fs/promises";async function Bu(r,e){let t;try{t=await Vu.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await zu(r,t),Wu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await zu(r,t),Wu(r,ky(s.error)),null)}async function zu(r,e){let t=`${r}.backup`;try{await Vu.writeFile(t,e,"utf-8")}catch{}}function Wu(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 ky(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ju=w(()=>{"use strict";F();l(Bu,"safeRead");l(zu,"createBackup");l(Wu,"logCorruption");l(ky,"formatZodError")});var we={};jn(we,{appendLine:()=>la,appendToFile:()=>by,atomicWrite:()=>Sy,copyFile:()=>Ey,deleteDir:()=>vy,deleteFile:()=>Py,dirExists:()=>to,ensureDir:()=>Rt,fileExists:()=>R,getFileExtension:()=>Dy,getFileModifiedTime:()=>Ty,getFileNameWithoutExtension:()=>jy,getFileSize:()=>xy,listFiles:()=>sn,moveFile:()=>Ay,prependToFile:()=>Cy,readFile:()=>Qe,readJson:()=>zt,readLines:()=>Iy,writeFile:()=>Wt,writeJson:()=>$n,writeLines:()=>Ry});import ye from"node:fs/promises";import ds from"node:path";async function zt(r,e=null,t){if(t)return await Bu(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function $n(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function Qe(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Wt(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function Sy(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function by(r,e){await ye.appendFile(r,e,"utf-8")}async function la(r,e){let t=ds.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
9
+ `,"utf-8")}async function Cy(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function R(r){try{return await ye.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function to(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Rt(r){await ye.mkdir(r,{recursive:!0})}async function Py(r){try{return await ye.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function vy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function sn(r,e={}){try{let n=await ye.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(P(t))return[];throw t}}async function xy(r){return(await ye.stat(r)).size}async function Ty(r){return(await ye.stat(r)).mtime}async function Ey(r,e){await ye.copyFile(r,e)}async function Ay(r,e){await ye.rename(r,e)}async function Iy(r){return(await Qe(r,"")).split(`
10
10
  `)}async function Ry(r,e){let t=e.join(`
11
- `);await zt(r,t)}function Dy(r){return ds.extname(r)}function jy(r){return ds.basename(r,ds.extname(r))}var Me=w(()=>{"use strict";Ju();F();l(Gt,"readJson");l($n,"writeJson");l(Qe,"readFile");l(zt,"writeFile");l(Sy,"atomicWrite");l(by,"appendToFile");l(la,"appendLine");l(Cy,"prependToFile");l(R,"fileExists");l(to,"dirExists");l(Rt,"ensureDir");l(Py,"deleteFile");l(vy,"deleteDir");l(sn,"listFiles");l(xy,"getFileSize");l(Ty,"getFileModifiedTime");l(Ey,"copyFile");l(Ay,"moveFile");l(Iy,"readLines");l(Ry,"writeLines");l(Dy,"getFileExtension");l(jy,"getFileNameWithoutExtension")});import{z as Wt}from"zod";function qu(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var VE,BE,JE,rr,qE,or=w(()=>{"use strict";VE=Wt.enum(["opus","sonnet","haiku"]),BE=Wt.enum(["2.5-pro","2.5-flash","2.0-flash"]),JE=Wt.string().min(1),rr=Wt.object({provider:Wt.string(),model:Wt.string(),cliVersion:Wt.string().optional(),recordedAt:Wt.string()}),qE=Wt.object({preferredModel:Wt.string().optional(),lastAnalysisModel:rr.optional()});l(qu,"compareSemver")});import ua from"node:fs/promises";import $y from"node:os";import Ku from"node:path";async function Qu(){try{let r=await ua.readFile(Yu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>My?null:e.detection}catch{return null}}async function Zu(r){let e={timestamp:new Date().toISOString(),detection:r};await ua.mkdir(Xu,{recursive:!0}),await ua.writeFile(Yu,JSON.stringify(e,null,2))}var Xu,Yu,My,ed=w(()=>{"use strict";Xu=Ku.join($y.homedir(),".prjct-cli","cache"),Yu=Ku.join(Xu,"providers.json"),My=600*1e3;l(Qu,"readProviderCache");l(Zu,"writeProviderCache")});var ht={};jn(ht,{AntigravityProvider:()=>pa,ClaudeProvider:()=>no,CodexProvider:()=>ma,CursorProvider:()=>sd,GeminiProvider:()=>da,Providers:()=>ot,WindsurfProvider:()=>rd,detectAllProviders:()=>ir,detectAntigravity:()=>oo,detectCodex:()=>Mn,detectCursorProject:()=>ad,detectProvider:()=>so,detectWindsurfProject:()=>cd,getActiveProvider:()=>Ny,getCommandsDir:()=>Vy,getGlobalContextPath:()=>Gy,getGlobalSettingsPath:()=>zy,getProjectCommandsPath:()=>By,getProviderBranding:()=>ro,getSkillsPath:()=>Wy,hasProviderConfig:()=>Ly,needsCursorRouterRegeneration:()=>Uy,needsWindsurfRouterRegeneration:()=>Hy,selectProvider:()=>ga,validateCliVersion:()=>id});import{exec as Oy}from"node:child_process";import fn from"node:os";import _e from"node:path";import{promisify as Fy}from"node:util";async function od(r){try{let{stdout:e}=await td(`which ${r}`,{timeout:nd});return e.trim()}catch{return null}}async function _y(r){try{let{stdout:e}=await td(`${r} --version`,{timeout:nd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function so(r){let e=ot[r];if(!e.cliCommand)return{installed:!1};let t=await od(e.cliCommand);if(!t)return{installed:!1};let n=await _y(e.cliCommand),s=id(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function id(r,e){let t=ot[r];return!t.minCliVersion||!e?null:qu(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function ir(r=!1){if(!r){let i=await Qu();if(i)return i}let[e,t,n]=await Promise.all([so("claude"),so("gemini"),Mn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await Zu(o).catch(()=>{}),o}async function Ny(r){if(r&&ot[r])return ot[r];let e=await ir();return e.claude.installed&&!e.gemini.installed?no:e.gemini.installed&&!e.claude.installed?da:no}async function Ly(r){let e=ot[r];return e.configDir?R(e.configDir):!1}function ro(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 ad(r){let e=_e.join(r,".cursor"),t=_e.join(e,"rules"),n=_e.join(t,"prjct.mdc"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Uy(r){let e=await ad(r);return e.detected&&!e.routerInstalled}async function cd(r){let e=_e.join(r,".windsurf"),t=_e.join(e,"rules"),n=_e.join(t,"prjct.md"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Hy(r){let e=await cd(r);return e.detected&&!e.routerInstalled}async function oo(){let r=pa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=_e.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([R(r),R(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Mn(){let r=ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await od("codex"),t=_e.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([R(r),R(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Gy(r){let e=ot[r];return e.configDir?_e.join(e.configDir,e.contextFile):null}function zy(r){let e=ot[r];return!e.configDir||!e.settingsFile?null:_e.join(e.configDir,e.settingsFile)}function Wy(r){return ot[r].skillsDir}function Vy(r){return ot[r].commandsDir}function By(r,e){let t=ot[r];return _e.join(e,t.commandsDir)}async function ga(){let r=await ir(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var td,nd,no,da,pa,sd,rd,ma,ot,Ze=w(()=>{"use strict";or();Me();ed();td=Fy(Oy),nd=2e3,no={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:_e.join(fn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:_e.join(fn.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"},da={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:_e.join(fn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:_e.join(fn.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"},pa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:_e.join(fn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:_e.join(fn.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},sd={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},rd={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},ma={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:_e.join(fn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:_e.join(fn.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},ot={claude:no,gemini:da,cursor:sd,antigravity:pa,windsurf:rd,codex:ma};l(od,"whichCommand");l(_y,"getCliVersion");l(so,"detectProvider");l(id,"validateCliVersion");l(ir,"detectAllProviders");l(Ny,"getActiveProvider");l(Ly,"hasProviderConfig");l(ro,"getProviderBranding");l(ad,"detectCursorProject");l(Uy,"needsCursorRouterRegeneration");l(cd,"detectWindsurfProject");l(Hy,"needsWindsurfRouterRegeneration");l(oo,"detectAntigravity");l(Mn,"detectCodex");l(Gy,"getGlobalContextPath");l(zy,"getGlobalSettingsPath");l(Wy,"getSkillsPath");l(Vy,"getCommandsDir");l(By,"getProjectCommandsPath");l(ga,"selectProvider")});import Jy from"node:crypto";import Vt from"node:fs/promises";import fa from"node:os";import H from"node:path";import{globSync as qy}from"glob";var ha,Ky,x,we=w(()=>{"use strict";oe();Me();ha=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?H.resolve(e):H.join(fa.homedir(),".prjct-cli"),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=H.resolve(e),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}generateProjectId(e){return Jy.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return H.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return H.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return H.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return H.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await to(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await R(t)}async ensureGlobalStructure(){await Rt(this.globalBaseDir),await Rt(this.globalProjectsDir),await Rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Rt(H.join(t,s));return await Rt(H.join(t,"planning","tasks")),await Rt(H.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ca(t);return H.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Rt(n),n}async listSessions(e,t=null,n=null){let s=H.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=H.join(s,a.name),u=await Vt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=H.join(c,d.name),p=await Vt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:H.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,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return H.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Vt.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 to(t)}getDisplayPath(e){let t=fa.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return H.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return H.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return H.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return H.join(this.globalBaseDir,".running")}getDocsPath(){return H.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ze(),Pt(ht)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ze(),Pt(ht)).getActiveProvider();return(Ze(),Pt(ht)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(fa.homedir(),".claude")}getClaudeSettingsPath(){return H.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?H.join(this.getGlobalProjectPath(e),"agents"):H.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return H.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return H.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{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 s of n){let o=H.join(e,s.file);if(await R(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await R(s))try{let o=await Vt.readFile(s,"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 n=[],s=[];try{if(t==="pnpm"){let i=(await Vt.readFile(H.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
12
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=H.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=H.join(e,"lerna.json");if(await R(c)){let u=await Vt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=H.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=qy(o,{cwd:e,absolute:!1});for(let a of i){let c=H.join(e,a),u=H.join(c,"package.json");if(await R(u))try{let d=await Vt.readFile(u,"utf-8"),m=JSON.parse(d),p=H.join(c,"PRJCT.md");n.push({name:m.name||H.basename(a),path:c,relativePath:a,hasPrjctMd:await R(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=H.resolve(e);for(let s of t.packages){let o=H.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=H.resolve(e),n=H.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=H.dirname(t)}return null}},Ky=new ha,x=Ky});function Xy(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ar(){return Xy()==="bun"}var ya=w(()=>{"use strict";l(Xy,"detectRuntime");l(ar,"isBun")});import wa from"node:fs";import ld from"node:path";function Yy(r){if(ar()){let{Database:s}=Dn("bun:sqlite");return new s(r,{create:!0})}let e=Dn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Qy,io,A,L,ne=w(()=>{"use strict";we();ya();l(Yy,"openDatabase");Qy=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
11
+ `);await Wt(r,t)}function Dy(r){return ds.extname(r)}function jy(r){return ds.basename(r,ds.extname(r))}var Me=w(()=>{"use strict";Ju();F();l(zt,"readJson");l($n,"writeJson");l(Qe,"readFile");l(Wt,"writeFile");l(Sy,"atomicWrite");l(by,"appendToFile");l(la,"appendLine");l(Cy,"prependToFile");l(R,"fileExists");l(to,"dirExists");l(Rt,"ensureDir");l(Py,"deleteFile");l(vy,"deleteDir");l(sn,"listFiles");l(xy,"getFileSize");l(Ty,"getFileModifiedTime");l(Ey,"copyFile");l(Ay,"moveFile");l(Iy,"readLines");l(Ry,"writeLines");l(Dy,"getFileExtension");l(jy,"getFileNameWithoutExtension")});import{z as Vt}from"zod";function qu(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var BE,JE,qE,or,KE,ir=w(()=>{"use strict";BE=Vt.enum(["opus","sonnet","haiku"]),JE=Vt.enum(["2.5-pro","2.5-flash","2.0-flash"]),qE=Vt.string().min(1),or=Vt.object({provider:Vt.string(),model:Vt.string(),cliVersion:Vt.string().optional(),recordedAt:Vt.string()}),KE=Vt.object({preferredModel:Vt.string().optional(),lastAnalysisModel:or.optional()});l(qu,"compareSemver")});import ua from"node:fs/promises";import $y from"node:os";import Ku from"node:path";async function Qu(){try{let r=await ua.readFile(Yu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>My?null:e.detection}catch{return null}}async function Zu(r){let e={timestamp:new Date().toISOString(),detection:r};await ua.mkdir(Xu,{recursive:!0}),await ua.writeFile(Yu,JSON.stringify(e,null,2))}var Xu,Yu,My,ed=w(()=>{"use strict";Xu=Ku.join($y.homedir(),".prjct-cli","cache"),Yu=Ku.join(Xu,"providers.json"),My=600*1e3;l(Qu,"readProviderCache");l(Zu,"writeProviderCache")});var ht={};jn(ht,{AntigravityProvider:()=>pa,ClaudeProvider:()=>no,CodexProvider:()=>ma,CursorProvider:()=>sd,GeminiProvider:()=>da,Providers:()=>ot,WindsurfProvider:()=>rd,detectAllProviders:()=>ar,detectAntigravity:()=>oo,detectCodex:()=>Mn,detectCursorProject:()=>ad,detectProvider:()=>so,detectWindsurfProject:()=>cd,getActiveProvider:()=>Ny,getCommandsDir:()=>Vy,getGlobalContextPath:()=>Gy,getGlobalSettingsPath:()=>zy,getProjectCommandsPath:()=>By,getProviderBranding:()=>ro,getSkillsPath:()=>Wy,hasProviderConfig:()=>Ly,needsCursorRouterRegeneration:()=>Uy,needsWindsurfRouterRegeneration:()=>Hy,selectProvider:()=>ga,validateCliVersion:()=>id});import{exec as Oy}from"node:child_process";import fn from"node:os";import Ne from"node:path";import{promisify as Fy}from"node:util";async function od(r){try{let{stdout:e}=await td(`which ${r}`,{timeout:nd});return e.trim()}catch{return null}}async function _y(r){try{let{stdout:e}=await td(`${r} --version`,{timeout:nd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function so(r){let e=ot[r];if(!e.cliCommand)return{installed:!1};let t=await od(e.cliCommand);if(!t)return{installed:!1};let n=await _y(e.cliCommand),s=id(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function id(r,e){let t=ot[r];return!t.minCliVersion||!e?null:qu(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 ar(r=!1){if(!r){let i=await Qu();if(i)return i}let[e,t,n]=await Promise.all([so("claude"),so("gemini"),Mn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await Zu(o).catch(()=>{}),o}async function Ny(r){if(r&&ot[r])return ot[r];let e=await ar();return e.claude.installed&&!e.gemini.installed?no:e.gemini.installed&&!e.claude.installed?da:no}async function Ly(r){let e=ot[r];return e.configDir?R(e.configDir):!1}function ro(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 ad(r){let e=Ne.join(r,".cursor"),t=Ne.join(e,"rules"),n=Ne.join(t,"prjct.mdc"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Uy(r){let e=await ad(r);return e.detected&&!e.routerInstalled}async function cd(r){let e=Ne.join(r,".windsurf"),t=Ne.join(e,"rules"),n=Ne.join(t,"prjct.md"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Hy(r){let e=await cd(r);return e.detected&&!e.routerInstalled}async function oo(){let r=pa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ne.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([R(r),R(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Mn(){let r=ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await od("codex"),t=Ne.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([R(r),R(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Gy(r){let e=ot[r];return e.configDir?Ne.join(e.configDir,e.contextFile):null}function zy(r){let e=ot[r];return!e.configDir||!e.settingsFile?null:Ne.join(e.configDir,e.settingsFile)}function Wy(r){return ot[r].skillsDir}function Vy(r){return ot[r].commandsDir}function By(r,e){let t=ot[r];return Ne.join(e,t.commandsDir)}async function ga(){let r=await ar(),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 td,nd,no,da,pa,sd,rd,ma,ot,Ze=w(()=>{"use strict";ir();Me();ed();td=Fy(Oy),nd=2e3,no={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ne.join(fn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ne.join(fn.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"},da={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ne.join(fn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ne.join(fn.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"},pa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ne.join(fn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ne.join(fn.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},sd={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},rd={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},ma={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ne.join(fn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ne.join(fn.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},ot={claude:no,gemini:da,cursor:sd,antigravity:pa,windsurf:rd,codex:ma};l(od,"whichCommand");l(_y,"getCliVersion");l(so,"detectProvider");l(id,"validateCliVersion");l(ar,"detectAllProviders");l(Ny,"getActiveProvider");l(Ly,"hasProviderConfig");l(ro,"getProviderBranding");l(ad,"detectCursorProject");l(Uy,"needsCursorRouterRegeneration");l(cd,"detectWindsurfProject");l(Hy,"needsWindsurfRouterRegeneration");l(oo,"detectAntigravity");l(Mn,"detectCodex");l(Gy,"getGlobalContextPath");l(zy,"getGlobalSettingsPath");l(Wy,"getSkillsPath");l(Vy,"getCommandsDir");l(By,"getProjectCommandsPath");l(ga,"selectProvider")});import Jy from"node:crypto";import Bt from"node:fs/promises";import fa from"node:os";import H from"node:path";import{globSync as qy}from"glob";var ha,Ky,x,ke=w(()=>{"use strict";oe();Me();ha=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?H.resolve(e):H.join(fa.homedir(),".prjct-cli"),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=H.resolve(e),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}generateProjectId(e){return Jy.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return H.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return H.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return H.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return H.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await to(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await R(t)}async ensureGlobalStructure(){await Rt(this.globalBaseDir),await Rt(this.globalProjectsDir),await Rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Rt(H.join(t,s));return await Rt(H.join(t,"planning","tasks")),await Rt(H.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ca(t);return H.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Rt(n),n}async listSessions(e,t=null,n=null){let s=H.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Bt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=H.join(s,a.name),u=await Bt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=H.join(c,d.name),p=await Bt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:H.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,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return H.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Bt.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 to(t)}getDisplayPath(e){let t=fa.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return H.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return H.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return H.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return H.join(this.globalBaseDir,".running")}getDocsPath(){return H.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ze(),Pt(ht)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ze(),Pt(ht)).getActiveProvider();return(Ze(),Pt(ht)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(fa.homedir(),".claude")}getClaudeSettingsPath(){return H.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?H.join(this.getGlobalProjectPath(e),"agents"):H.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return H.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return H.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{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 s of n){let o=H.join(e,s.file);if(await R(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await R(s))try{let o=await Bt.readFile(s,"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 n=[],s=[];try{if(t==="pnpm"){let i=(await Bt.readFile(H.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
12
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=H.join(e,"package.json"),i=await Bt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=H.join(e,"lerna.json");if(await R(c)){let u=await Bt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=H.join(e,"package.json"),i=await Bt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=qy(o,{cwd:e,absolute:!1});for(let a of i){let c=H.join(e,a),u=H.join(c,"package.json");if(await R(u))try{let d=await Bt.readFile(u,"utf-8"),m=JSON.parse(d),p=H.join(c,"PRJCT.md");n.push({name:m.name||H.basename(a),path:c,relativePath:a,hasPrjctMd:await R(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=H.resolve(e);for(let s of t.packages){let o=H.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=H.resolve(e),n=H.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=H.dirname(t)}return null}},Ky=new ha,x=Ky});function Xy(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function cr(){return Xy()==="bun"}var ya=w(()=>{"use strict";l(Xy,"detectRuntime");l(cr,"isBun")});import wa from"node:fs";import ld from"node:path";function Yy(r){if(cr()){let{Database:s}=Dn("bun:sqlite");return new s(r,{create:!0})}let e=Dn("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Qy,io,A,L,ne=w(()=>{"use strict";ke();ya();l(Yy,"openDatabase");Qy=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
13
13
  -- =======================================================================
14
14
  -- Document storage (backward-compatible with JSON file pattern)
15
15
  -- =======================================================================
@@ -305,7 +305,7 @@ var Yr=Object.defineProperty;var ey=Object.getOwnPropertyDescriptor;var ty=Objec
305
305
  name TEXT NOT NULL,
306
306
  applied_at TEXT NOT NULL
307
307
  )
308
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Qy)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new io,L=A});function Sa(r){if(Hu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ao))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var ka,ao,On,cr,lr,ur=w(()=>{"use strict";ne();ls();oe();ka={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ao={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Sa,"resolveCanonicalDomains");On=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=L.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();L.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},cr=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},lr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};L.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return L.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var dr,ba=w(()=>{"use strict";ne();ls();oe();ur();dr=class r extends On{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=eo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=eo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:eo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=L.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return L.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var ud=w(()=>{"use strict"});import pr from"node:fs/promises";import hn from"node:path";import{z as K}from"zod";async function sw(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 n=hn.join(e,"package.json"),s=await pr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{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: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rw(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 n=await cw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=nw[a];if(!c)continue;c.some(d=>s.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(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ow(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=hn.join(e,a);try{await pr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.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: ${s.join(", ")}`,durationMs:Date.now()-t}}async function iw(r,e){let t=Date.now();try{let n=await lw(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function aw(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 n=[],s=[];for(let o of r.antiPatterns){let i=hn.join(e,o.file);try{await pr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function dd(r,e){let t=Date.now(),n=await Promise.all([sw(r,e),rw(r,e),ow(r,e),iw(r,e),aw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function cw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await pr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=hn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function lw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await pr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var Zy,ew,tw,Ca,GA,nw,Pa=w(()=>{"use strict";F();or();Zy=K.enum(["draft","verified","sealed"]),ew=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),tw=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),Ca=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(ew),antiPatterns:K.array(tw),analyzedAt:K.string(),modelMetadata:rr.optional(),status:Zy.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),GA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},nw={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(sw,"verifyFrameworks");l(rw,"verifyLanguages");l(ow,"verifyPatternLocations");l(iw,"verifyFileCount");l(aw,"verifyAntiPatternFiles");l(dd,"semanticVerify");l(cw,"getProjectExtensions");l(lw,"countProjectFiles")});import{z as De}from"zod";var co,yn,uw,BA,va,pd,mr=w(()=>{"use strict";co=De.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),yn=De.object({primaryDomain:co,secondaryDomains:De.array(co),confidence:De.number().min(0).max(1),filePatterns:De.array(De.string()),relevantAgents:De.array(De.string())}),uw=De.object({classification:yn,classifiedAt:De.string(),source:De.enum(["cache","history","llm","heuristic"]),descriptionHash:De.string(),projectId:De.string()}),BA=De.object({entries:De.record(De.string(),uw),confirmedPatterns:De.array(De.object({descriptionHash:De.string(),classification:yn,confirmedAt:De.string(),taskDescription:De.string()}))}),va={entries:{},confirmedPatterns:[]},pd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as G}from"zod";var dw,pw,md,mw,gw,fw,hw,yw,gd,KA,xa=w(()=>{"use strict";dw=G.enum(["low","medium","high"]),pw=G.enum(["pending","converted","completed","archived","dormant"]),md=G.enum(["high","medium","low"]),mw=G.object({impact:md,effort:md}),gw=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),fw=G.object({name:G.string(),description:G.string()}),hw=G.object({name:G.string(),description:G.string().optional()}),yw=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:dw,status:pw,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:mw.optional(),implementationNotes:G.string().optional(),stack:gw.optional(),modules:G.array(fw).optional(),roles:G.array(hw).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),gd=G.object({ideas:G.array(yw),lastUpdated:G.string()}),KA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function hd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var fd,ww,kw,Sw,bw,ZA,eI,Ta=w(()=>{"use strict";fd=J.enum(["linear","jira","github","monday","asana","none"]),ww=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),kw=J.enum(["none","urgent","high","medium","low"]),Sw=J.enum(["feature","bug","improvement","task","chore","epic"]),bw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:ww,priority:kw,type:Sw.optional(),assignee:J.object({id:J.string(),name:J.string(),email:J.string().optional()}).optional(),labels:J.array(J.string()).default([]),team:J.object({id:J.string(),name:J.string(),key:J.string().optional()}).optional(),project:J.object({id:J.string(),name:J.string()}).optional(),url:J.string(),createdAt:J.string(),updatedAt:J.string(),fetchedAt:J.string()}),ZA=J.object({provider:fd,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),bw)}),eI=J.object({provider:fd,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(hd,"createEmptyIssues")});var bd={};jn(bd,{AgentAssignmentSchema:()=>yd,OUTPUT_SCHEMAS:()=>kd,SubtaskBreakdownSchema:()=>wd,TaskClassificationSchema:()=>yn,renderSchemaForPrompt:()=>Ea});import{z as ze}from"zod";function Ea(r){let e=kd[r];return e?`## OUTPUT FORMAT
308
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Qy)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new io,L=A});function Sa(r){if(Hu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ao))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var ka,ao,On,lr,ur,dr=w(()=>{"use strict";ne();ls();oe();ka={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ao={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Sa,"resolveCanonicalDomains");On=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=L.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();L.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},lr=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},ur=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};L.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return L.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var pr,ba=w(()=>{"use strict";ne();ls();oe();dr();pr=class r extends On{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=eo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=eo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:eo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=L.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return L.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var ud=w(()=>{"use strict"});import mr from"node:fs/promises";import hn from"node:path";import{z as K}from"zod";async function sw(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 n=hn.join(e,"package.json"),s=await mr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{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: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rw(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 n=await cw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=nw[a];if(!c)continue;c.some(d=>s.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(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ow(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=hn.join(e,a);try{await mr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.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: ${s.join(", ")}`,durationMs:Date.now()-t}}async function iw(r,e){let t=Date.now();try{let n=await lw(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function aw(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 n=[],s=[];for(let o of r.antiPatterns){let i=hn.join(e,o.file);try{await mr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function dd(r,e){let t=Date.now(),n=await Promise.all([sw(r,e),rw(r,e),ow(r,e),iw(r,e),aw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function cw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=hn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function lw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await mr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var Zy,ew,tw,Ca,zA,nw,Pa=w(()=>{"use strict";F();ir();Zy=K.enum(["draft","verified","sealed"]),ew=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),tw=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),Ca=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(ew),antiPatterns:K.array(tw),analyzedAt:K.string(),modelMetadata:or.optional(),status:Zy.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),zA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},nw={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(sw,"verifyFrameworks");l(rw,"verifyLanguages");l(ow,"verifyPatternLocations");l(iw,"verifyFileCount");l(aw,"verifyAntiPatternFiles");l(dd,"semanticVerify");l(cw,"getProjectExtensions");l(lw,"countProjectFiles")});import{z as De}from"zod";var co,yn,uw,JA,va,pd,gr=w(()=>{"use strict";co=De.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),yn=De.object({primaryDomain:co,secondaryDomains:De.array(co),confidence:De.number().min(0).max(1),filePatterns:De.array(De.string()),relevantAgents:De.array(De.string())}),uw=De.object({classification:yn,classifiedAt:De.string(),source:De.enum(["cache","history","llm","heuristic"]),descriptionHash:De.string(),projectId:De.string()}),JA=De.object({entries:De.record(De.string(),uw),confirmedPatterns:De.array(De.object({descriptionHash:De.string(),classification:yn,confirmedAt:De.string(),taskDescription:De.string()}))}),va={entries:{},confirmedPatterns:[]},pd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as G}from"zod";var dw,pw,md,mw,gw,fw,hw,yw,gd,XA,xa=w(()=>{"use strict";dw=G.enum(["low","medium","high"]),pw=G.enum(["pending","converted","completed","archived","dormant"]),md=G.enum(["high","medium","low"]),mw=G.object({impact:md,effort:md}),gw=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),fw=G.object({name:G.string(),description:G.string()}),hw=G.object({name:G.string(),description:G.string().optional()}),yw=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:dw,status:pw,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:mw.optional(),implementationNotes:G.string().optional(),stack:gw.optional(),modules:G.array(fw).optional(),roles:G.array(hw).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),gd=G.object({ideas:G.array(yw),lastUpdated:G.string()}),XA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function hd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var fd,ww,kw,Sw,bw,eI,tI,Ta=w(()=>{"use strict";fd=J.enum(["linear","jira","github","monday","asana","none"]),ww=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),kw=J.enum(["none","urgent","high","medium","low"]),Sw=J.enum(["feature","bug","improvement","task","chore","epic"]),bw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:ww,priority:kw,type:Sw.optional(),assignee:J.object({id:J.string(),name:J.string(),email:J.string().optional()}).optional(),labels:J.array(J.string()).default([]),team:J.object({id:J.string(),name:J.string(),key:J.string().optional()}).optional(),project:J.object({id:J.string(),name:J.string()}).optional(),url:J.string(),createdAt:J.string(),updatedAt:J.string(),fetchedAt:J.string()}),eI=J.object({provider:fd,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),bw)}),tI=J.object({provider:fd,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(hd,"createEmptyIssues")});var bd={};jn(bd,{AgentAssignmentSchema:()=>yd,OUTPUT_SCHEMAS:()=>kd,SubtaskBreakdownSchema:()=>wd,TaskClassificationSchema:()=>yn,renderSchemaForPrompt:()=>Ea});import{z as We}from"zod";function Ea(r){let e=kd[r];return e?`## OUTPUT FORMAT
309
309
 
310
310
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
311
311
 
@@ -314,15 +314,15 @@ ${e.example}
314
314
  \`\`\`
315
315
 
316
316
  Fields:
317
- ${Cw(e.schema)}`:null}function Cw(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Sd(n)}`).join(`
318
- `)}return"(see example above)"}function Sd(r){return r instanceof ze.ZodString?"string":r instanceof ze.ZodNumber?"number":r instanceof ze.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ze.ZodArray?`array of ${Sd(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var yd,wd,kd,lo=w(()=>{"use strict";mr();mr();yd=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),wd=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:co,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),kd={classification:{schema:yn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:yd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:wd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(Ea,"renderSchemaForPrompt");l(Cw,"describeSchema");l(Sd,"describeField")});import{z as T}from"zod";var Cd,Pw,vw,Pd,xw,Tw,Ew,Aw,Iw,Rw,Dw,vd,jw,$w,cI,xd,Td,Ed,Ad,Mw,uo,Aa=w(()=>{"use strict";Cd=T.number().min(1).max(5),Pw=T.enum(["exceeded","met","partial","failed"]),vw=T.enum(["definitely","probably","maybe","no"]),Pd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xw=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Pd.optional(),explanation:T.string().optional()})}),Tw=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Ew=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Aw=T.object({metrics:T.array(Tw),acceptanceCriteria:T.array(Ew),overallSuccess:Pw,successScore:T.number().min(0).max(100)}),Iw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Rw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Iw)}),Dw=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:vw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),vd=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:Cd,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),jw=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:xw,success:Aw.optional(),learnings:Rw,roi:Dw,rating:Cd,taskOutcomes:T.array(vd).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),$w=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Pd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),cI=T.object({outcomes:T.array(jw),taskOutcomes:T.array(vd).optional(),aggregates:$w.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),xd={outcomes:[],taskOutcomes:[],lastUpdated:""},Td=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),Ed=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Ad=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Mw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),uo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Mw(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ne}from"zod";function Uw(){let r={};for(let e of _w)r[e]="allow";for(let e of Nw)r[e]="ask";for(let e of Lw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var po,pI,Ow,Ia,Fw,mI,_w,Nw,Lw,gI,Id=w(()=>{"use strict";po=Ne.enum(["allow","deny","ask"]),pI=Ne.enum(["read","write","delete","create"]),Ow=Ne.record(Ne.string(),po),Ia=Ne.record(Ne.string(),po),Fw=Ne.object({enabled:Ne.boolean().default(!0),allowedDomains:Ne.array(Ne.string()).optional(),blockedDomains:Ne.array(Ne.string()).optional()}),mI=Ne.object({bash:Ow.optional(),files:Ne.object({read:Ia.optional(),write:Ia.optional(),delete:Ia.optional()}).optional(),web:Fw.optional(),skills:Ne.record(Ne.string(),po).optional(),doomLoop:Ne.object({enabled:Ne.boolean().default(!0),maxRetries:Ne.number().default(3)}).optional(),externalDirectories:po.default("ask")}),_w=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Lw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Uw,"buildDefaultPermissions");gI=Uw()});import{z as it}from"zod";var wI,kI,Rd=w(()=>{"use strict";wI=it.object({projectId:it.string(),name:it.string(),repoPath:it.string(),description:it.string().optional(),version:it.string().optional(),cliVersion:it.string().optional(),techStack:it.array(it.string()),fileCount:it.number(),commitCount:it.number(),createdAt:it.string(),lastSync:it.string(),lastSyncCommit:it.string().optional(),lastSyncBranch:it.string().optional()}),kI={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Hw,Gw,zw,Ww,Vw,Bw,Jw,qw,Kw,Xw,Yw,Qw,Zw,ek,tk,nk,sk,rk,PI,vI,Dd=w(()=>{"use strict";Hw=E.enum(["planned","active","completed","shipped"]),Gw=E.enum(["low","medium","high"]),zw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Ww=E.enum(["completed","active","planned"]),Vw=E.enum(["planned","active","completed"]),Bw=E.enum(["git","git-branch","manual","prd"]),Jw=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),qw=E.object({id:E.string(),name:E.string(),status:Ww,completedAt:E.string().optional()}),Kw=E.object({goal:E.string(),phases:E.array(qw),successMetrics:E.array(E.string()).optional()}),Xw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),Yw=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),Qw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),Zw=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),ek=E.object({estimated:Qw.nullable(),actual:Zw.nullable()}),tk=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),nk=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:tk.optional(),status:Vw,startDate:E.string().optional(),endDate:E.string().optional()}),sk=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Hw,impact:Gw,effort:E.string().optional(),progress:E.number(),type:zw.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Jw),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Xw.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Bw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:ek.optional(),valueScore:E.number().optional(),commits:E.array(Yw).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),rk=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),PI=E.object({strategy:Kw.nullable().optional(),features:E.array(sk),backlog:E.array(E.union([E.string(),rk])),lastUpdated:E.string(),quarters:E.array(nk).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),vI={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import ok from"node:crypto";import{homedir as ik}from"node:os";import{join as ak}from"node:path";function ge(){return ok.randomUUID()}var ck,jd=w(()=>{"use strict";l(ge,"generateUUID");ck=ak(ik(),".prjct-cli","projects")});import{z as et}from"zod";var $I,$d=w(()=>{"use strict";$I=et.object({sessionId:et.string(),projectId:et.string(),projectPath:et.string(),projectName:et.string().optional(),taskDescription:et.string(),taskStatus:et.enum(["active","paused"]),activeSubtaskIndex:et.number().optional(),subtaskCount:et.number().optional(),branch:et.string().optional(),linearId:et.string().optional(),filesModified:et.array(et.string()).optional(),durationWorkedSec:et.number().optional(),timestamp:et.string(),resumeHint:et.string()})});import{z as X}from"zod";var lk,Md,uk,dk,pk,mk,gk,fk,hk,Od,Ra=w(()=>{"use strict";lk=X.enum(["feature","fix","improvement","refactor"]),Md=X.enum(["pass","warning","fail","skipped"]),uk=X.enum(["added","changed","fixed","removed"]),dk=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),pk=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),mk=X.object({description:X.string(),type:uk.optional()}),gk=X.object({lintStatus:Md.nullable().optional(),lintDetails:X.string().optional(),testStatus:Md.nullable().optional(),testDetails:X.string().optional()}),fk=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),hk=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:lk,agent:X.string().optional(),description:X.string().optional(),changes:X.array(mk).optional(),codeSnippets:X.array(X.string()).optional(),commit:fk.optional(),codeMetrics:pk.optional(),qualityMetrics:gk.optional(),quantitativeImpact:X.string().optional(),duration:dk.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),Od=X.object({shipped:X.array(hk),lastUpdated:X.string()})});import{z as v}from"zod";var yk,_d,wk,kk,Sk,Da,Nd,bk,Ck,Ld,Fd,Pk,vk,Ud,Hd,Gd,xk,Tk,UI,mo=w(()=>{"use strict";or();yk=v.enum(["low","medium","high","critical"]),_d=v.enum(["feature","bug","improvement","chore"]),wk=v.enum(["active","backlog","previously_active"]),kk=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Sk=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Da=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Nd=v.object({output:v.string().min(1,"Subtask output is required"),summary:Da}),bk=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:kk,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Da.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),Ck=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Ld=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(bk).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Ck.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:rr.optional()}),Fd=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),Pk=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),vk=v.object({taskId:v.string(),title:v.string(),classification:_d,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Da),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:Pk.optional()}),Ud=v.object({currentTask:Ld.nullable(),previousTask:Fd.nullable().optional(),pausedTasks:v.array(Fd).optional(),taskHistory:v.array(vk).optional(),lastUpdated:v.string()}),Hd=v.object({id:v.string(),description:v.string(),priority:yk,type:_d,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:wk,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Gd=v.object({tasks:v.array(Hd),lastUpdated:v.string()}),xk=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),Tk=v.object({type:Sk,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),UI=v.object({projectId:v.string(),currentTask:Ld.nullable(),queue:v.array(Hd),stats:xk,recentActivity:v.array(Tk),lastSync:v.string()})});import{z as ie}from"zod";var Ek,Ak,zd,WI,VI,BI,wn,Wd,ps=w(()=>{"use strict";Ek=ie.enum(["improving","stable","declining"]),Ak=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),zd=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),WI=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),VI=ie.object({sprints:ie.array(Ak),averageVelocity:ie.number(),velocityTrend:Ek,estimationAccuracy:ie.number(),overEstimated:ie.array(zd),underEstimated:ie.array(zd),lastUpdated:ie.string()}),BI=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),wn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Wd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Dt=w(()=>{"use strict";ud();Pa();mr();xa();Ta();lo();or();Aa();Id();Rd();Dd();jd();$d();Ra();mo();ps()});var Fn,ja=w(()=>{"use strict";Dt();ls();oe();ur();Fn=class extends On{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),D=(p.tags||[]).filter(B=>I.includes(B));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),D=0;for(let B of I)p.content.toLowerCase().includes(B)&&(D+=2),p.title.toLowerCase().includes(B)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=ka[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ao[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Sa(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
319
- Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var $a,Ik,Le,ms=w(()=>{"use strict";ur();ba();ja();ur();ba();ja();$a=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Fn,this._patternStore=new dr,this._historyStore=new lr,this._sessionStore=new cr}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Ik=new $a,Le=Ik});import{exec as Rk}from"node:child_process";import yt from"node:fs/promises";import jt from"node:path";import{promisify as Dk}from"node:util";var _n,Ma,jk,We,Vd=w(()=>{"use strict";F();_n=Dk(Rk),Ma=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=jt.join(this.projectPath,"package.json"),t=await yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=jt.join(this.projectPath,"Cargo.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=jt.join(this.projectPath,"requirements.txt");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=jt.join(this.projectPath,"go.mod");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=jt.join(this.projectPath,"Gemfile");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=jt.join(this.projectPath,"mix.exs");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=jt.join(this.projectPath,"pom.xml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=jt.join(this.projectPath,"composer.json"),t=await yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=jt.join(this.projectPath,"pyproject.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await _n('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
317
+ ${Cw(e.schema)}`:null}function Cw(r){if(r instanceof We.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Sd(n)}`).join(`
318
+ `)}return"(see example above)"}function Sd(r){return r instanceof We.ZodString?"string":r instanceof We.ZodNumber?"number":r instanceof We.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof We.ZodArray?`array of ${Sd(r.element)}`:r instanceof We.ZodObject?"object":"any"}var yd,wd,kd,lo=w(()=>{"use strict";gr();gr();yd=We.object({agentName:We.string(),reasoning:We.string(),confidence:We.number().min(0).max(1)}),wd=We.object({subtasks:We.array(We.object({description:We.string(),domain:co,agent:We.string(),dependsOn:We.array(We.number())})),effort:We.enum(["low","medium","high"])}),kd={classification:{schema:yn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:yd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:wd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(Ea,"renderSchemaForPrompt");l(Cw,"describeSchema");l(Sd,"describeField")});import{z as T}from"zod";var Cd,Pw,vw,Pd,xw,Tw,Ew,Aw,Iw,Rw,Dw,vd,jw,$w,lI,xd,Td,Ed,Ad,Mw,uo,Aa=w(()=>{"use strict";Cd=T.number().min(1).max(5),Pw=T.enum(["exceeded","met","partial","failed"]),vw=T.enum(["definitely","probably","maybe","no"]),Pd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xw=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Pd.optional(),explanation:T.string().optional()})}),Tw=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Ew=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Aw=T.object({metrics:T.array(Tw),acceptanceCriteria:T.array(Ew),overallSuccess:Pw,successScore:T.number().min(0).max(100)}),Iw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Rw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Iw)}),Dw=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:vw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),vd=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:Cd,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),jw=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:xw,success:Aw.optional(),learnings:Rw,roi:Dw,rating:Cd,taskOutcomes:T.array(vd).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),$w=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Pd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),lI=T.object({outcomes:T.array(jw),taskOutcomes:T.array(vd).optional(),aggregates:$w.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),xd={outcomes:[],taskOutcomes:[],lastUpdated:""},Td=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),Ed=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Ad=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Mw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),uo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Mw(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Le}from"zod";function Uw(){let r={};for(let e of _w)r[e]="allow";for(let e of Nw)r[e]="ask";for(let e of Lw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var po,mI,Ow,Ia,Fw,gI,_w,Nw,Lw,fI,Id=w(()=>{"use strict";po=Le.enum(["allow","deny","ask"]),mI=Le.enum(["read","write","delete","create"]),Ow=Le.record(Le.string(),po),Ia=Le.record(Le.string(),po),Fw=Le.object({enabled:Le.boolean().default(!0),allowedDomains:Le.array(Le.string()).optional(),blockedDomains:Le.array(Le.string()).optional()}),gI=Le.object({bash:Ow.optional(),files:Le.object({read:Ia.optional(),write:Ia.optional(),delete:Ia.optional()}).optional(),web:Fw.optional(),skills:Le.record(Le.string(),po).optional(),doomLoop:Le.object({enabled:Le.boolean().default(!0),maxRetries:Le.number().default(3)}).optional(),externalDirectories:po.default("ask")}),_w=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Lw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Uw,"buildDefaultPermissions");fI=Uw()});import{z as it}from"zod";var kI,SI,Rd=w(()=>{"use strict";kI=it.object({projectId:it.string(),name:it.string(),repoPath:it.string(),description:it.string().optional(),version:it.string().optional(),cliVersion:it.string().optional(),techStack:it.array(it.string()),fileCount:it.number(),commitCount:it.number(),createdAt:it.string(),lastSync:it.string(),lastSyncCommit:it.string().optional(),lastSyncBranch:it.string().optional()}),SI={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Hw,Gw,zw,Ww,Vw,Bw,Jw,qw,Kw,Xw,Yw,Qw,Zw,ek,tk,nk,sk,rk,vI,xI,Dd=w(()=>{"use strict";Hw=E.enum(["planned","active","completed","shipped"]),Gw=E.enum(["low","medium","high"]),zw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Ww=E.enum(["completed","active","planned"]),Vw=E.enum(["planned","active","completed"]),Bw=E.enum(["git","git-branch","manual","prd"]),Jw=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),qw=E.object({id:E.string(),name:E.string(),status:Ww,completedAt:E.string().optional()}),Kw=E.object({goal:E.string(),phases:E.array(qw),successMetrics:E.array(E.string()).optional()}),Xw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),Yw=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),Qw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),Zw=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),ek=E.object({estimated:Qw.nullable(),actual:Zw.nullable()}),tk=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),nk=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:tk.optional(),status:Vw,startDate:E.string().optional(),endDate:E.string().optional()}),sk=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Hw,impact:Gw,effort:E.string().optional(),progress:E.number(),type:zw.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Jw),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Xw.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Bw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:ek.optional(),valueScore:E.number().optional(),commits:E.array(Yw).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),rk=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),vI=E.object({strategy:Kw.nullable().optional(),features:E.array(sk),backlog:E.array(E.union([E.string(),rk])),lastUpdated:E.string(),quarters:E.array(nk).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),xI={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import ok from"node:crypto";import{homedir as ik}from"node:os";import{join as ak}from"node:path";function ge(){return ok.randomUUID()}var ck,jd=w(()=>{"use strict";l(ge,"generateUUID");ck=ak(ik(),".prjct-cli","projects")});import{z as et}from"zod";var MI,$d=w(()=>{"use strict";MI=et.object({sessionId:et.string(),projectId:et.string(),projectPath:et.string(),projectName:et.string().optional(),taskDescription:et.string(),taskStatus:et.enum(["active","paused"]),activeSubtaskIndex:et.number().optional(),subtaskCount:et.number().optional(),branch:et.string().optional(),linearId:et.string().optional(),filesModified:et.array(et.string()).optional(),durationWorkedSec:et.number().optional(),timestamp:et.string(),resumeHint:et.string()})});import{z as X}from"zod";var lk,Md,uk,dk,pk,mk,gk,fk,hk,Od,Ra=w(()=>{"use strict";lk=X.enum(["feature","fix","improvement","refactor"]),Md=X.enum(["pass","warning","fail","skipped"]),uk=X.enum(["added","changed","fixed","removed"]),dk=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),pk=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),mk=X.object({description:X.string(),type:uk.optional()}),gk=X.object({lintStatus:Md.nullable().optional(),lintDetails:X.string().optional(),testStatus:Md.nullable().optional(),testDetails:X.string().optional()}),fk=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),hk=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:lk,agent:X.string().optional(),description:X.string().optional(),changes:X.array(mk).optional(),codeSnippets:X.array(X.string()).optional(),commit:fk.optional(),codeMetrics:pk.optional(),qualityMetrics:gk.optional(),quantitativeImpact:X.string().optional(),duration:dk.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),Od=X.object({shipped:X.array(hk),lastUpdated:X.string()})});import{z as v}from"zod";var yk,_d,wk,kk,Sk,Da,Nd,bk,Ck,Ld,Fd,Pk,vk,Ud,Hd,Gd,xk,Tk,HI,mo=w(()=>{"use strict";ir();yk=v.enum(["low","medium","high","critical"]),_d=v.enum(["feature","bug","improvement","chore"]),wk=v.enum(["active","backlog","previously_active"]),kk=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Sk=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Da=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Nd=v.object({output:v.string().min(1,"Subtask output is required"),summary:Da}),bk=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:kk,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Da.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),Ck=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Ld=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(bk).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Ck.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:or.optional()}),Fd=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),Pk=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),vk=v.object({taskId:v.string(),title:v.string(),classification:_d,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Da),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:Pk.optional()}),Ud=v.object({currentTask:Ld.nullable(),previousTask:Fd.nullable().optional(),pausedTasks:v.array(Fd).optional(),taskHistory:v.array(vk).optional(),lastUpdated:v.string()}),Hd=v.object({id:v.string(),description:v.string(),priority:yk,type:_d,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:wk,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Gd=v.object({tasks:v.array(Hd),lastUpdated:v.string()}),xk=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),Tk=v.object({type:Sk,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),HI=v.object({projectId:v.string(),currentTask:Ld.nullable(),queue:v.array(Hd),stats:xk,recentActivity:v.array(Tk),lastSync:v.string()})});import{z as ie}from"zod";var Ek,Ak,zd,VI,BI,JI,wn,Wd,ps=w(()=>{"use strict";Ek=ie.enum(["improving","stable","declining"]),Ak=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),zd=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),VI=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),BI=ie.object({sprints:ie.array(Ak),averageVelocity:ie.number(),velocityTrend:Ek,estimationAccuracy:ie.number(),overEstimated:ie.array(zd),underEstimated:ie.array(zd),lastUpdated:ie.string()}),JI=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),wn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Wd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Dt=w(()=>{"use strict";ud();Pa();gr();xa();Ta();lo();ir();Aa();Id();Rd();Dd();jd();$d();Ra();mo();ps()});var Fn,ja=w(()=>{"use strict";Dt();ls();oe();dr();Fn=class extends On{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),D=(p.tags||[]).filter(B=>I.includes(B));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),D=0;for(let B of I)p.content.toLowerCase().includes(B)&&(D+=2),p.title.toLowerCase().includes(B)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=ka[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ao[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Sa(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
319
+ Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var $a,Ik,Ue,ms=w(()=>{"use strict";dr();ba();ja();dr();ba();ja();$a=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Fn,this._patternStore=new pr,this._historyStore=new ur,this._sessionStore=new lr}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Ik=new $a,Ue=Ik});import{exec as Rk}from"node:child_process";import yt from"node:fs/promises";import jt from"node:path";import{promisify as Dk}from"node:util";var _n,Ma,jk,Ve,Vd=w(()=>{"use strict";F();_n=Dk(Rk),Ma=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=jt.join(this.projectPath,"package.json"),t=await yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=jt.join(this.projectPath,"Cargo.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=jt.join(this.projectPath,"requirements.txt");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=jt.join(this.projectPath,"go.mod");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=jt.join(this.projectPath,"Gemfile");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=jt.join(this.projectPath,"mix.exs");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=jt.join(this.projectPath,"pom.xml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=jt.join(this.projectPath,"composer.json"),t=await yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=jt.join(this.projectPath,"pyproject.toml");return await yt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await _n('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
320
320
  `).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await yt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await yt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await _n(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await _n("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await _n('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await _n('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await _n('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await yt.access(jt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=jt.join(this.projectPath,e);return await yt.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await _n(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
321
- `).filter(Boolean)}catch{return[]}}},jk=new Ma,We=jk});import{z as ke}from"zod";function $k(r){return r instanceof gs}function Y(r){return $k(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fs,UR,HR,GR,zR,WR,VR,gs,go,fo,gr,rn=w(()=>{"use strict";fs={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},UR=fs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),HR=fs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),GR=fs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),zR=fs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),WR=fs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),VR=fs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),gs=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},go=class r extends gs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},fo=class r extends gs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},gr=class r extends gs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l($k,"isPrjctError");l(Y,"getErrorMessage")});import Oa from"node:fs";import yo from"node:path";function Bd(){if(fr)return fr;let r=__dirname;for(let e=0;e<5;e++){let t=yo.join(r,"package.json");if(Oa.existsSync(t))try{if(JSON.parse(Oa.readFileSync(t,"utf-8")).name==="prjct-cli")return fr=r,r}catch{}r=yo.dirname(r)}return fr=yo.join(__dirname,"..","..",".."),fr}function Fa(){if(ho)return ho;try{let r=yo.join(Bd(),"package.json"),e=JSON.parse(Oa.readFileSync(r,"utf-8"));return ho=e.version,Mk=e,ho}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var ho,Mk,fr,Ve,ce,Bt=w(()=>{"use strict";F();ho=null,Mk=null,fr=null;l(Bd,"getPackageRoot");l(Fa,"getVersion");Ve=Fa(),ce=Bd()});import Na from"node:fs";import Ok from"node:fs/promises";import wo from"node:path";function La(){if(Jd)return _a;Jd=!0;let r=wo.join(ce,"dist","templates.json");try{let e=Na.readFileSync(r,"utf-8");return _a=JSON.parse(e),_a}catch{return null}}function _k(r){let e=Nn.indexOf(r);e>-1&&Nn.splice(e,1),Nn.push(r)}function Nk(){for(;hs.size>=Fk&&Nn.length>0;){let r=Nn.shift();r&&hs.delete(r)}}function ko(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
322
- `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function qd(r){if(hs.has(r))return _k(r),hs.get(r);let e,t=La();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=wo.join(ce,"templates","commands",`${r}.md`);try{e=await Ok.readFile(s,"utf-8")}catch{throw fo.notFound(r)}}let n=ko(e);return Nk(),hs.set(r,n),Nn.push(r),n}async function Lk(r){return(await qd(r)).frontmatter["allowed-tools"]||[]}function Uk(){hs.clear(),Nn.length=0}function le(r){let e=La();if(e?.[r])return e[r];let t=wo.join(ce,"templates",r);try{return Na.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=La();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=wo.join(ce,"templates",r);try{return Na.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Fk,hs,Nn,_a,Jd,Hk,Ua,Jt=w(()=>{"use strict";rn();Bt();Fk=50,hs=new Map,Nn=[],_a=null,Jd=!1;l(La,"loadBundle");l(_k,"updateLruOrder");l(Nk,"evictLru");l(ko,"parseFrontmatter");l(qd,"load");l(Lk,"getAllowedTools");l(Uk,"clearCache");l(le,"getTemplateContent");l(kn,"listTemplates");Hk={load:qd,parseFrontmatter:ko,getAllowedTools:Lk,clearCache:Uk,getTemplateContent:le,listTemplates:kn},Ua=Hk});import q from"node:fs/promises";import Ga from"node:os";import Q from"node:path";async function Gk(){try{let r=le("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Q.join(ce,"templates/global/modules/module-config.json"),t=await q.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function zk(r){let e=await Gk();if(!e){let i=le("global/CLAUDE.md");if(i)return i;let a=Q.join(ce,"templates/global/CLAUDE.md");return q.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=le("global/CLAUDE.md");if(a)return a;let c=Q.join(ce,"templates/global/CLAUDE.md");return q.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=le(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Q.join(ce,"templates/global/modules",i),u=await q.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
321
+ `).filter(Boolean)}catch{return[]}}},jk=new Ma,Ve=jk});import{z as Se}from"zod";function $k(r){return r instanceof gs}function Y(r){return $k(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fs,HR,GR,zR,WR,VR,BR,gs,go,fo,fr,rn=w(()=>{"use strict";fs={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},HR=fs.create("FileError",Se.object({path:Se.string(),operation:Se.enum(["read","write","delete","create","copy"]),reason:Se.string().optional()})),GR=fs.create("ValidationError",Se.object({field:Se.string(),expected:Se.string(),received:Se.string().optional(),message:Se.string().optional()})),zR=fs.create("PermissionError",Se.object({action:Se.string(),resource:Se.string(),reason:Se.string().optional()})),WR=fs.create("TaskError",Se.object({taskId:Se.string().optional(),operation:Se.enum(["create","update","complete","pause","resume","delete"]),reason:Se.string()})),VR=fs.create("SessionError",Se.object({sessionId:Se.string().optional(),reason:Se.string()})),BR=fs.create("SyncError",Se.object({projectId:Se.string().optional(),operation:Se.enum(["push","pull","auth","connect"]),reason:Se.string()})),gs=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},go=class r extends gs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},fo=class r extends gs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},fr=class r extends gs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l($k,"isPrjctError");l(Y,"getErrorMessage")});import Oa from"node:fs";import yo from"node:path";function Bd(){if(hr)return hr;let r=__dirname;for(let e=0;e<5;e++){let t=yo.join(r,"package.json");if(Oa.existsSync(t))try{if(JSON.parse(Oa.readFileSync(t,"utf-8")).name==="prjct-cli")return hr=r,r}catch{}r=yo.dirname(r)}return hr=yo.join(__dirname,"..","..",".."),hr}function Fa(){if(ho)return ho;try{let r=yo.join(Bd(),"package.json"),e=JSON.parse(Oa.readFileSync(r,"utf-8"));return ho=e.version,Mk=e,ho}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var ho,Mk,hr,Oe,ce,$t=w(()=>{"use strict";F();ho=null,Mk=null,hr=null;l(Bd,"getPackageRoot");l(Fa,"getVersion");Oe=Fa(),ce=Bd()});import Na from"node:fs";import Ok from"node:fs/promises";import wo from"node:path";function La(){if(Jd)return _a;Jd=!0;let r=wo.join(ce,"dist","templates.json");try{let e=Na.readFileSync(r,"utf-8");return _a=JSON.parse(e),_a}catch{return null}}function _k(r){let e=Nn.indexOf(r);e>-1&&Nn.splice(e,1),Nn.push(r)}function Nk(){for(;hs.size>=Fk&&Nn.length>0;){let r=Nn.shift();r&&hs.delete(r)}}function ko(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
322
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function qd(r){if(hs.has(r))return _k(r),hs.get(r);let e,t=La();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=wo.join(ce,"templates","commands",`${r}.md`);try{e=await Ok.readFile(s,"utf-8")}catch{throw fo.notFound(r)}}let n=ko(e);return Nk(),hs.set(r,n),Nn.push(r),n}async function Lk(r){return(await qd(r)).frontmatter["allowed-tools"]||[]}function Uk(){hs.clear(),Nn.length=0}function le(r){let e=La();if(e?.[r])return e[r];let t=wo.join(ce,"templates",r);try{return Na.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=La();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=wo.join(ce,"templates",r);try{return Na.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Fk,hs,Nn,_a,Jd,Hk,Ua,Jt=w(()=>{"use strict";rn();$t();Fk=50,hs=new Map,Nn=[],_a=null,Jd=!1;l(La,"loadBundle");l(_k,"updateLruOrder");l(Nk,"evictLru");l(ko,"parseFrontmatter");l(qd,"load");l(Lk,"getAllowedTools");l(Uk,"clearCache");l(le,"getTemplateContent");l(kn,"listTemplates");Hk={load:qd,parseFrontmatter:ko,getAllowedTools:Lk,clearCache:Uk,getTemplateContent:le,listTemplates:kn},Ua=Hk});import q from"node:fs/promises";import Ga from"node:os";import Q from"node:path";async function Gk(){try{let r=le("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Q.join(ce,"templates/global/modules/module-config.json"),t=await q.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function zk(r){let e=await Gk();if(!e){let i=le("global/CLAUDE.md");if(i)return i;let a=Q.join(ce,"templates/global/CLAUDE.md");return q.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=le("global/CLAUDE.md");if(a)return a;let c=Q.join(ce,"templates/global/CLAUDE.md");return q.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=le(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Q.join(ce,"templates/global/modules",i),u=await q.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
323
323
  `)}async function Wk(){try{let r=Q.join(Ga.homedir(),".prjct-cli","docs");await q.mkdir(r,{recursive:!0});let e=kn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=le(s);if(o){let i=Q.basename(s);await q.writeFile(Q.join(r,i),o,"utf-8")}}return{success:!0}}let t=Q.join(ce,"templates/global/docs"),n=await q.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Q.join(t,s),i=Q.join(r,s),a=await q.readFile(o,"utf-8");await q.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Vk(){let r=(Ze(),Pt(ht)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await q.mkdir(e.configDir,{recursive:!0});let s=Q.join(e.configDir,e.contextFile),o=Q.join(ce,"templates","global",e.contextFile),i="";try{let u=le(`global/${e.contextFile}`);u?i=u:i=await q.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await zk()}catch{let d=le("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ce,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}}else{let d=le("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ce,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await q.readFile(s,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await q.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
324
324
 
325
- ${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await q.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Kd(){let r=Ga.homedir();return{claude:{commands:Q.join(r,".claude","commands","p"),config:Q.join(r,".claude"),router:Q.join(r,".claude","commands","p.md")},gemini:{commands:Q.join(r,".gemini","commands"),config:Q.join(r,".gemini"),router:Q.join(r,".gemini","commands","p.toml")}}}var Ha,Bk,ve,Sn=w(()=>{"use strict";Jt();F();Bt();l(Gk,"loadModuleConfig");l(zk,"composeGlobalTemplate");l(Wk,"installDocs");l(Vk,"installGlobalConfig");Ha=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ga.homedir(),this.templatesDir=Q.join(ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Pt(ht)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Q.join(t.configDir,"commands"):this.claudeCommandsPath=Q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await q.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=kn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await q.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Ze(),Pt(ht)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Q.join(this.claudeCommandsPath,a),u=le(`commands/${a}`);if(u)await q.writeFile(c,u,"utf-8");else{let d=Q.join(this.templatesDir,a),m=await q.readFile(d,"utf-8");await q.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Q.join(this.claudeCommandsPath,s);await q.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await q.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await q.access(this.claudeCommandsPath);let n=(await q.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(le(`commands/${e}.md`))return!0;try{let n=Q.join(this.templatesDir,`${e}.md`);return await q.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Q.join(t.configDir,"commands",n);await q.mkdir(Q.dirname(s),{recursive:!0});let o=le(`commands/${n}`);if(o)return await q.writeFile(s,o,"utf-8"),!0;let i=Q.join(this.templatesDir,n),a=await q.readFile(i,"utf-8");return await q.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=Q.join(t.configDir,"commands"),s=0;try{let i=(await q.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await q.unlink(Q.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await q.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Q.join(this.claudeCommandsPath,o),a=n.includes(o),c=le(`commands/${o}`);if(c)await q.writeFile(i,c,"utf-8");else{let u=Q.join(this.templatesDir,o),d=await q.readFile(u,"utf-8");await q.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Vk()}async installDocs(){return Wk()}};l(Kd,"getProviderPaths");Bk=new Ha,ve=Bk});import{z as je}from"zod";function Zd(r,e="default"){let t=Xd[e]||Xd.default;return r/1e3*t}function So(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Jk,qk,Yd,Qd,Xd,bo=w(()=>{"use strict";Jk=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),qk=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Yd=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(qk),dailyStats:je.array(Jk),firstSync:je.string(),lastUpdated:je.string()}),Qd={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Xd={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(Zd,"estimateCostSaved");l(So,"formatCost")});function Kk(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Xk(r){let e=[],t=Kk(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(za,o+i.length);if(c===-1)continue;let u=c+za.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Wa(r,e){let t=Xk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
325
+ ${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await q.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Kd(){let r=Ga.homedir();return{claude:{commands:Q.join(r,".claude","commands","p"),config:Q.join(r,".claude"),router:Q.join(r,".claude","commands","p.md")},gemini:{commands:Q.join(r,".gemini","commands"),config:Q.join(r,".gemini"),router:Q.join(r,".gemini","commands","p.toml")}}}var Ha,Bk,xe,Sn=w(()=>{"use strict";Jt();F();$t();l(Gk,"loadModuleConfig");l(zk,"composeGlobalTemplate");l(Wk,"installDocs");l(Vk,"installGlobalConfig");Ha=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ga.homedir(),this.templatesDir=Q.join(ce,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Pt(ht)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Q.join(t.configDir,"commands"):this.claudeCommandsPath=Q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await q.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=kn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await q.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Ze(),Pt(ht)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Q.join(this.claudeCommandsPath,a),u=le(`commands/${a}`);if(u)await q.writeFile(c,u,"utf-8");else{let d=Q.join(this.templatesDir,a),m=await q.readFile(d,"utf-8");await q.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Q.join(this.claudeCommandsPath,s);await q.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await q.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await q.access(this.claudeCommandsPath);let n=(await q.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(le(`commands/${e}.md`))return!0;try{let n=Q.join(this.templatesDir,`${e}.md`);return await q.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Q.join(t.configDir,"commands",n);await q.mkdir(Q.dirname(s),{recursive:!0});let o=le(`commands/${n}`);if(o)return await q.writeFile(s,o,"utf-8"),!0;let i=Q.join(this.templatesDir,n),a=await q.readFile(i,"utf-8");return await q.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Ze(),Pt(ht)).getActiveProvider(),n=Q.join(t.configDir,"commands"),s=0;try{let i=(await q.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await q.unlink(Q.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await q.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Q.join(this.claudeCommandsPath,o),a=n.includes(o),c=le(`commands/${o}`);if(c)await q.writeFile(i,c,"utf-8");else{let u=Q.join(this.templatesDir,o),d=await q.readFile(u,"utf-8");await q.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Vk()}async installDocs(){return Wk()}};l(Kd,"getProviderPaths");Bk=new Ha,xe=Bk});import{z as je}from"zod";function Zd(r,e="default"){let t=Xd[e]||Xd.default;return r/1e3*t}function So(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Jk,qk,Yd,Qd,Xd,bo=w(()=>{"use strict";Jk=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),qk=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Yd=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(qk),dailyStats:je.array(Jk),firstSync:je.string(),lastUpdated:je.string()}),Qd={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Xd={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(Zd,"estimateCostSaved");l(So,"formatCost")});function Kk(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Xk(r){let e=[],t=Kk(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(za,o+i.length);if(c===-1)continue;let u=c+za.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Wa(r,e){let t=Xk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
326
326
 
327
327
  ---
328
328
 
@@ -334,10 +334,10 @@ ${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
334
334
 
335
335
  `;return`${n.trimEnd()}
336
336
  `}function Va(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
337
- `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(za)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var za,Ba=w(()=>{"use strict";za="<!-- /prjct:preserve -->";l(Kk,"createPreserveStartRegex");l(Xk,"extractPreservedSections");l(Wa,"mergePreservedSections");l(Va,"validatePreserveBlocks")});function hr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Yk.has(e.code))return!0;if(e.code&&tp.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function Po(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&tp.has(e.code))}function ep(r,e,t){let n=bn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(r),!1):!0:!1}function Ja(r,e){let t=bn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(r,t)}function Qk(r){bn.delete(r)}var Yk,tp,bn,Co,np,yr,vo=w(()=>{"use strict";Yk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),tp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(hr,"isTransientError");l(Po,"isPermanentError");bn=new Map;l(ep,"isCircuitOpen");l(Ja,"recordFailure");l(Qk,"recordSuccess");Co=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(ep(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Qk(t),o}catch(o){if(n=o,s++,Po(o))throw Ja(t,this.options.circuitBreakerThreshold),o;if(!(hr(o)&&s<this.options.maxAttempts))throw Ja(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Ja(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return hr(e)}isCircuitOpen(e){return ep(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},np=new Co({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),yr=new Co({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var sp=w(()=>{"use strict";Ba();vo()});import{exec as Zk}from"node:child_process";import{promisify as eS}from"node:util";async function xo(r){try{let{stdout:e}=await tS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function nS(){let r=await xo("gh api user --jq .login");return r.success&&r.output||(r=await xo("git config --global github.user"),r.success&&r.output)?r.output:null}async function sS(){let r=await xo("git config user.name");return r.success&&r.output?r.output:null}async function rS(){let r=await xo("git config user.email");return r.success&&r.output?r.output:null}async function ys(){let[r,e,t]=await Promise.all([nS(),sS(),rS()]);return{github:r,email:t,name:e||r||"Unknown"}}var tS,To=w(()=>{"use strict";tS=eS(Zk);l(xo,"execCommand");l(nS,"detectGitHubUsername");l(sS,"detectGitName");l(rS,"detectGitEmail");l(ys,"detect")});import Ln from"node:fs/promises";import oS from"node:path";import*as Eo from"jsonc-parser";function rp(r){let e=[],t=Eo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Eo.printParseErrorCode(n.error)}`)}return t}var Ka,iS,$,wt=w(()=>{"use strict";rn();F();oe();Bt();To();we();l(rp,"parseJsonc");Ka=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Ln.readFile(t,"utf-8");return rp(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${Y(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await Ln.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Ln.writeFile(n,`${o}
337
+ `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(za)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var za,Ba=w(()=>{"use strict";za="<!-- /prjct:preserve -->";l(Kk,"createPreserveStartRegex");l(Xk,"extractPreservedSections");l(Wa,"mergePreservedSections");l(Va,"validatePreserveBlocks")});function yr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Yk.has(e.code))return!0;if(e.code&&tp.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function Po(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&tp.has(e.code))}function ep(r,e,t){let n=bn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(r),!1):!0:!1}function Ja(r,e){let t=bn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(r,t)}function Qk(r){bn.delete(r)}var Yk,tp,bn,Co,np,wr,vo=w(()=>{"use strict";Yk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),tp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(yr,"isTransientError");l(Po,"isPermanentError");bn=new Map;l(ep,"isCircuitOpen");l(Ja,"recordFailure");l(Qk,"recordSuccess");Co=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(ep(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Qk(t),o}catch(o){if(n=o,s++,Po(o))throw Ja(t,this.options.circuitBreakerThreshold),o;if(!(yr(o)&&s<this.options.maxAttempts))throw Ja(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Ja(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return yr(e)}isCircuitOpen(e){return ep(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},np=new Co({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),wr=new Co({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var sp=w(()=>{"use strict";Ba();vo()});import{exec as Zk}from"node:child_process";import{promisify as eS}from"node:util";async function xo(r){try{let{stdout:e}=await tS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function nS(){let r=await xo("gh api user --jq .login");return r.success&&r.output||(r=await xo("git config --global github.user"),r.success&&r.output)?r.output:null}async function sS(){let r=await xo("git config user.name");return r.success&&r.output?r.output:null}async function rS(){let r=await xo("git config user.email");return r.success&&r.output?r.output:null}async function ys(){let[r,e,t]=await Promise.all([nS(),sS(),rS()]);return{github:r,email:t,name:e||r||"Unknown"}}var tS,To=w(()=>{"use strict";tS=eS(Zk);l(xo,"execCommand");l(nS,"detectGitHubUsername");l(sS,"detectGitName");l(rS,"detectGitEmail");l(ys,"detect")});import Ln from"node:fs/promises";import oS from"node:path";import*as Eo from"jsonc-parser";function rp(r){let e=[],t=Eo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Eo.printParseErrorCode(n.error)}`)}return t}var Ka,iS,$,wt=w(()=>{"use strict";rn();F();oe();$t();To();ke();l(rp,"parseJsonc");Ka=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Ln.readFile(t,"utf-8");return rp(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${Y(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await Ln.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Ln.writeFile(n,`${o}
338
338
  `,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await Ln.readFile(t,"utf-8");return rp(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${Y(t)}`),null}}async writeGlobalConfig(e,t){let n=x.getGlobalProjectConfigPath(e),s=x.getGlobalProjectPath(e);await Ln.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Ln.writeFile(n,`${o}
339
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Ve,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=x.generateProjectId(e),s=x.getGlobalProjectPath(n),o=x.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Ve,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await x.hasLegacyStructure(e))return!1;if(!await x.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=x.getGlobalProjectPath(s.projectId);try{return(await Ln.readdir(oS.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:x.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ys(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=x.generateProjectId(e);return{projectId:n,dataPath:x.getDisplayPath(x.getGlobalProjectPath(n))}}},iS=new Ka,$=iS});import Ao from"node:fs/promises";import Xa from"node:path";var Ya,op,ip=w(()=>{"use strict";wt();we();F();Ya=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Ao.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Ao.readFile(Xa.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Xa.join(this.agentsPath,`${e}.md`),n=await Ao.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Xa.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
340
- `;await Ao.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},op=Ya});import ap from"node:path";async function lS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await R(ap.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await R(ap.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uS(){return{...aS}}function dS(){return{...cS}}async function cp(){return Io||(Io=await lS()?uS():dS(),Io)}var Io,aS,cS,lp=w(()=>{"use strict";Me();Io=null,aS={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},cS={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(lS,"isClaudeEnvironment");l(uS,"getClaudeAgent");l(dS,"getTerminalAgent");l(cp,"detect")});import wr from"node:fs/promises";var Qa,up,dp=w(()=>{"use strict";F();Qa=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await wr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await wr.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await wr.readdir(e)}async fileExists(e){try{return await wr.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await wr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
339
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Oe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=x.generateProjectId(e),s=x.getGlobalProjectPath(n),o=x.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Oe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await x.hasLegacyStructure(e))return!1;if(!await x.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=x.getGlobalProjectPath(s.projectId);try{return(await Ln.readdir(oS.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:x.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ys(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=x.generateProjectId(e);return{projectId:n,dataPath:x.getDisplayPath(x.getGlobalProjectPath(n))}}},iS=new Ka,$=iS});import Ao from"node:fs/promises";import Xa from"node:path";var Ya,op,ip=w(()=>{"use strict";wt();ke();F();Ya=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Ao.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Ao.readFile(Xa.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Xa.join(this.agentsPath,`${e}.md`),n=await Ao.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Xa.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
340
+ `;await Ao.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},op=Ya});import ap from"node:path";async function lS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await R(ap.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await R(ap.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uS(){return{...aS}}function dS(){return{...cS}}async function cp(){return Io||(Io=await lS()?uS():dS(),Io)}var Io,aS,cS,lp=w(()=>{"use strict";Me();Io=null,aS={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},cS={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(lS,"isClaudeEnvironment");l(uS,"getClaudeAgent");l(dS,"getTerminalAgent");l(cp,"detect")});import kr from"node:fs/promises";var Qa,up,dp=w(()=>{"use strict";F();Qa=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await kr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await kr.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await kr.readdir(e)}async fileExists(e){try{return await kr.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await kr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
341
341
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
342
342
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
343
343
 
@@ -382,7 +382,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
382
382
 
383
383
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
384
384
 
385
- Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},up=Qa});var mS,Ro,ws,pp=w(()=>{"use strict";ip();rn();lp();dp();vo();mS=["claude"],Ro=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new op}async initialize(){return this.agent?this.agent:await np.execute(async()=>{if(this.agentInfo=await cp(),!this.agentInfo?.isSupported)throw gr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mS.includes(e))throw gr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new up,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
385
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},up=Qa});var mS,Ro,ws,pp=w(()=>{"use strict";ip();rn();lp();dp();vo();mS=["claude"],Ro=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new op}async initialize(){return this.agent?this.agent:await np.execute(async()=>{if(this.agentInfo=await cp(),!this.agentInfo?.isSupported)throw fr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mS.includes(e))throw fr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new up,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
386
386
  AGENTIC EXECUTION:
387
387
  - Read: templates/agentic/orchestrator.md
388
388
  - Analyze task: "${e}"
@@ -390,14 +390,14 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
390
390
  - Claude decides which agent(s) to use
391
391
  - Always prefer specialists over generalist
392
392
  - Fragment complex tasks into subtasks
393
- `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},ws=new Ro});var Do,jo,mp=w(()=>{"use strict";Do=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},jo=new Do});import gp from"node:path";var gS,fS,kr,fp=w(()=>{"use strict";oe();Me();gS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],fS=`# Changelog
393
+ `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},ws=new Ro});var Do,jo,mp=w(()=>{"use strict";Do=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},jo=new Do});import gp from"node:path";var gS,fS,Sr,fp=w(()=>{"use strict";oe();Me();gS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],fS=`# Changelog
394
394
 
395
395
  All notable changes to this project will be documented in this file.
396
396
 
397
397
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
398
398
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
399
- `,kr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of gS){let s=gp.join(this.projectPath,n);if(await R(s)){let o=await Qe(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=gp.join(this.projectPath,e);return await zt(t,`${fS}
400
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Qe(t.filePath),s=e.date||us(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await zt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let s=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+s}
399
+ `,Sr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of gS){let s=gp.join(this.projectPath,n);if(await R(s)){let o=await Qe(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=gp.join(this.projectPath,e);return await Wt(t,`${fS}
400
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Qe(t.filePath),s=e.date||us(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await Wt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let s=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+s}
401
401
  ${a}`}return`${e.trimEnd()}
402
402
 
403
403
  ${s}`}insertMarkdownEntry(e,t,n){let s=this.formatMarkdownEntry(t,n),o=e.indexOf(`
@@ -407,18 +407,18 @@ ${a}`}return`${s}
407
407
 
408
408
  ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push("### Added"),n.push(`- ${e.description}`),n.push(""));return n.join(`
409
409
  `)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
410
- `)}}});import hS from"node:crypto";import $o from"node:fs/promises";import hp from"node:path";function yp(){return{version:$t,lastUpdated:"",checksums:{}}}var $t,Za,Je,Sr=w(()=>{"use strict";we();F();oe();ne();$t="1.0.0";l(yp,"getDefaultChecksums");Za=class{static{l(this,"IndexStorage")}getIndexPath(e){return hp.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $o.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==$t?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return yp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $o.readFile(e);return hS.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:$t,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await $o.readdir(t);await Promise.all(n.map(s=>$o.unlink(hp.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==$t?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==$t?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=A.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=A.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Je=new Za});var wp,yS,Mo,wS,kp=w(()=>{"use strict";Sr();wp=8e4,yS={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},Mo=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||wp,[c,u,d]=await Promise.all([Je.readIndex(t),Je.readDomains(t),Je.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let B=d.domainIndex[D]||[];for(let Pe of B)p.add(Pe)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let B of D)p.add(B)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,B)=>B.score-D.score);let f=0,k=[];for(let D of g){let B=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+B>a||k.length>=s)break;k.push(D),f+=B}let S=Math.ceil(c.relevantFiles.reduce((D,B)=>D+B.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(yS))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Je.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Je.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Je.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||wp,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},wS=new Mo});import{execFile as kS}from"node:child_process";import ec from"node:fs/promises";import Sp from"node:os";import tc from"node:path";import{promisify as SS}from"node:util";function PS(){let r=le("mcp-config.json");if(!r)return{mcpServers:{context7:nc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:nc}}}}function Pp(){return PS().mcpServers?.context7||nc}function bp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?tc.join(Sp.tmpdir(),"prjct-context7-test","mcp.json"):tc.join(Sp.homedir(),".claude","mcp.json")}async function Cp(r){try{let e=await ec.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function vS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Pp(),e=[...r.args||[],"--help"];await bS(r.command||"npx",e,{timeout:15e3})}var bS,nc,CS,ks,sc,vp,on,Ss=w(()=>{"use strict";Jt();F();bS=SS(kS),nc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},CS=300*1e3,ks=null;l(PS,"parseTemplateConfig");l(Pp,"getContext7Config");l(bp,"getConfigPath");l(Cp,"readConfig");l(vS,"runSmokeCheck");sc=class{static{l(this,"Context7Service")}async install(){let e=bp(),t=tc.dirname(e);await ec.mkdir(t,{recursive:!0});let n=await Cp(e),s=n.mcpServers||{};return s.context7=Pp(),n.mcpServers=s,await ec.writeFile(e,JSON.stringify(n,null,2),"utf-8"),ks=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(ks&&Date.now()-ks.at<CS)return ks.status;let e=bp(),s=((await Cp(e)).mcpServers||{}).context7;if(!s?.command||!Array.isArray(s.args)||s.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await vS();let o={installed:!0,verified:!0,configPath:e};return ks={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return ks={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},vp=new sc,on=vp});import xp from"node:path";var rc,Oo,xS,Tp=w(()=>{"use strict";Sr();oe();rc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Oo=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of rc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=xp.dirname(i.path);n.get(u).add(`**/${xp.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=rc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of rc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:$t,projectId:e,domains:t,discoveredAt:s};await Je.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:$t,lastUpdate:s,fileCategories:n,domainIndex:i};await Je.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Je.readDomains(e),Je.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Je.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Je.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:$t,lastUpdate:b(),fileCategories:u,domainIndex:d};await Je.writeCategories(e,m)}return o}},xS=new Oo});import oc from"node:path";var ic,TS,ES,Fo,Ep,ac=w(()=>{"use strict";ic=30,TS=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],ES=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],Fo=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=ic){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=oc.basename(e.path);for(let n of TS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=oc.basename(e.path);for(let s of ES)if(s.test(t))return 15;let n=oc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},Ep=new Fo});function bs(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return AS[r]}var te,cc,lc,_o,AS,Mt,Ap,an=w(()=>{"use strict";te={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],_o=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],AS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bs,"getTimeout");Mt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Ap={HISTORY_MAX:100}});function uc(r,e){return{...sr[r],...e}}function No(r,e,t){return{message:r,hint:e,...t}}var Lo=w(()=>{"use strict";Zr();Zr();l(uc,"getError");l(No,"createError")});import{execSync as dc}from"node:child_process";var Uo,pc,Ho,Cs,Go=w(()=>{"use strict";Lo();Uo={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},pc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Uo[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Uo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Ho(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Uo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
410
+ `)}}});import hS from"node:crypto";import $o from"node:fs/promises";import hp from"node:path";function yp(){return{version:Mt,lastUpdated:"",checksums:{}}}var Mt,Za,Je,br=w(()=>{"use strict";ke();F();oe();ne();Mt="1.0.0";l(yp,"getDefaultChecksums");Za=class{static{l(this,"IndexStorage")}getIndexPath(e){return hp.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $o.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Mt?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return yp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $o.readFile(e);return hS.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Mt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await $o.readdir(t);await Promise.all(n.map(s=>$o.unlink(hp.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Mt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Mt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=A.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=A.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Je=new Za});var wp,yS,Mo,wS,kp=w(()=>{"use strict";br();wp=8e4,yS={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},Mo=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||wp,[c,u,d]=await Promise.all([Je.readIndex(t),Je.readDomains(t),Je.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let B=d.domainIndex[D]||[];for(let ve of B)p.add(ve)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let B of D)p.add(B)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,B)=>B.score-D.score);let f=0,k=[];for(let D of g){let B=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+B>a||k.length>=s)break;k.push(D),f+=B}let S=Math.ceil(c.relevantFiles.reduce((D,B)=>D+B.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(yS))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Je.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Je.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Je.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||wp,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},wS=new Mo});import{execFile as kS}from"node:child_process";import ec from"node:fs/promises";import Sp from"node:os";import tc from"node:path";import{promisify as SS}from"node:util";function PS(){let r=le("mcp-config.json");if(!r)return{mcpServers:{context7:nc}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:nc}}}}function Pp(){return PS().mcpServers?.context7||nc}function bp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?tc.join(Sp.tmpdir(),"prjct-context7-test","mcp.json"):tc.join(Sp.homedir(),".claude","mcp.json")}async function Cp(r){try{let e=await ec.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function vS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Pp(),e=[...r.args||[],"--help"];await bS(r.command||"npx",e,{timeout:15e3})}var bS,nc,CS,ks,sc,vp,on,Ss=w(()=>{"use strict";Jt();F();bS=SS(kS),nc={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},CS=300*1e3,ks=null;l(PS,"parseTemplateConfig");l(Pp,"getContext7Config");l(bp,"getConfigPath");l(Cp,"readConfig");l(vS,"runSmokeCheck");sc=class{static{l(this,"Context7Service")}async install(){let e=bp(),t=tc.dirname(e);await ec.mkdir(t,{recursive:!0});let n=await Cp(e),s=n.mcpServers||{};return s.context7=Pp(),n.mcpServers=s,await ec.writeFile(e,JSON.stringify(n,null,2),"utf-8"),ks=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(ks&&Date.now()-ks.at<CS)return ks.status;let e=bp(),s=((await Cp(e)).mcpServers||{}).context7;if(!s?.command||!Array.isArray(s.args)||s.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await vS();let o={installed:!0,verified:!0,configPath:e};return ks={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return ks={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},vp=new sc,on=vp});import xp from"node:path";var rc,Oo,xS,Tp=w(()=>{"use strict";br();oe();rc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Oo=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of rc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=xp.dirname(i.path);n.get(u).add(`**/${xp.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=rc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of rc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:Mt,projectId:e,domains:t,discoveredAt:s};await Je.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Mt,lastUpdate:s,fileCategories:n,domainIndex:i};await Je.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Je.readDomains(e),Je.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Je.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Je.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Mt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Je.writeCategories(e,m)}return o}},xS=new Oo});import oc from"node:path";var ic,TS,ES,Fo,Ep,ac=w(()=>{"use strict";ic=30,TS=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],ES=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],Fo=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=ic){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=oc.basename(e.path);for(let n of TS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=oc.basename(e.path);for(let s of ES)if(s.test(t))return 15;let n=oc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},Ep=new Fo});function bs(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return AS[r]}var te,cc,lc,_o,AS,Ot,Ap,an=w(()=>{"use strict";te={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],_o=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],AS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bs,"getTimeout");Ot={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Ap={HISTORY_MAX:100}});function uc(r,e){return{...rr[r],...e}}function No(r,e,t){return{message:r,hint:e,...t}}var Lo=w(()=>{"use strict";Zr();Zr();l(uc,"getError");l(No,"createError")});import{execSync as dc}from"node:child_process";var Uo,pc,Ho,Cs,Go=w(()=>{"use strict";Lo();Uo={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},pc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Uo[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Uo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Ho(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Uo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
411
411
  `);throw new Ho({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
412
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Uo),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=dc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:No(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return dc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return dc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:No(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Ho=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Cs=new pc});import{exec as IS}from"node:child_process";import{promisify as RS}from"node:util";var Qj,Ip=w(()=>{"use strict";an();Go();Qj=RS(IS)});var qt,mc,kt,Cn=w(()=>{"use strict";Dt();oe();ne();qt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},mc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),s=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return A.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new mc});var zo,lt,gc=w(()=>{"use strict";wt();Cn();ne();zo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;L.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?L.query(n,"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(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?L.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;L.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 L.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=qt.MEMORY_MAX_ENTRIES)return 0;let s=n-qt.MEMORY_MAX_ENTRIES,o=L.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);kt.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&&L.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},lt=new zo});var Rp=w(()=>{"use strict";we();Me()});import{execSync as DS}from"node:child_process";import jS from"node:fs/promises";import Wo from"node:path";function $S(r){return r.trim().toLowerCase()}async function MS(r){try{return await jS.access(r),!0}catch{return!1}}function OS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=Dn.resolve("prjct-cli/package.json");return Wo.dirname(e)}catch{return null}}function FS(){let r=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(r)return r;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return DS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim().replace(/\r?\n/g,"")}catch{return null}}function _S(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ce}function NS(){let r=[],e=OS();e&&r.push({source:"package-resolve",root:e});let t=FS();return t&&r.push({source:"npm-root-g",root:Wo.join(t,"prjct-cli")}),r.push({source:"local-dev",root:_S()}),r}function LS(){let e=kn("commands/").filter(t=>t.endsWith(".md")).map(t=>Wo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function hc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var br,fc,yc,wc=w(()=>{"use strict";Jt();Bt();br=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l($S,"normalizeCommand");l(MS,"fileExists");l(OS,"getPackageResolveRoot");l(FS,"getNpmGlobalRoot");l(_S,"getLocalDevRoot");l(NS,"getCandidateRoots");l(LS,"getCatalogFromTemplates");fc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return LS()}validatePCommand(e){let t=$S(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new br("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new br(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);for(let n of NS()){let s=Wo.join(n.root,"templates","commands",`${t.command}.md`);if(await MS(s))return{command:t.command,templatePath:s,source:n.source}}throw new br("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(hc,"isPCommandResolveError");yc=new fc});import{createHash as US}from"node:crypto";import jp from"node:fs/promises";import Sc from"node:path";function Un(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function GS(r){let e=Sc.resolve(r);return US("sha256").update(e).digest("hex").slice(0,16)}function Vo(r){let e=le(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function zS(r){let e=[],t=[r];for(;t.length>0&&e.length<Dp;){let n=t.pop();if(!n)break;let s=await jp.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=Dp)break;let i=Sc.join(n,o.name);if(o.isDirectory()){HS.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function WS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Sc.relative(r,d),p=await jp.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(s=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return s&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function VS(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.name)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}function BS(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.issue)}::${Un(n.file)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}var HS,Dp,kc,$p,Mp,bc=w(()=>{"use strict";Jt();ne();HS=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),Dp=400;l(Un,"normalizeKey");l(GS,"repoHash");l(Vo,"parseBaselineFile");l(zS,"listSourceFiles");l(WS,"detectRepoRules");l(VS,"dedupePatterns");l(BS,"dedupeAntiPatterns");kc=class{static{l(this,"PatternExtractor")}async extract(e){let t=GS(e.projectPath),n=await zS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Un(p),f=Vo(`baseline/patterns/${g}.json`),k=Vo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",language:p,source:"baseline",confidence:S.confidence??.8})))}for(let p of e.frameworks){let g=Un(p),f=Vo(`baseline/patterns/${g}.json`),k=Vo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",framework:p,source:"baseline",confidence:S.confidence??.82}))),e.context7Verified&&s.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await WS(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=VS([...s,...i.patterns,...a]),d=BS([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},$p=new kc,Mp=$p});import{exec as qS}from"node:child_process";import{promisify as KS}from"node:util";var $0,Op=w(()=>{"use strict";Sr();oe();ac();$0=KS(qS)});import Hn from"chalk";var Fp,XS,YS,Ot,_p=w(()=>{"use strict";Ze();Fp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],XS=80,YS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Fp,speed:XS},cli:{header:l(()=>`${Hn.cyan.bold("\u26A1")} ${Hn.cyan("prjct")}`,"header"),footer:l(()=>Hn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Hn.cyan("\u26A1")} ${Hn.cyan("prjct")} ${Hn.cyan(Fp[r%10])} ${Hn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>ro(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>ro(r).signature,"getSignature")},Ot=YS});import se from"chalk";function eb(){return QS[ZS]}var W0,Cc,QS,ZS,Gn,Ps,Pc,St,Pn,tb,nb,h,zn=w(()=>{"use strict";_p();an();Lo();Lo();W0=Ot.spinner.frames,Cc=Ot.spinner.speed,QS={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ZS="compact";l(eb,"getTierConfig");Gn={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Ps=null,Pc=0,St=!1,Pn=l((r,e)=>{let t=e??(eb().maxCharsPerLine||Mt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),tb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Mt.CLEAR_WIDTH)}\r`):!0,"clear"),nb={start(){return St||console.log(Ot.cli.header()),this},end(){return St||console.log(Ot.cli.footer()),this},spin(r){return St?this:(this.stop(),process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Pc++,Pn(r,Mt.SPINNER_MSG))}`)},Cc),this):(process.stdout.write(`${Ot.cli.spin(0,Pn(r,Mt.SPINNER_MSG))}
413
- `),this))},done(r,e){if(this.stop(),!St){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=se.dim(` [${n.join(" | ")}]`))}console.log(`${Gn.success} ${Pn(r,Mt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gn.fail} ${Pn(r,Mt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?uc(r):r;return console.error(),console.error(`${Gn.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),St||console.log(`${Gn.warn} ${Pn(r,Mt.WARN_MSG)}`),this},info(r){return this.stop(),St||console.log(`${Gn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Gn.debug} ${se.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),St)return this;let t=e.bullet||Gn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),St||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(s)),console.log(se.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),St)return this;let t=e.split(`
412
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Uo),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=dc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:No(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return dc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return dc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:No(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Ho=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Cs=new pc});import{exec as IS}from"node:child_process";import{promisify as RS}from"node:util";var Zj,Ip=w(()=>{"use strict";an();Go();Zj=RS(IS)});var qt,mc,kt,Cn=w(()=>{"use strict";Dt();oe();ne();qt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},mc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),s=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return A.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new mc});var zo,lt,gc=w(()=>{"use strict";wt();Cn();ne();zo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;L.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?L.query(n,"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(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?L.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;L.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 L.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=qt.MEMORY_MAX_ENTRIES)return 0;let s=n-qt.MEMORY_MAX_ENTRIES,o=L.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);kt.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&&L.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},lt=new zo});var Rp=w(()=>{"use strict";ke();Me()});import{execSync as DS}from"node:child_process";import jS from"node:fs/promises";import Wo from"node:path";function $S(r){return r.trim().toLowerCase()}async function MS(r){try{return await jS.access(r),!0}catch{return!1}}function OS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=Dn.resolve("prjct-cli/package.json");return Wo.dirname(e)}catch{return null}}function FS(){let r=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(r)return r;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return DS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim().replace(/\r?\n/g,"")}catch{return null}}function _S(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ce}function NS(){let r=[],e=OS();e&&r.push({source:"package-resolve",root:e});let t=FS();return t&&r.push({source:"npm-root-g",root:Wo.join(t,"prjct-cli")}),r.push({source:"local-dev",root:_S()}),r}function LS(){let e=kn("commands/").filter(t=>t.endsWith(".md")).map(t=>Wo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function hc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var Cr,fc,yc,wc=w(()=>{"use strict";Jt();$t();Cr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l($S,"normalizeCommand");l(MS,"fileExists");l(OS,"getPackageResolveRoot");l(FS,"getNpmGlobalRoot");l(_S,"getLocalDevRoot");l(NS,"getCandidateRoots");l(LS,"getCatalogFromTemplates");fc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return LS()}validatePCommand(e){let t=$S(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new Cr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new Cr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);for(let n of NS()){let s=Wo.join(n.root,"templates","commands",`${t.command}.md`);if(await MS(s))return{command:t.command,templatePath:s,source:n.source}}throw new Cr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(hc,"isPCommandResolveError");yc=new fc});import{createHash as US}from"node:crypto";import jp from"node:fs/promises";import Sc from"node:path";function Un(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function GS(r){let e=Sc.resolve(r);return US("sha256").update(e).digest("hex").slice(0,16)}function Vo(r){let e=le(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function zS(r){let e=[],t=[r];for(;t.length>0&&e.length<Dp;){let n=t.pop();if(!n)break;let s=await jp.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=Dp)break;let i=Sc.join(n,o.name);if(o.isDirectory()){HS.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function WS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Sc.relative(r,d),p=await jp.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(s=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return s&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function VS(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.name)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}function BS(r){let e=new Set,t=[];for(let n of r){let s=`${Un(n.issue)}::${Un(n.file)}::${Un(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}var HS,Dp,kc,$p,Mp,bc=w(()=>{"use strict";Jt();ne();HS=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),Dp=400;l(Un,"normalizeKey");l(GS,"repoHash");l(Vo,"parseBaselineFile");l(zS,"listSourceFiles");l(WS,"detectRepoRules");l(VS,"dedupePatterns");l(BS,"dedupeAntiPatterns");kc=class{static{l(this,"PatternExtractor")}async extract(e){let t=GS(e.projectPath),n=await zS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Un(p),f=Vo(`baseline/patterns/${g}.json`),k=Vo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",language:p,source:"baseline",confidence:S.confidence??.8})))}for(let p of e.frameworks){let g=Un(p),f=Vo(`baseline/patterns/${g}.json`),k=Vo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...k.map(S=>({...S,file:S.file||"multiple",framework:p,source:"baseline",confidence:S.confidence??.82}))),e.context7Verified&&s.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await WS(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=VS([...s,...i.patterns,...a]),d=BS([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},$p=new kc,Mp=$p});import{exec as qS}from"node:child_process";import{promisify as KS}from"node:util";var M0,Op=w(()=>{"use strict";br();oe();ac();M0=KS(qS)});import Hn from"chalk";var Fp,XS,YS,Ft,_p=w(()=>{"use strict";Ze();Fp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],XS=80,YS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Fp,speed:XS},cli:{header:l(()=>`${Hn.cyan.bold("\u26A1")} ${Hn.cyan("prjct")}`,"header"),footer:l(()=>Hn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Hn.cyan("\u26A1")} ${Hn.cyan("prjct")} ${Hn.cyan(Fp[r%10])} ${Hn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>ro(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>ro(r).signature,"getSignature")},Ft=YS});import se from"chalk";function eb(){return QS[ZS]}var V0,Cc,QS,ZS,Gn,Ps,Pc,St,Pn,tb,nb,h,zn=w(()=>{"use strict";_p();an();Lo();Lo();V0=Ft.spinner.frames,Cc=Ft.spinner.speed,QS={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ZS="compact";l(eb,"getTierConfig");Gn={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Ps=null,Pc=0,St=!1,Pn=l((r,e)=>{let t=e??(eb().maxCharsPerLine||Ot.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),tb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ot.CLEAR_WIDTH)}\r`):!0,"clear"),nb={start(){return St||console.log(Ft.cli.header()),this},end(){return St||console.log(Ft.cli.footer()),this},spin(r){return St?this:(this.stop(),process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Pc++,Pn(r,Ot.SPINNER_MSG))}`)},Cc),this):(process.stdout.write(`${Ft.cli.spin(0,Pn(r,Ot.SPINNER_MSG))}
413
+ `),this))},done(r,e){if(this.stop(),!St){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=se.dim(` [${n.join(" | ")}]`))}console.log(`${Gn.success} ${Pn(r,Ot.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gn.fail} ${Pn(r,Ot.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?uc(r):r;return console.error(),console.error(`${Gn.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),St||console.log(`${Gn.warn} ${Pn(r,Ot.WARN_MSG)}`),this},info(r){return this.stop(),St||console.log(`${Gn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Gn.debug} ${se.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),St)return this;let t=e.bullet||Gn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),St||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(s)),console.log(se.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),St)return this;let t=e.split(`
414
414
  `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(se.dim(`\u250C${s}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(r.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),St?this:(console.log(`
415
- ${se.bold(r)}`),console.log(se.dim("\u2500".repeat(r.length))),this)},stop(){return Ps&&(clearInterval(Ps),Ps=null,tb()),this},step(r,e,t){if(St)return this;this.stop();let n=se.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Pc++,`${n} ${Pn(t,Mt.STEP_MSG)}`)}`)},Cc),this):(process.stdout.write(`${Ot.cli.spin(0,`${n} ${Pn(t,Mt.STEP_MSG)}`)}
416
- `),this)},progress(r,e,t){if(St)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=se.cyan("\u2588".repeat(s))+se.dim("\u2591".repeat(o)),a=t?` ${Pn(t,Mt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Pc++,`[${i}] ${n}%${a}`)}`)},Cc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${n}%${a}`)}
417
- `),this)}},h=nb});function Np(r,e){let t=[];Cr("Languages",r.languages,e.languages,t),Cr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Cr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let n=r.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Cr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Cr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function vc(r){if(!r.hasChanges)return`## Analysis Diff
415
+ ${se.bold(r)}`),console.log(se.dim("\u2500".repeat(r.length))),this)},stop(){return Ps&&(clearInterval(Ps),Ps=null,tb()),this},step(r,e,t){if(St)return this;this.stop();let n=se.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Pc++,`${n} ${Pn(t,Ot.STEP_MSG)}`)}`)},Cc),this):(process.stdout.write(`${Ft.cli.spin(0,`${n} ${Pn(t,Ot.STEP_MSG)}`)}
416
+ `),this)},progress(r,e,t){if(St)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=se.cyan("\u2588".repeat(s))+se.dim("\u2591".repeat(o)),a=t?` ${Pn(t,Ot.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ft.cli.spin(Pc++,`[${i}] ${n}%${a}`)}`)},Cc),this):(process.stdout.write(`${Ft.cli.spin(0,`[${i}] ${n}%${a}`)}
417
+ `),this)}},h=nb});function Np(r,e){let t=[];Pr("Languages",r.languages,e.languages,t),Pr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Pr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let n=r.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Pr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Pr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function vc(r){if(!r.hasChanges)return`## Analysis Diff
418
418
 
419
419
  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 n of r.items){let s=n.type==="added"?"+":n.type==="removed"?"-":"~",o=n.type==="changed"?`${n.before} \u2192 ${n.after}`:n.after??n.before??"";e.push(`| ${s} | ${n.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(`
420
420
  `)}function Lp(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(`
421
- `)}function Cr(r,e,t,n){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||n.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:r,type:"removed",before:i})}var xc=w(()=>{"use strict";l(Np,"generateAnalysisDiff");l(vc,"formatAnalysisDiffMd");l(Lp,"formatAnalysisDiffText");l(Cr,"diffStringArray")});function rb(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(sb.has(r)||r.includes("prjct"))return{level:vs.debug,name:"debug"};let e=vs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Bo(r,e,t){return Up>=r?(...n)=>console[t](e,...n):ib}var vs,sb,Up,ob,ib,ab,U,vn=w(()=>{"use strict";vs={error:0,warn:1,info:2,debug:3},sb=new Set(["1","true","*"]);l(rb,"getLogLevel");({level:Up,name:ob}=rb()),ib=l(()=>{},"noop");l(Bo,"createLogMethod");ab={error:Bo(vs.error,"[prjct:error]","error"),warn:Bo(vs.warn,"[prjct:warn]","warn"),info:Bo(vs.info,"[prjct:info]","log"),debug:Bo(vs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Up>=0,"isEnabled"),level:l(()=>ob,"level")},U=ab});var Jo,cb,Hp=w(()=>{"use strict";rn();ne();aa();an();vn();Jo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Ap.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Qr.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Qr.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",Y(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},cb=new Jo});var qo,Ko,Gp=w(()=>{"use strict";we();oe();Me();qo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await Gt(t,[])??[];n.push(e),await $n(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await Gt(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await $n(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await $n(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await Gt(t,null)}},Ko=new qo});var Tc=w(()=>{"use strict";Hp();Gp()});var Ft,Xo=w(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Ue,Kt=w(()=>{"use strict";Tc();Xo();oe();ne();Ue=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({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 n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await Ko.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as ub}from"node:crypto";var Ec,He,Pr=w(()=>{"use strict";Pa();xc();oe();Kt();Ec=class extends Ue{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ca.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.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 n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ca.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}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 n=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),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:Np(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 n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await dd(s,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 ub("sha256").update(JSON.stringify(t)).digest("hex")}},He=new Ec});var Ac,qe,vr=w(()=>{"use strict";Dt();xa();oe();Cn();Kt();Ac=class extends Ue{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",gd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=gn(qt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},qe=new Ac});var Ic,Wn,Yo=w(()=>{"use strict";bo();oe();Kt();Ic=class extends Ue{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Yd)}getDefault(){return{...Qd}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let D=S.findIndex(B=>B.agentName===I);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Zd(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},Wn=new Ic});import at from"node:fs/promises";import pe from"node:path";async function xr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await db(s,o,i),A.getDb(r);for(let{filename:a,key:c}of jc){let u=pe.join(s,a),d=await Vn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),zp(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Dc){let u=pe.join(o,a),d=await Vn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Wp(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await kb(r,o,t),await Sb(r,o,t),await bb(r,i,t),await Cb(r,i,t),t.errors.length===0&&await Pb(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function db(r,e,t){let n=pe.join(r,"backup");return await at.mkdir(n,{recursive:!0}),await at.mkdir(pe.join(n,"index"),{recursive:!0}),await at.mkdir(pe.join(n,"memory"),{recursive:!0}),await Rc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Rc(e,pe.join(n,"index")),await Rc(t,pe.join(n,"memory")),n}async function Rc(r,e,t){try{let n=await at.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=pe.join(r,s.name),i=pe.join(e,s.name);await at.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function zp(r,e,t){switch(e){case"state":pb(r,t);break;case"queue":mb(r,t);break;case"ideas":gb(r,t);break;case"shipped":fb(r,t);break;case"metrics":hb(r,t);break;case"analysis":yb(r,t);break}}function pb(r,e){let t=A.getDb(r),n=t.prepare(`
421
+ `)}function Pr(r,e,t,n){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||n.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:r,type:"removed",before:i})}var xc=w(()=>{"use strict";l(Np,"generateAnalysisDiff");l(vc,"formatAnalysisDiffMd");l(Lp,"formatAnalysisDiffText");l(Pr,"diffStringArray")});function rb(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(sb.has(r)||r.includes("prjct"))return{level:vs.debug,name:"debug"};let e=vs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Bo(r,e,t){return Up>=r?(...n)=>console[t](e,...n):ib}var vs,sb,Up,ob,ib,ab,U,vn=w(()=>{"use strict";vs={error:0,warn:1,info:2,debug:3},sb=new Set(["1","true","*"]);l(rb,"getLogLevel");({level:Up,name:ob}=rb()),ib=l(()=>{},"noop");l(Bo,"createLogMethod");ab={error:Bo(vs.error,"[prjct:error]","error"),warn:Bo(vs.warn,"[prjct:warn]","warn"),info:Bo(vs.info,"[prjct:info]","log"),debug:Bo(vs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Up>=0,"isEnabled"),level:l(()=>ob,"level")},U=ab});var Jo,cb,Hp=w(()=>{"use strict";rn();ne();aa();an();vn();Jo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Ap.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Qr.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Qr.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",Y(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},cb=new Jo});var qo,Ko,Gp=w(()=>{"use strict";ke();oe();Me();qo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await zt(t,[])??[];n.push(e),await $n(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await zt(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await $n(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await $n(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await zt(t,null)}},Ko=new qo});var Tc=w(()=>{"use strict";Hp();Gp()});var _t,Xo=w(()=>{"use strict";_t=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var He,Kt=w(()=>{"use strict";Tc();Xo();oe();ne();He=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new _t({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 n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await Ko.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as ub}from"node:crypto";var Ec,Ge,vr=w(()=>{"use strict";Pa();xc();oe();Kt();Ec=class extends He{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ca.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.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 n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ca.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}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 n=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),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:Np(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 n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await dd(s,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 ub("sha256").update(JSON.stringify(t)).digest("hex")}},Ge=new Ec});var Ac,qe,xr=w(()=>{"use strict";Dt();xa();oe();Cn();Kt();Ac=class extends He{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",gd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=gn(qt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},qe=new Ac});var Ic,Wn,Yo=w(()=>{"use strict";bo();oe();Kt();Ic=class extends He{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Yd)}getDefault(){return{...Qd}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let D=S.findIndex(B=>B.agentName===I);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Zd(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},Wn=new Ic});import at from"node:fs/promises";import pe from"node:path";async function Tr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await db(s,o,i),A.getDb(r);for(let{filename:a,key:c}of jc){let u=pe.join(s,a),d=await Vn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),zp(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Dc){let u=pe.join(o,a),d=await Vn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Wp(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await kb(r,o,t),await Sb(r,o,t),await bb(r,i,t),await Cb(r,i,t),t.errors.length===0&&await Pb(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function db(r,e,t){let n=pe.join(r,"backup");return await at.mkdir(n,{recursive:!0}),await at.mkdir(pe.join(n,"index"),{recursive:!0}),await at.mkdir(pe.join(n,"memory"),{recursive:!0}),await Rc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Rc(e,pe.join(n,"index")),await Rc(t,pe.join(n,"memory")),n}async function Rc(r,e,t){try{let n=await at.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=pe.join(r,s.name),i=pe.join(e,s.name);await at.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function zp(r,e,t){switch(e){case"state":pb(r,t);break;case"queue":mb(r,t);break;case"ideas":gb(r,t);break;case"shipped":fb(r,t);break;case"metrics":hb(r,t);break;case"analysis":yb(r,t);break}}function pb(r,e){let t=A.getDb(r),n=t.prepare(`
422
422
  INSERT OR REPLACE INTO tasks
423
423
  (id, description, type, status, parent_description, branch, linear_id,
424
424
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -463,43 +463,43 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
463
463
  `);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function bb(r,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await at.readFile(n,"utf-8")).split(`
464
464
  `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Cb(r,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await at.readFile(n,"utf-8")).split(`
465
465
  `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Pb(r,e,t,n){let s=l(async(i,a)=>{try{await at.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of jc)await s(pe.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(pe.join(e,i),`cleanup:index/${i}`);await s(pe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(pe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Vn(r){try{let e=await at.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Qo(r){let e=x.getGlobalProjectPath(r),t=pe.join(e,"storage"),n=0;A.getDb(r);for(let{filename:u,key:d}of jc){let m=pe.join(t,u),p=await Vn(m);if(p!==null){A.setDoc(r,d,p),zp(r,d,p);try{await at.unlink(m)}catch{}n++}}let s=pe.join(e,"project.json"),o=await Vn(s);if(o!==null){A.setDoc(r,"project",o);try{await at.unlink(s)}catch{}n++}let i=pe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=pe.join(i,u);try{let p=(await at.readFile(d,"utf-8")).split(`
466
- `).filter(f=>f.trim());if(p.length===0){await at.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(I,D?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await at.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...Dc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await Vn(d);if(m===null)continue;let p=Dc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Wp(r,p.key,m));try{await at.unlink(d)}catch{}n++}return n}var jc,Dc,Zo=w(()=>{"use strict";we();F();ne();jc=[{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"}],Dc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(xr,"migrateJsonToSqlite");l(db,"createBackup");l(Rc,"copyFiles");l(zp,"populateNormalized");l(pb,"populateTasksFromState");l(mb,"populateQueueTasks");l(gb,"populateIdeas");l(fb,"populateShippedFeatures");l(hb,"populateMetricsDaily");l(yb,"populateAnalysis");l(Wp,"populateIndexTables");l(wb,"populateCategoriesIndex");l(kb,"migrateChecksums");l(Sb,"migrateFileScores");l(bb,"migrateEventsJsonl");l(Cb,"migrateLearningsJsonl");l(Pb,"cleanupJsonFiles");l(Vn,"readJsonSafe");l(Qo,"sweepLegacyJson")});var $c,xe,Tr=w(()=>{"use strict";Dt();mo();oe();Cn();Kt();$c=class extends Ue{static{l(this,"QueueStorage")}constructor(){super("queue.json",Gd)}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(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ge(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=gn(qt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.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:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},xe=new $c});var Mc,ut,Er=w(()=>{"use strict";Dt();Ra();oe();Cn();Kt();Mc=class extends Ue{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Od)}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((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ge(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=gn(qt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.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)>=n).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:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},ut=new Mc});var Ar,Oc,Bn,Fc=w(()=>{"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"}},Oc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Ar[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}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(n=>{switch(n){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. ${n}`}})}},Bn=new Oc});var _c,_,xs=w(()=>{"use strict";Dt();mo();oe();Fc();Cn();Kt();_c=class extends Ue{static{l(this,"StateStorage")}constructor(){super("state.json",Ud)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Bn.getCurrentState(e),s=Bn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.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 n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=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:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Nd.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
466
+ `).filter(f=>f.trim());if(p.length===0){await at.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(I,D?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await at.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...Dc.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await Vn(d);if(m===null)continue;let p=Dc.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Wp(r,p.key,m));try{await at.unlink(d)}catch{}n++}return n}var jc,Dc,Zo=w(()=>{"use strict";ke();F();ne();jc=[{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"}],Dc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Tr,"migrateJsonToSqlite");l(db,"createBackup");l(Rc,"copyFiles");l(zp,"populateNormalized");l(pb,"populateTasksFromState");l(mb,"populateQueueTasks");l(gb,"populateIdeas");l(fb,"populateShippedFeatures");l(hb,"populateMetricsDaily");l(yb,"populateAnalysis");l(Wp,"populateIndexTables");l(wb,"populateCategoriesIndex");l(kb,"migrateChecksums");l(Sb,"migrateFileScores");l(bb,"migrateEventsJsonl");l(Cb,"migrateLearningsJsonl");l(Pb,"cleanupJsonFiles");l(Vn,"readJsonSafe");l(Qo,"sweepLegacyJson")});var $c,fe,xs=w(()=>{"use strict";Dt();mo();oe();Cn();Kt();$c=class extends He{static{l(this,"QueueStorage")}constructor(){super("queue.json",Gd)}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(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ge(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=gn(qt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.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:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},fe=new $c});var Mc,ut,Er=w(()=>{"use strict";Dt();Ra();oe();Cn();Kt();Mc=class extends He{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Od)}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((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ge(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=gn(qt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.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)>=n).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:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},ut=new Mc});var Ar,Oc,Bn,Fc=w(()=>{"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"}},Oc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Ar[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}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(n=>{switch(n){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. ${n}`}})}},Bn=new Oc});var _c,_,Ts=w(()=>{"use strict";Dt();mo();oe();Fc();Cn();Kt();_c=class extends He{static{l(this,"StateStorage")}constructor(){super("state.json",Ud)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Bn.getCurrentState(e),s=Bn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.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 n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=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:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Nd.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
467
467
  ${f.join(`
468
- `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,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:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||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(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new _c});var Vp=w(()=>{"use strict";Tc();F()});var Nc,Lc,Uc=w(()=>{"use strict";ps();Kt();Nc=class extends Ue{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Wd,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Lc=new Nc});var Hc,ct,Gc=w(()=>{"use strict";ne();Hc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();L.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
468
+ `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,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:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||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(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new _c});var Vp=w(()=>{"use strict";Tc();F()});var Nc,Lc,Uc=w(()=>{"use strict";ps();Kt();Nc=class extends He{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Wd,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},Lc=new Nc});var Hc,ct,Gc=w(()=>{"use strict";ne();Hc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();L.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
469
469
  VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=L.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return s.id}getWorkflow(e,t){let n=L.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return L.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),L.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return L.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},ct=new Hc});function zc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Wc,Te,Ir=w(()=>{"use strict";Gc();ne();l(zc,"rowToRule");Wc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
470
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(n)){let d=o[c];d&&(i.push(`${d.column} = ?`),a.push(d.transform?d.transform(u):u))}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?zc(n):null}getRulesForCommand(e,t){let n=ct.getWorkflow(e,t);return!n||!n.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(zc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(zc)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Te=new Wc});var Xt=w(()=>{"use strict";Pr();Cn();ne();vr();Sr();Yo();Zo();Tr();Er();xs();Vp();Kt();Uc();Ir()});function vb(){return`\u26A1 prjct
470
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(n)){let d=o[c];d&&(i.push(`${d.column} = ?`),a.push(d.transform?d.transform(u):u))}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?zc(n):null}getRulesForCommand(e,t){let n=ct.getWorkflow(e,t);return!n||!n.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(zc)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(zc)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Te=new Wc});var Xt=w(()=>{"use strict";vr();Cn();ne();xr();br();Yo();Zo();xs();Er();Ts();Vp();Kt();Uc();Ir()});function vb(){return`\u26A1 prjct
471
471
 
472
472
  ---`}function xb(){return`---
473
473
  \u26A1 prjct \xB7 v${Fa()}`}function N(...r){return Tb(vb(),...r.filter(Boolean),xb())}function Vc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
474
474
  `)}function Bp(r,e=""){return`\`\`\`${e}
475
475
  ${r}
476
476
  \`\`\``}function Z(r,e,t=3){return`### ${r}
477
- ${e}`}function Ce(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
477
+ ${e}`}function Pe(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
478
478
  `)}function Bc(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
479
479
  > ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Jp(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
480
480
  ${Vc(t,n)}`}function qp(r){return r.length===0?"":`### Relevant Files
481
481
  ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
482
482
  `)}`}function Kp(r){return`### Rules
483
- ${Ce(r)}`}function ue(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
484
- ${Vc(e,t)}`}function dt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Vc(t,n)}function fe(r,e){return e?`## \u2705 ${r}
483
+ ${Pe(r)}`}function ue(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
484
+ ${Vc(e,t)}`}function dt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Vc(t,n)}function he(r,e){return e?`## \u2705 ${r}
485
485
  > ${e}`:`## \u2705 ${r}`}function Xp(r){return`> \u26A0\uFE0F **${r}**`}function Tb(...r){return r.filter(Boolean).join(`
486
486
 
487
- `)}function vt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ts=w(()=>{"use strict";Bt();l(vb,"mdHeader");l(xb,"mdFooter");l(N,"mdOutput");l(Vc,"mdTable");l(Bp,"mdCodeBlock");l(Z,"mdSection");l(Ce,"mdList");l(Bc,"mdTaskHeader");l(Jp,"mdSubtasks");l(qp,"mdRelevantFiles");l(Kp,"mdRules");l(ue,"mdNextSteps");l(dt,"mdStats");l(fe,"mdDone");l(Xp,"mdWarn");l(Tb,"mdJoin");l(vt,"mdActionRequired")});import Rr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Qp[r]||"idle",n=Bn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Yp[o]||o}));console.log(Rr.dim(`
488
- Next:`));for(let o of s){let i=Rr.cyan(o.cmd.padEnd(12));console.log(Rr.dim(` ${i} \u2192 ${o.desc}`))}}function ei(r){let e=Qp[r]||"idle";return Bn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Yp[n]||n}))}function Dr(r){let e=Bn.getStateInfo(r);console.log(Rr.dim(`\u{1F4CD} State: ${Rr.white(r.toUpperCase())} - ${e.description}`))}var Yp,Qp,Es=w(()=>{"use strict";Fc();Yp={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Qp={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(ei,"getNextSteps");l(Dr,"showStateInfo")});import tt from"node:path";async function Eb(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await R(tt.join(r,"pnpm-lock.yaml"))?"pnpm":await R(tt.join(r,"yarn.lock"))?"yarn":await R(tt.join(r,"bun.lockb"))||await R(tt.join(r,"bun.lock"))?"bun":(await R(tt.join(r,"package-lock.json")),"npm")}function Zp(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Ab(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function As(r,e){for(let s of Ib)if(await R(tt.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(Rb));if(n)return n}async function cn(r){for(let e of Db)if(await R(tt.join(r,e)))return e}async function ti(r){let e=tt.join(r,"package.json"),t=await Gt(e,null);if(t){let a=await Eb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Zp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Zp(a,"typecheck")}),c.test&&(u.test={tool:a,command:Ab(a)}),u.versionFile=await As(r),u.changelogFile=await cn(r),u}if(await R(tt.join(r,"pytest.ini"))){let a=await As(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Qe(tt.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await As(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"Cargo.toml"))){let a=await cn(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await R(tt.join(r,"go.mod"))){let a=await As(r),c=await cn(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await sn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await As(r,s),c=await cn(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"pom.xml"))){let a=await cn(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await R(tt.join(r,"gradlew"))&&(await R(tt.join(r,"build.gradle"))||await R(tt.join(r,"build.gradle.kts")))){let a=await cn(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await As(r),i=await cn(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Ib,Rb,Db,Jc=w(()=>{"use strict";Me();l(Eb,"detectPackageManager");l(Zp,"pmRun");l(Ab,"pmTest");Ib=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Rb=".csproj",Db=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(As,"detectVersionFile");l(cn,"detectChangelogFile");l(ti,"detectProjectCommands")});import*as re from"@clack/prompts";import Jn from"chalk";var ni,em,Is,tm=w(()=>{"use strict";zn();ni=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],em=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Is=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){re.intro(Jn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return re.outro(Jn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=ni.findIndex(n=>n.value===this.detectedType),t=await re.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ni.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?ni[e].value:void 0});return re.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await re.multiselect({message:"Which AI agents do you use?",options:em.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return re.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);re.note(e,"Detected stack");let t=await re.confirm({message:"Is this stack correct?",initialValue:!0});if(re.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await re.group({language:l(()=>re.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>re.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await re.group({verbosity:l(()=>re.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>re.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Jn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Jn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Jn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Jn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Jn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
489
- `);re.note(e,"Configuration Summary");let t=await re.confirm({message:"Generate configuration with these settings?",initialValue:!0});return re.isCancel(t)||!t?(re.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),s.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),s.push("codex")}catch{}}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,re.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ni.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return em.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import qc from"node:path";var jb,$b,si,Mb,pt,qn=w(()=>{"use strict";we();Dt();Me();jb="outcomes",$b="outcomes.jsonl",si=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return qc.join(t,jb)}getOutcomesPath(e){return qc.join(this.getOutcomesDir(e),$b)}async record(e,t){let n={...t,id:ge()},s=this.getOutcomesPath(e);return await Rt(qc.dirname(s)),await la(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await R(t))return[];let n=await Qe(t);return n.trim()?n.trim().split(`
487
+ `)}function vt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Es=w(()=>{"use strict";$t();l(vb,"mdHeader");l(xb,"mdFooter");l(N,"mdOutput");l(Vc,"mdTable");l(Bp,"mdCodeBlock");l(Z,"mdSection");l(Pe,"mdList");l(Bc,"mdTaskHeader");l(Jp,"mdSubtasks");l(qp,"mdRelevantFiles");l(Kp,"mdRules");l(ue,"mdNextSteps");l(dt,"mdStats");l(he,"mdDone");l(Xp,"mdWarn");l(Tb,"mdJoin");l(vt,"mdActionRequired")});import Rr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Qp[r]||"idle",n=Bn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Yp[o]||o}));console.log(Rr.dim(`
488
+ Next:`));for(let o of s){let i=Rr.cyan(o.cmd.padEnd(12));console.log(Rr.dim(` ${i} \u2192 ${o.desc}`))}}function ei(r){let e=Qp[r]||"idle";return Bn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Yp[n]||n}))}function Dr(r){let e=Bn.getStateInfo(r);console.log(Rr.dim(`\u{1F4CD} State: ${Rr.white(r.toUpperCase())} - ${e.description}`))}var Yp,Qp,As=w(()=>{"use strict";Fc();Yp={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Qp={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(ei,"getNextSteps");l(Dr,"showStateInfo")});import tt from"node:path";async function Eb(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await R(tt.join(r,"pnpm-lock.yaml"))?"pnpm":await R(tt.join(r,"yarn.lock"))?"yarn":await R(tt.join(r,"bun.lockb"))||await R(tt.join(r,"bun.lock"))?"bun":(await R(tt.join(r,"package-lock.json")),"npm")}function Zp(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Ab(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Is(r,e){for(let s of Ib)if(await R(tt.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(Rb));if(n)return n}async function cn(r){for(let e of Db)if(await R(tt.join(r,e)))return e}async function ti(r){let e=tt.join(r,"package.json"),t=await zt(e,null);if(t){let a=await Eb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Zp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Zp(a,"typecheck")}),c.test&&(u.test={tool:a,command:Ab(a)}),u.versionFile=await Is(r),u.changelogFile=await cn(r),u}if(await R(tt.join(r,"pytest.ini"))){let a=await Is(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Qe(tt.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Is(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"Cargo.toml"))){let a=await cn(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await R(tt.join(r,"go.mod"))){let a=await Is(r),c=await cn(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await sn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Is(r,s),c=await cn(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"pom.xml"))){let a=await cn(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await R(tt.join(r,"gradlew"))&&(await R(tt.join(r,"build.gradle"))||await R(tt.join(r,"build.gradle.kts")))){let a=await cn(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Is(r),i=await cn(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Ib,Rb,Db,Jc=w(()=>{"use strict";Me();l(Eb,"detectPackageManager");l(Zp,"pmRun");l(Ab,"pmTest");Ib=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Rb=".csproj",Db=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Is,"detectVersionFile");l(cn,"detectChangelogFile");l(ti,"detectProjectCommands")});import*as re from"@clack/prompts";import Jn from"chalk";var ni,em,Rs,tm=w(()=>{"use strict";zn();ni=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],em=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Rs=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){re.intro(Jn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return re.outro(Jn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=ni.findIndex(n=>n.value===this.detectedType),t=await re.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ni.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?ni[e].value:void 0});return re.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await re.multiselect({message:"Which AI agents do you use?",options:em.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return re.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);re.note(e,"Detected stack");let t=await re.confirm({message:"Is this stack correct?",initialValue:!0});if(re.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await re.group({language:l(()=>re.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>re.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await re.group({verbosity:l(()=>re.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>re.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Jn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Jn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Jn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Jn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Jn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
489
+ `);re.note(e,"Configuration Summary");let t=await re.confirm({message:"Generate configuration with these settings?",initialValue:!0});return re.isCancel(t)||!t?(re.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),s.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),s.push("codex")}catch{}}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,re.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ni.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return em.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import qc from"node:path";var jb,$b,si,Mb,pt,qn=w(()=>{"use strict";ke();Dt();Me();jb="outcomes",$b="outcomes.jsonl",si=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return qc.join(t,jb)}getOutcomesPath(e){return qc.join(this.getOutcomesDir(e),$b)}async record(e,t){let n={...t,id:ge()},s=this.getOutcomesPath(e);return await Rt(qc.dirname(s)),await la(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await R(t))return[];let n=await Qe(t);return n.trim()?n.trim().split(`
490
490
  `).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},Mb=new si,pt=Mb});var ri,Ob,Kc,nm=w(()=>{"use strict";qn();ri=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await pt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await pt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await pt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),I=this.parseDuration(k.estimatedDuration);return I===0?!1:Math.abs(S)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await pt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await pt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},Ob=new ri,Kc=Ob});var jr,oi,Xc,Yc=w(()=>{"use strict";ls();oe();jr=3,oi=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${jr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${jr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)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>=jr&&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((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.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(`
491
- `)}},Xc=new oi});var ii,sm,Qc=w(()=>{"use strict";Aa();Kt();oe();ii=class extends Ue{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...xd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:uo([t,...n.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,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:uo(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=Td(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Ed(5,s);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:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Ad(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}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},sm=new ii});var Zc=w(()=>{"use strict";tm();nm();Yc();qn();Qc()});import Yt from"chalk";function Fb(r){return rm[r.toLowerCase()]||rm.default}var rm,el,ai,om=w(()=>{"use strict";rm={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(Fb,"getIcon");el=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Yt.cyan(`
491
+ `)}},Xc=new oi});var ii,sm,Qc=w(()=>{"use strict";Aa();Kt();oe();ii=class extends He{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...xd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:uo([t,...n.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,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:uo(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=Td(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Ed(5,s);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:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Ad(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}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},sm=new ii});var Zc=w(()=>{"use strict";tm();nm();Yc();qn();Qc()});import Yt from"chalk";function Fb(r){return rm[r.toLowerCase()]||rm.default}var rm,el,ai,om=w(()=>{"use strict";rm={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(Fb,"getIcon");el=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Yt.cyan(`
492
492
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
493
493
  `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=Fb(t);console.log(Yt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Yt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Yt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Yt.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?Yt.green("\u2713"):Yt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Yt.dim(`(${n})`)}
494
494
  `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Yt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Yt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ai=new el});import Ke from"chalk";function _b(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%im.length;return im[t]}function Nb(r,e,t="\u25B6"){let n=Ke.dim(String(r+1).padStart(2)),o=_b(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ke.green("\u2713 Complete");break;case"in_progress":a=Ke.yellow(`${t} Working...`);break;case"pending":a=Ke.gray("\u25CB Pending");break;case"failed":a=Ke.red("\u2717 Failed");break;case"blocked":a=Ke.gray("\u2298 Blocked");break;default:a=Ke.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Lb(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ke.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ke.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Nb(t,r[t]));return e.push(""),e.join(`
495
495
  `)}function am(r){console.log(Lb(r))}var im,cm=w(()=>{"use strict";im=[Ke.cyan,Ke.magenta,Ke.yellow,Ke.blue,Ke.green,Ke.redBright,Ke.magentaBright,Ke.cyanBright];l(_b,"getDomainColor");l(Nb,"formatSubtaskLine");l(Lb,"renderSubtaskProgress");l(am,"printSubtaskProgress")});function Ub(r){return lm.includes(r)}async function Hb(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function Gb(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
496
- `)}var lm,zb,ci,um=w(()=>{"use strict";lm=["ship","feature","spec","cleanup","migrate"];l(Ub,"requiresReasoning");l(Hb,"reason");l(Gb,"formatPlan");zb={requiresReasoning:Ub,reason:Hb,formatPlan:Gb,REASONING_REQUIRED_COMMANDS:lm},ci=zb});import $r from"node:fs/promises";var tl,Wb,mt,nl=w(()=>{"use strict";wt();we();F();Xo();tl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ft({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await $r.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([$r.readFile(d,"utf-8"),$r.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await $r.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await $r.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Wb=new tl,mt=Wb});import{exec as Vb}from"node:child_process";import Ee from"node:fs/promises";import dm from"node:os";import xn from"node:path";import{promisify as Bb}from"node:util";function pm(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function sl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qb(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
496
+ `)}var lm,zb,ci,um=w(()=>{"use strict";lm=["ship","feature","spec","cleanup","migrate"];l(Ub,"requiresReasoning");l(Hb,"reason");l(Gb,"formatPlan");zb={requiresReasoning:Ub,reason:Hb,formatPlan:Gb,REASONING_REQUIRED_COMMANDS:lm},ci=zb});import $r from"node:fs/promises";var tl,Wb,mt,nl=w(()=>{"use strict";wt();ke();F();Xo();tl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new _t({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await $r.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([$r.readFile(d,"utf-8"),$r.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await $r.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await $r.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Wb=new tl,mt=Wb});import{exec as Vb}from"node:child_process";import Ee from"node:fs/promises";import dm from"node:os";import xn from"node:path";import{promisify as Bb}from"node:util";function pm(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function sl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qb(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
497
497
  `;return r.warnings.forEach(t=>{e+=` - ${t}
498
498
  `}),r.recommendations.length>0&&(e+=`
499
499
  Recommendations:
500
500
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
501
501
  `})),e}async function mm(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ee.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=pm(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ee.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ee.access(xn.dirname(i),Ee.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function gm(r){let e=[],t=[],n={};try{let{stdout:i}=await Jb("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
502
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=xn.join(r.projectPath,"package.json");try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ee.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${sl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function fm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ee.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ee.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(sl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ee.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function hm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ee.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ee.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ym(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ee.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=xn.join(dm.homedir(),".prjct-cli");try{await Ee.access(o,Ee.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ee.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function wm(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ee.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=xn.join(dm.homedir(),".prjct-cli/projects",o||"");try{await Ee.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function km(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ee.access(xn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ee.stat(xn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Sm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ee.access(s),n.specsExists=!0;let i=await Ee.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Cm(r,e,t){let n=bm[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function Kb(r,e,t){let n=await Cm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Xb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var Jb,bm,Yb,li,Pm=w(()=>{"use strict";F();Jb=Bb(Vb);l(pm,"formatDuration");l(sl,"escapeRegex");l(qb,"formatWarnings");l(mm,"verifyDone");l(gm,"verifyShip");l(fm,"verifyFeature");l(hm,"verifyNow");l(ym,"verifyInit");l(wm,"verifySync");l(km,"verifyAnalyze");l(Sm,"verifySpec");bm={done:mm,ship:gm,feature:fm,now:hm,init:ym,sync:wm,analyze:km,spec:Sm};l(Cm,"verify");l(Kb,"prepareCommand");l(Xb,"requiresVerification");Yb={verify:Cm,prepareCommand:Kb,requiresVerification:Xb,verifiers:bm,formatWarnings:qb,formatDuration:pm,escapeRegex:sl,verifyDone:mm,verifyShip:gm,verifyFeature:fm,verifyNow:hm,verifyInit:ym,verifySync:wm,verifyAnalyze:km,verifySpec:Sm},li=Yb});function Zb(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function eC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Qb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Zb(t)};return{detected:!1}}function tC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function nC(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function sC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function rC(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var Qb,rl,oC,Rs,vm=w(()=>{"use strict";Qb=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(Zb,"getHallucinationSuggestion");l(eC,"detectHallucination");l(tC,"isSimilarError");l(nC,"analyzeErrorPattern");l(sC,"generateEscalationMessage");l(rC,"generateSuggestion");rl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>tC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=nC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:sC(e,o,this.maxAttempts),suggestion:rC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return eC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},oC=new rl,Rs=oC});function ol(r,e){let t=Mr(e),n=iC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function aC(r,e){let t=Mr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function cC(r,e,t){let n=Mr(t),s=ol(r,t),o=ol(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function ui(r,e=wn){let t=Mr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=lC(r,e),s=uC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=mC(o),a=dC(o),c=pC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=gC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Tm(r,e,t=wn){let n=Mr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function lC(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=cC(i,s,e);if(!t.has(a)){let c=ol(i,e),u=aC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function uC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+fC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>al(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function dC(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function pC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=al(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function mC(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function gC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=al(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function al(r){if(!r.variance)return 0;let e=il(r.estimatedDuration),t=il(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function il(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function Em(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
502
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=xn.join(r.projectPath,"package.json");try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ee.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${sl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ee.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function fm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ee.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ee.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(sl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ee.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function hm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ee.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ee.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ym(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ee.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=xn.join(dm.homedir(),".prjct-cli");try{await Ee.access(o,Ee.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ee.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function wm(r){let e=[],t=[],n={},s=xn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ee.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=xn.join(dm.homedir(),".prjct-cli/projects",o||"");try{await Ee.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function km(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ee.access(xn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ee.stat(xn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Sm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ee.access(s),n.specsExists=!0;let i=await Ee.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Cm(r,e,t){let n=bm[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function Kb(r,e,t){let n=await Cm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Xb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var Jb,bm,Yb,li,Pm=w(()=>{"use strict";F();Jb=Bb(Vb);l(pm,"formatDuration");l(sl,"escapeRegex");l(qb,"formatWarnings");l(mm,"verifyDone");l(gm,"verifyShip");l(fm,"verifyFeature");l(hm,"verifyNow");l(ym,"verifyInit");l(wm,"verifySync");l(km,"verifyAnalyze");l(Sm,"verifySpec");bm={done:mm,ship:gm,feature:fm,now:hm,init:ym,sync:wm,analyze:km,spec:Sm};l(Cm,"verify");l(Kb,"prepareCommand");l(Xb,"requiresVerification");Yb={verify:Cm,prepareCommand:Kb,requiresVerification:Xb,verifiers:bm,formatWarnings:qb,formatDuration:pm,escapeRegex:sl,verifyDone:mm,verifyShip:gm,verifyFeature:fm,verifyNow:hm,verifyInit:ym,verifySync:wm,verifyAnalyze:km,verifySpec:Sm},li=Yb});function Zb(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function eC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Qb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Zb(t)};return{detected:!1}}function tC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function nC(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function sC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function rC(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var Qb,rl,oC,Ds,vm=w(()=>{"use strict";Qb=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(Zb,"getHallucinationSuggestion");l(eC,"detectHallucination");l(tC,"isSimilarError");l(nC,"analyzeErrorPattern");l(sC,"generateEscalationMessage");l(rC,"generateSuggestion");rl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>tC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=nC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:sC(e,o,this.maxAttempts),suggestion:rC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return eC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},oC=new rl,Ds=oC});function ol(r,e){let t=Mr(e),n=iC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function aC(r,e){let t=Mr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function cC(r,e,t){let n=Mr(t),s=ol(r,t),o=ol(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function ui(r,e=wn){let t=Mr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=lC(r,e),s=uC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=mC(o),a=dC(o),c=pC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=gC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Tm(r,e,t=wn){let n=Mr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function lC(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=cC(i,s,e);if(!t.has(a)){let c=ol(i,e),u=aC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function uC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+fC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>al(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function dC(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function pC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=al(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function mC(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function gC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=al(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function al(r){if(!r.variance)return 0;let e=il(r.estimatedDuration),t=il(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function il(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function Em(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
503
503
  `)}function fC(r){if(!r.estimatedDuration)return 0;let e=il(r.estimatedDuration);if(e<=0)return 0;let t=xm[0],n=Number.POSITIVE_INFINITY;for(let s of xm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Mr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var iC,xm,cl=w(()=>{"use strict";ps();iC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(ol,"getSprintStart");l(aC,"getSprintEnd");l(cC,"getSprintNumber");l(ui,"calculateVelocity");l(Tm,"projectCompletion");l(lC,"bucketBySprint");l(uC,"buildSprintVelocities");l(dC,"detectTrend");l(pC,"calculateOverallAccuracy");l(mC,"calculateAverageVelocity");l(gC,"detectEstimationPatterns");l(al,"parseVariancePercent");l(il,"parseDurationMinutes");l(Em,"formatVelocityContext");xm=[{points:1,typical:10},{points:2,typical:20},{points:3,typical:45},{points:5,typical:90},{points:8,typical:180},{points:13,typical:360},{points:21,typical:720}];l(fC,"derivePoints");l(Mr,"resolveConfig")});import{exec as hC}from"node:child_process";import yC from"node:fs/promises";import di from"node:path";import{promisify as wC}from"node:util";async function pi(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=PC(r),c=await vC(e),u=await xC(e),d=[];for(let p of c){if(!i&&EC(p))continue;let g=TC(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function PC(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function vC(r){let e=[];async function t(n,s=""){try{let o=await yC.readdir(n,{withFileTypes:!0});for(let i of o){let a=di.join(n,i.name),c=di.join(s,i.name);if(i.isDirectory()){if(CC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=di.extname(i.name).toLowerCase();bC.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function xC(r){let e=new Map;try{let{stdout:t}=await kC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
504
504
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
505
505
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
@@ -526,7 +526,7 @@ Recommendations:
526
526
  for (f in count) print count[f], lastmod[f], f
527
527
  }
528
528
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
529
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),D=Math.floor(S/3600),B=Math.max(0,1-I/14),Pe=g/d,$e=B*.5+Pe*.5,Be;D<1?Be="just now":D<24?Be=`${D}h ago`:Be=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round($e*100)/100,lastChanged:Be,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function $C(r){let e=r.split("/").pop()||"";for(let t of RC)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Or,RC,Im=w(()=>{"use strict";Or=IC(AC),RC=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Am,"getRecentFiles");l(DC,"getHotFilesFromCommits");l(jC,"getBranchOnlyFiles");l($C,"shouldIgnore")});function ul(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Rm(r,e){let t=MC[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function FC(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function jm(r,e){let t=ul(r),n=ul(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Rm(s,OC),a=Dm.map(c=>({model:c,...Rm(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:FC(i.total),byModel:a}}}function dl(r){let e=ul(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Dm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var MC,OC,Dm,$m=w(()=>{"use strict";MC={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},OC="claude-sonnet-4.5";l(ul,"countTokens");Dm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Rm,"calculateModelCost");l(FC,"formatCostSaved");l(jm,"measureCompression");l(dl,"noCompression")});import _C from"node:fs/promises";import pl from"node:path";async function Fm(r,e=process.cwd()){let t=pl.isAbsolute(r)?r:pl.join(e,r),n;try{n=await _C.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:dl("")};throw u}let s=pl.extname(r).toLowerCase(),o=NC[s]||"unknown",i=GC[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:dl(n)};let a=zC(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
529
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,I=Math.floor(S/86400),D=Math.floor(S/3600),B=Math.max(0,1-I/14),ve=g/d,$e=B*.5+ve*.5,Be;D<1?Be="just now":D<24?Be=`${D}h ago`:Be=`${I}d ago`,a.push({path:k,changes:g,heatScore:Math.round($e*100)/100,lastChanged:Be,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function $C(r){let e=r.split("/").pop()||"";for(let t of RC)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Or,RC,Im=w(()=>{"use strict";Or=IC(AC),RC=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Am,"getRecentFiles");l(DC,"getHotFilesFromCommits");l(jC,"getBranchOnlyFiles");l($C,"shouldIgnore")});function ul(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Rm(r,e){let t=MC[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function FC(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function jm(r,e){let t=ul(r),n=ul(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Rm(s,OC),a=Dm.map(c=>({model:c,...Rm(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:FC(i.total),byModel:a}}}function dl(r){let e=ul(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Dm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var MC,OC,Dm,$m=w(()=>{"use strict";MC={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},OC="claude-sonnet-4.5";l(ul,"countTokens");Dm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Rm,"calculateModelCost");l(FC,"formatCostSaved");l(jm,"measureCompression");l(dl,"noCompression")});import _C from"node:fs/promises";import pl from"node:path";async function Fm(r,e=process.cwd()){let t=pl.isAbsolute(r)?r:pl.join(e,r),n;try{n=await _C.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:dl("")};throw u}let s=pl.extname(r).toLowerCase(),o=NC[s]||"unknown",i=GC[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:dl(n)};let a=zC(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
530
530
  `);return{file:r,language:o,signatures:a,fallback:!1,metrics:jm(n,c)}}function zC(r,e){let t=[],n=r.split(`
531
531
  `),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
532
532
  `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:WC(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function WC(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var NC,Mm,LC,UC,HC,Om,GC,_m=w(()=>{"use strict";F();$m();NC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go",".rs":"rust",".java":"java",".cs":"csharp",".php":"php",".rb":"ruby"},Mm=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],LC=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],UC=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],HC=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],Om=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],GC={typescript:Mm,javascript:Mm,python:LC,go:UC,rust:HC,java:Om,csharp:Om,php:[],ruby:[],unknown:[]};l(Fm,"extractSignatures");l(zC,"extractFromContent");l(WC,"cleanSignature")});import{createHash as VC}from"node:crypto";import Um from"node:fs/promises";import Hm from"node:path";function Nm(r){return VC("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Lm(r){try{let e=Hm.join(r,"storage","classification-cache.json"),t=await Um.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?va:(console.warn("[classifier] Failed to load cache:",y(e)),va)}}async function ml(r,e){try{let t=Hm.join(r,"storage","classification-cache.json");await Um.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function JC(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>BC?null:n.classification}function qC(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function KC(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Gm(e),s=Ea("classification")||"",o=`Classify this software engineering task into a domain.
@@ -537,18 +537,18 @@ Available domains in this project: ${n.join(", ")}
537
537
  Available agents: ${e.agents.join(", ")||"none"}
538
538
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
539
539
 
540
- ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=yn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function YC(r,e){let t=Gm(e),n=new Map;for(let[p,g]of Object.entries(XC)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return pd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=QC(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function Gm(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function QC(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var BC,XC,gl,ZC,zm,Wm=w(()=>{"use strict";mr();lo();F();BC=3600*1e3;l(Nm,"hashDescription");l(Lm,"loadCache");l(ml,"saveCache");l(JC,"lookupCache");l(qC,"lookupPatterns");l(KC,"classifyWithLLM");XC={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(YC,"classifyWithHeuristic");l(Gm,"buildAvailableDomains");l(QC,"getFilePatterns");gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Nm(e),i=await Lm(n),a=JC(i,o,t);if(a)return{classification:a,source:"cache"};let c=qC(i,o);if(c)return{classification:c,source:"history"};let u=await KC(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await ml(n,i),{classification:u,source:"llm"};let d=YC(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await ml(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Nm(e),o=await Lm(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await ml(n,o))}},ZC=new gl,zm=ZC});import{exec as eP}from"node:child_process";import Fr from"node:fs/promises";import tP from"node:os";import Kn from"node:path";import{promisify as nP}from"node:util";var Vm,Bm,fl,sP,mi,hl=w(()=>{"use strict";cl();wt();we();ps();Xt();ll();Im();_m();F();qn();Wm();Jt();Vm=nP(eP),Bm=["database","backend","frontend","testing","devops"],fl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=x.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map(($e,Be)=>{if($e.status==="fulfilled")return $e.value;g.push(p[Be]),console.warn(`Context tool "${p[Be]}" failed: ${y($e.reason)}`)}),[k,S,I]=f,D={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},B=this.shouldFragment(a,t),Pe=null;return B&&e==="task"&&(Pe=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:B,subtasks:Pe,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:D}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),pi(e,t,{maxFiles:10,minScore:.15}),Am(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Fm(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
540
+ ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=yn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function YC(r,e){let t=Gm(e),n=new Map;for(let[p,g]of Object.entries(XC)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return pd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=QC(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function Gm(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function QC(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var BC,XC,gl,ZC,zm,Wm=w(()=>{"use strict";gr();lo();F();BC=3600*1e3;l(Nm,"hashDescription");l(Lm,"loadCache");l(ml,"saveCache");l(JC,"lookupCache");l(qC,"lookupPatterns");l(KC,"classifyWithLLM");XC={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(YC,"classifyWithHeuristic");l(Gm,"buildAvailableDomains");l(QC,"getFilePatterns");gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Nm(e),i=await Lm(n),a=JC(i,o,t);if(a)return{classification:a,source:"cache"};let c=qC(i,o);if(c)return{classification:c,source:"history"};let u=await KC(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await ml(n,i),{classification:u,source:"llm"};let d=YC(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await ml(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Nm(e),o=await Lm(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await ml(n,o))}},ZC=new gl,zm=ZC});import{exec as eP}from"node:child_process";import Fr from"node:fs/promises";import tP from"node:os";import Kn from"node:path";import{promisify as nP}from"node:util";var Vm,Bm,fl,sP,mi,hl=w(()=>{"use strict";cl();wt();ke();ps();Xt();ll();Im();_m();F();qn();Wm();Jt();Vm=nP(eP),Bm=["database","backend","frontend","testing","devops"],fl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=x.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map(($e,Be)=>{if($e.status==="fulfilled")return $e.value;g.push(p[Be]),console.warn(`Context tool "${p[Be]}" failed: ${y($e.reason)}`)}),[k,S,I]=f,D={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},B=this.shouldFragment(a,t),ve=null;return B&&e==="task"&&(ve=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:B,subtasks:ve,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:I??null,contextDegradation:D}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),pi(e,t,{maxFiles:10,minScore:.15}),Am(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Fm(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
541
541
  `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([Vm("git branch --show-current",{cwd:e}),Vm("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
542
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await He.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await pt.getAll(e);if(t.length===0)return null;let n=ui(t,wn);return n.sprints.length===0?null:Em(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kn.join(e,"analysis","repo-analysis.json"),n=await Fr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await zm.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=Kn.join(e,"agents");return(await Fr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=Kn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=Kn.join(s,u);try{let m=await Fr.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ko(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=Kn.join(tP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=Kn.join(t,`${i}.md`),c=Kn.join(t,i,"SKILL.md");try{let u=await Fr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Fr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=Bm.indexOf(a),d=Bm.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},sP=new fl,mi=sP});function rP(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var yl,oP,Oe,Jm=w(()=>{"use strict";Dt();oe();an();an();l(rP,"generateApprovalPrompt");yl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return _o.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>_o.includes(n)):t}startPlanning(e,t,n){let s={id:ge(),projectId:e,command:t,params:n,status:te.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[te.GATHERING,te.ANALYZING,te.PROPOSING,te.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===te.APPROVED?n.approvedAt=b():t===te.EXECUTING?n.executionStartedAt=b():(t===te.COMPLETED||t===te.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=te.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=te.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==te.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=te.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=te.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==te.APPROVED?null:(t.status=te.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==te.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==te.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=te.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=te.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return rP(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[te.GATHERING]:"\u{1F50D}",[te.ANALYZING]:"\u{1F9E0}",[te.PROPOSING]:"\u{1F4DD}",[te.PENDING_APPROVAL]:"\u23F3",[te.APPROVED]:"\u2705",[te.EXECUTING]:"\u26A1",[te.COMPLETED]:"\u{1F389}",[te.REJECTED]:"\u274C",[te.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===te.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
543
- `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},oP=new yl,Oe=oP});function iP(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return gi[t]?gi[t]:gi[e]?gi[e]:e}function fi(r){let e=new Set,t=[];for(let n of r){let s=iP(n);e.has(s)||(e.add(s),t.push(n))}return t}var gi,wl=w(()=>{"use strict";gi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(iP,"normalizeFrameworkName");l(fi,"deduplicateTechStack")});import{z as Fe}from"zod";function qm(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
542
+ `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await Ge.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await pt.getAll(e);if(t.length===0)return null;let n=ui(t,wn);return n.sprints.length===0?null:Em(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kn.join(e,"analysis","repo-analysis.json"),n=await Fr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await zm.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=Kn.join(e,"agents");return(await Fr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=Kn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=Kn.join(s,u);try{let m=await Fr.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ko(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=Kn.join(tP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=Kn.join(t,`${i}.md`),c=Kn.join(t,i,"SKILL.md");try{let u=await Fr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Fr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=Bm.indexOf(a),d=Bm.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},sP=new fl,mi=sP});function rP(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var yl,oP,Fe,Jm=w(()=>{"use strict";Dt();oe();an();an();l(rP,"generateApprovalPrompt");yl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return _o.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>_o.includes(n)):t}startPlanning(e,t,n){let s={id:ge(),projectId:e,command:t,params:n,status:te.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[te.GATHERING,te.ANALYZING,te.PROPOSING,te.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===te.APPROVED?n.approvedAt=b():t===te.EXECUTING?n.executionStartedAt=b():(t===te.COMPLETED||t===te.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=te.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=te.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==te.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=te.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=te.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==te.APPROVED?null:(t.status=te.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==te.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==te.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=te.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=te.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return rP(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[te.GATHERING]:"\u{1F50D}",[te.ANALYZING]:"\u{1F9E0}",[te.PROPOSING]:"\u{1F4DD}",[te.PENDING_APPROVAL]:"\u23F3",[te.APPROVED]:"\u2705",[te.EXECUTING]:"\u26A1",[te.COMPLETED]:"\u{1F389}",[te.REJECTED]:"\u274C",[te.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===te.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
543
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},oP=new yl,Fe=oP});function iP(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return gi[t]?gi[t]:gi[e]?gi[e]:e}function fi(r){let e=new Set,t=[];for(let n of r){let s=iP(n);e.has(s)||(e.add(s),t.push(n))}return t}var gi,wl=w(()=>{"use strict";gi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(iP,"normalizeFrameworkName");l(fi,"deduplicateTechStack")});import{z as _e}from"zod";function qm(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
544
544
  `);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=fi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>aP[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
545
545
  Context: ${r.fileCount} files in project.`),e.join(`
546
- `)}var l_,aP,Km=w(()=>{"use strict";wl();l_=Fe.object({projectPath:Fe.string(),language:Fe.string().optional(),framework:Fe.string().optional(),techStack:Fe.array(Fe.string()).default([]),domains:Fe.object({hasFrontend:Fe.boolean().default(!1),hasBackend:Fe.boolean().default(!1),hasDatabase:Fe.boolean().default(!1),hasTesting:Fe.boolean().default(!1),hasDocker:Fe.boolean().default(!1)}).optional(),fileCount:Fe.number().optional(),availableAgents:Fe.array(Fe.string()).default([]),analysisLanguages:Fe.array(Fe.string()).default([]),analysisFrameworks:Fe.array(Fe.string()).default([]),analysisPackageManager:Fe.string().optional()}),aP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(qm,"buildAntiHallucinationBlock")});import{z as _t}from"zod";var cP,Xm,Ym=w(()=>{"use strict";cP=_t.object({agents:_t.boolean(),patterns:_t.boolean(),checklist:_t.boolean(),modules:_t.array(_t.string())}),Xm=_t.object({version:_t.string(),description:_t.string().optional(),commands:_t.record(_t.string(),cP).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function kl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Qm(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=kl(o,lP),a=kl(o,uP),c=kl(o,dP);return s.some(d=>pP.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var lP,uP,dP,pP,Zm=w(()=>{"use strict";lP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],uP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],dP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],pP=["Write","Edit","Bash"];l(kl,"countMatches");l(Qm,"classifyCommand")});import Sl from"node:fs/promises";import mP from"node:path";async function tg(){if(_r)return _r;let r=await Sl.readFile(bl,"utf-8"),e=JSON.parse(r);return _r=Xm.parse(e),_r}function gP(r){return ng.get(r)}function fP(r,e){ng.set(r,e)}function yP(r,e){let t=r,n=eg.get(t);return n&&kP(n.entry,e)?(n.count++,n.count>=hP):(eg.set(t,{entry:e,count:1}),!1)}async function wP(r,e){let t=await Sl.readFile(bl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Sl.writeFile(bl,`${JSON.stringify(n,null,2)}
547
- `,"utf-8"),_r=null}function kP(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function sg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=gP(e);if(n)return{entry:n,source:"cache"};if(t){let s=Qm(e,t);return fP(e,s),yP(e,s)&&wP(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var bl,_r,ng,eg,hP,rg=w(()=>{"use strict";Ym();Bt();Zm();bl=mP.join(ce,"core/config/command-context.config.json"),_r=null;l(tg,"loadCommandContextConfig");ng=new Map;l(gP,"getCachedClassification");l(fP,"cacheClassification");eg=new Map,hP=3;l(yP,"trackClassification");l(wP,"persistClassification");l(kP,"isSameEntry");l(sg,"resolveCommandContextFull")});import SP from"node:os";import{z as Qt}from"zod";function bP(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function CP(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function og(r){let e=r.platform??SP.platform(),t=r.runtime??bP(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
546
+ `)}var u_,aP,Km=w(()=>{"use strict";wl();u_=_e.object({projectPath:_e.string(),language:_e.string().optional(),framework:_e.string().optional(),techStack:_e.array(_e.string()).default([]),domains:_e.object({hasFrontend:_e.boolean().default(!1),hasBackend:_e.boolean().default(!1),hasDatabase:_e.boolean().default(!1),hasTesting:_e.boolean().default(!1),hasDocker:_e.boolean().default(!1)}).optional(),fileCount:_e.number().optional(),availableAgents:_e.array(_e.string()).default([]),analysisLanguages:_e.array(_e.string()).default([]),analysisFrameworks:_e.array(_e.string()).default([]),analysisPackageManager:_e.string().optional()}),aP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(qm,"buildAntiHallucinationBlock")});import{z as Nt}from"zod";var cP,Xm,Ym=w(()=>{"use strict";cP=Nt.object({agents:Nt.boolean(),patterns:Nt.boolean(),checklist:Nt.boolean(),modules:Nt.array(Nt.string())}),Xm=Nt.object({version:Nt.string(),description:Nt.string().optional(),commands:Nt.record(Nt.string(),cP).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function kl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Qm(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=kl(o,lP),a=kl(o,uP),c=kl(o,dP);return s.some(d=>pP.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var lP,uP,dP,pP,Zm=w(()=>{"use strict";lP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],uP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],dP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],pP=["Write","Edit","Bash"];l(kl,"countMatches");l(Qm,"classifyCommand")});import Sl from"node:fs/promises";import mP from"node:path";async function tg(){if(_r)return _r;let r=await Sl.readFile(bl,"utf-8"),e=JSON.parse(r);return _r=Xm.parse(e),_r}function gP(r){return ng.get(r)}function fP(r,e){ng.set(r,e)}function yP(r,e){let t=r,n=eg.get(t);return n&&kP(n.entry,e)?(n.count++,n.count>=hP):(eg.set(t,{entry:e,count:1}),!1)}async function wP(r,e){let t=await Sl.readFile(bl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Sl.writeFile(bl,`${JSON.stringify(n,null,2)}
547
+ `,"utf-8"),_r=null}function kP(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function sg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=gP(e);if(n)return{entry:n,source:"cache"};if(t){let s=Qm(e,t);return fP(e,s),yP(e,s)&&wP(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var bl,_r,ng,eg,hP,rg=w(()=>{"use strict";Ym();$t();Zm();bl=mP.join(ce,"core/config/command-context.config.json"),_r=null;l(tg,"loadCommandContextConfig");ng=new Map;l(gP,"getCachedClassification");l(fP,"cacheClassification");eg=new Map,hP=3;l(yP,"trackClassification");l(wP,"persistClassification");l(kP,"isSameEntry");l(sg,"resolveCommandContextFull")});import SP from"node:os";import{z as Qt}from"zod";function bP(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function CP(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function og(r){let e=r.platform??SP.platform(),t=r.runtime??bP(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
548
548
  ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",CP(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
549
549
  `)}
550
- </env>`}var x_,ig=w(()=>{"use strict";x_=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(bP,"detectRuntime");l(CP,"normalizePlatform");l(og,"buildEnvironmentBlock")});function cg(r){let e=r.getAllocationFor("injection");return{...yi,totalPrompt:e}}function Xn(r,e){let t=e*lg;return r.length<=t?r:`${r.substring(0,t)}
551
- ... (truncated to ~${e} tokens)`}function ag(r){return Math.ceil(r.length/lg)}function ug(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=PP[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var yi,lg,PP,hi,dg=w(()=>{"use strict";yi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(cg,"budgetsFromCoordinator");lg=4;l(Xn,"truncateToTokenBudget");l(ag,"estimateTokens");PP={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(ug,"filterSkillsByDomains");hi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...yi,...e}}addSection(e,t){let n=Xn(e,t),s=ag(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Xn(n,o);return this.used+=ag(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import pg from"node:fs/promises";import Yn from"node:path";var Cl,vP,mg,gg=w(()=>{"use strict";Xt();F();Me();Bt();Zc();Km();rg();ig();dg();wl();Jt();Cl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await R(e)){let s=await pg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){P(s)||console.error(`Template loading warning: ${y(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?cg(this._coordinator):yi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=le(`global/modules/${e}`);if(t)return t;let n=Yn.join(ce,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=kn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=le(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ce,"templates","checklists");if(await R(s)){let o=(await pg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Yn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),xe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await Kc.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
550
+ </env>`}var T_,ig=w(()=>{"use strict";T_=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(bP,"detectRuntime");l(CP,"normalizePlatform");l(og,"buildEnvironmentBlock")});function cg(r){let e=r.getAllocationFor("injection");return{...yi,totalPrompt:e}}function Xn(r,e){let t=e*lg;return r.length<=t?r:`${r.substring(0,t)}
551
+ ... (truncated to ~${e} tokens)`}function ag(r){return Math.ceil(r.length/lg)}function ug(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=PP[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var yi,lg,PP,hi,dg=w(()=>{"use strict";yi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(cg,"budgetsFromCoordinator");lg=4;l(Xn,"truncateToTokenBudget");l(ag,"estimateTokens");PP={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(ug,"filterSkillsByDomains");hi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...yi,...e}}addSection(e,t){let n=Xn(e,t),s=ag(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Xn(n,o);return this.used+=ag(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import pg from"node:fs/promises";import Yn from"node:path";var Cl,vP,mg,gg=w(()=>{"use strict";Xt();F();Me();$t();Zc();Km();rg();ig();dg();wl();Jt();Cl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await R(e)){let s=await pg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){P(s)||console.error(`Template loading warning: ${y(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?cg(this._coordinator):yi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=le(`global/modules/${e}`);if(t)return t;let n=Yn.join(ce,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=kn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=le(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ce,"templates","checklists");if(await R(s)){let o=(await pg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Yn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),fe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await Kc.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
552
552
  `);return Xn(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=Yn.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let C=await tg();p=sg(C,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
553
553
  `),s.role&&d.push(`Role: ${s.role}
554
554
  `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
@@ -612,7 +612,7 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
612
612
  `)),c?.requiresApproval&&d.push(`
613
613
  ## APPROVAL REQUIRED
614
614
  Show changes, list affected files, ask for confirmation.
615
- `),k){let C=u?.sealedAnalysis,j=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Re={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:fi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(tr=>tr.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
615
+ `),k){let C=u?.sealedAnalysis,j=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Re={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:fi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(nr=>nr.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
616
616
  ${qm(Re)}
617
617
  `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
618
618
  ### CONTEXT DEGRADATION NOTICE
@@ -639,8 +639,8 @@ ${j.content}
639
639
  `);d.push(`
640
640
  `)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let j=C.recentFiles.slice(0,5).map(Re=>`${Re.path} (${Re.lastChanged})`).join(", ");d.push(`${j}
641
641
 
642
- `)}}let Pe=t.files||[];if(Pe.length>0){let C=Pe.slice(0,5).join(", ");d.push(`
643
- ## FILES: ${Pe.length} available. Top: ${C}
642
+ `)}}let ve=t.files||[];if(ve.length>0){let C=ve.slice(0,5).join(", ");d.push(`
643
+ ## FILES: ${ve.length} available. Top: ${C}
644
644
  `),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
645
645
 
646
646
  `)}else k&&d.push(`
@@ -737,7 +737,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
737
737
  - Prefer structured output (JSON) over free text when applicable.
738
738
 
739
739
  EXECUTE: Follow flow. Use tools. Decide.
740
- `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},vP=new Cl,mg=vP});import fg from"node:fs/promises";import xt from"node:path";var xP,TP,Pl,vl,wi,xl=w(()=>{"use strict";wt();we();F();xP=["task","done","ship","resume","bug","enrich"],TP=["init","sync","pause","next","dash","history","undo","redo"],Pl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return xt.dirname(Dn.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(Ze(),Pt(ht)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=xt.join(u,"templates")}catch{c=xt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:xt.join(c,"agentic","orchestrator.md"),agentRouting:xt.join(c,"agentic","agent-routing.md"),taskFragmentation:xt.join(c,"agentic","task-fragmentation.md"),commandTemplate:xt.join(c,"commands",`${e}.md`),repoAnalysis:xt.join(o,"analysis","repo-analysis.json"),agentsDir:xt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:xt.join(o,"storage","state.json")}}}requiresOrchestration(e){return xP.includes(e)?!0:!TP.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await fg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await fg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
740
+ `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},vP=new Cl,mg=vP});import fg from"node:fs/promises";import xt from"node:path";var xP,TP,Pl,vl,wi,xl=w(()=>{"use strict";wt();ke();F();xP=["task","done","ship","resume","bug","enrich"],TP=["init","sync","pause","next","dash","history","undo","redo"],Pl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return xt.dirname(Dn.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(Ze(),Pt(ht)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=xt.join(u,"templates")}catch{c=xt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:xt.join(c,"agentic","orchestrator.md"),agentRouting:xt.join(c,"agentic","agent-routing.md"),taskFragmentation:xt.join(c,"agentic","task-fragmentation.md"),commandTemplate:xt.join(c,"commands",`${e}.md`),repoAnalysis:xt.join(o,"analysis","repo-analysis.json"),agentsDir:xt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:xt.join(o,"storage","state.json")}}}requiresOrchestration(e){return xP.includes(e)?!0:!TP.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await fg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await fg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
741
741
  ## Agentic Execution Mode
742
742
 
743
743
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -820,13 +820,13 @@ When fragmenting tasks:
820
820
  2. Track progress: currentSubtaskIndex, subtaskProgress
821
821
  3. Each completed subtask generates a summary
822
822
  4. Pass summary to next agent for context handoff
823
- `,context:e,requiresOrchestration:t}}},vl=new Pl,wi=vl});import{exec as EP}from"node:child_process";import hg from"node:fs/promises";import{promisify as AP}from"node:util";var IP,Qn,Xe,Tl=w(()=>{"use strict";vo();IP=AP(EP),Qn={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};Qn.register("Read",async r=>{try{return await yr.execute(async()=>await hg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Po(e)||hr(e),null}});Qn.register("Write",async(r,e)=>{try{return await yr.execute(async()=>await hg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Po(t)||hr(t),!1}});Qn.register("Bash",async r=>{try{return await yr.execute(async()=>await IP(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Qn.register("GetTimestamp",async()=>new Date().toISOString());Qn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Qn.register("GetDateTime",async()=>new Date().toISOString());Xe=Qn});import El from"node:fs/promises";import RP from"node:os";import yg from"node:path";async function DP(r){try{let e=yg.dirname(ki);await R(e)||await El.mkdir(e,{recursive:!0}),await El.writeFile(ki,`/p:${r}`)}catch{}}async function jP(){try{await R(ki)&&await El.unlink(ki)}catch{}}var ki,Al,$P,Si,Il=w(()=>{"use strict";F();om();Me();cm();um();nl();Pm();vm();ms();hl();Jm();gg();xl();Jt();Tl();ki=yg.join(RP.homedir(),".prjct-cli",".running");l(DP,"signalStart");l(jP,"signalEnd");Al=class{static{l(this,"CommandExecutor")}async signalStart(e){await DP(e)}async signalEnd(){await jP()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Rs.shouldEscalate(e,s)){let o=Rs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ua.load(e),i=await mt.build(n,t),a=Oe.requiresPlanning(e),c=Oe.isDestructive(e),u=Oe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Oe.startPlanning(i.projectId,e,t):u&&(d=Oe.getActivePlan(i.projectId));let m=null;if(li.requiresVerification(e)){let C=await mt.loadStateForCommand(i,e);m=await li.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(li.formatWarnings(m))}let p=null;if(ci.requiresReasoning(e)){let C=await mt.loadStateForCommand(i,e);p=await ci.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(ci.formatPlan(p)))}let g=t.task||t.description||"",f=await wi.buildContext(e,g,n),k=wi.buildAgenticPrompt(f),S=null;if(wi.requiresOrchestration(e)&&g)try{S=await mi.execute(e,g,n),S.detectedDomains.length>0&&ai.orchestrate(S.detectedDomains);for(let C of S.agents){let j=C.domain||C.name.replace(".md","");ai.startAgent(C.name,j,`Loading ${j} specialist...`),ai.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));am(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await mt.loadState(i),B=null,Pe=null;i.projectId&&(B={commit_footer:await Le.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Le.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Le.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Le.getSmartDecision(i.projectId,`preferred_agent_${e}`)},Pe=await Le.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let $e={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Oe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Be=await mg.build(o,I,D,null,B,null,Pe,$e,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:D,prompt:Be,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:B,relevantMemories:Pe,orchestratorContext:S,memory:{create:l(C=>Le.createMemory(i.projectId,C),"create"),autoRemember:l((C,j,Re)=>Le.autoRemember(i.projectId,C,j,Re),"autoRemember"),search:l(C=>Le.searchMemories(i.projectId,C),"search"),findByTags:l(C=>Le.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>Le.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Oe.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Oe.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Oe.proposePlan(i.projectId,C),"propose"),approve:l(C=>Oe.approvePlan(i.projectId,C),"approve"),reject:l(C=>Oe.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Oe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Oe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Oe.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Oe.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Oe.failStep(i.projectId,C),"failStep"),abort:l(C=>Oe.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Oe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Oe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rs.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rs.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Xe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Xe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ua.load(e)).frontmatter["allowed-tools"]||[],i=await mt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},$P=new Al,Si=$P});import bi from"node:fs/promises";import MP from"node:https";import OP from"node:os";import Rl from"node:path";import Nt from"chalk";var Dl,wg,kg=w(()=>{"use strict";F();Me();Dl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(OP.homedir(),".prjct-cli","config"),this.cacheFile=Rl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rl.join(__dirname,"..","..","package.json");return JSON.parse(await bi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=MP.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await R(this.cacheFile))return JSON.parse(await bi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await R(this.cacheDir)||await bi.mkdir(this.cacheDir,{recursive:!0}),await bi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
824
- `+Nt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
825
- `+Nt.yellow("\u2502")+" "+Nt.bold("Update available!")+" "+Nt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Nt.yellow("\u2502")+`
826
- `+Nt.yellow("\u2502")+" "+Nt.yellow("\u2502")+`
827
- `+Nt.yellow("\u2502")+" Run: "+Nt.cyan("npm update -g prjct-cli")+" "+Nt.yellow("\u2502")+`
828
- `+Nt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
829
- `}},wg=Dl});var Se,nt=w(()=>{"use strict";Il();nl();Tl();wt();we();kg();ln();oe();Me();zn();Se=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new wg,this.updateNotificationShown=!1,this.commandExecutor=Si}get agent(){return ws.getAgent()}get agentInfo(){return ws.getInfo()}get currentAuthor(){return Tn.getCurrentAuthor()}async initializeAgent(){return ws.initialize()}async ensureProjectInit(e){return Tn.ensureInit(e)}async ensureAuthor(){return Tn.ensureAuthor()}async getGlobalProjectPath(e){return Tn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return lt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Tn.isEmptyDirectory(e)}async _detectExistingCode(e){return Tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return jo.breakdownFeature(e)}_detectBugSeverity(e){return jo.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ws.assignForTask(e,t,n)}}});var Sg={};jn(Sg,{PlanningCommands:()=>es});import Zn from"node:path";async function FP(){if(!jl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Pi(),bg));jl=new r}return jl}var jl,es,Ci=w(()=>{"use strict";To();Sn();Dt();Xt();Ir();F();Ts();Es();Jc();Zc();nt();jl=null;l(FP,"getAnalysisCommands");es=class extends Se{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Is(t).runNonInteractive());else if(a=await new Is(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ys(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
823
+ `,context:e,requiresOrchestration:t}}},vl=new Pl,wi=vl});import{exec as EP}from"node:child_process";import hg from"node:fs/promises";import{promisify as AP}from"node:util";var IP,Qn,Xe,Tl=w(()=>{"use strict";vo();IP=AP(EP),Qn={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};Qn.register("Read",async r=>{try{return await wr.execute(async()=>await hg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Po(e)||yr(e),null}});Qn.register("Write",async(r,e)=>{try{return await wr.execute(async()=>await hg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Po(t)||yr(t),!1}});Qn.register("Bash",async r=>{try{return await wr.execute(async()=>await IP(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Qn.register("GetTimestamp",async()=>new Date().toISOString());Qn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Qn.register("GetDateTime",async()=>new Date().toISOString());Xe=Qn});import El from"node:fs/promises";import RP from"node:os";import yg from"node:path";async function DP(r){try{let e=yg.dirname(ki);await R(e)||await El.mkdir(e,{recursive:!0}),await El.writeFile(ki,`/p:${r}`)}catch{}}async function jP(){try{await R(ki)&&await El.unlink(ki)}catch{}}var ki,Al,$P,Si,Il=w(()=>{"use strict";F();om();Me();cm();um();nl();Pm();vm();ms();hl();Jm();gg();xl();Jt();Tl();ki=yg.join(RP.homedir(),".prjct-cli",".running");l(DP,"signalStart");l(jP,"signalEnd");Al=class{static{l(this,"CommandExecutor")}async signalStart(e){await DP(e)}async signalEnd(){await jP()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Ds.shouldEscalate(e,s)){let o=Ds.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ua.load(e),i=await mt.build(n,t),a=Fe.requiresPlanning(e),c=Fe.isDestructive(e),u=Fe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Fe.startPlanning(i.projectId,e,t):u&&(d=Fe.getActivePlan(i.projectId));let m=null;if(li.requiresVerification(e)){let C=await mt.loadStateForCommand(i,e);m=await li.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(li.formatWarnings(m))}let p=null;if(ci.requiresReasoning(e)){let C=await mt.loadStateForCommand(i,e);p=await ci.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(ci.formatPlan(p)))}let g=t.task||t.description||"",f=await wi.buildContext(e,g,n),k=wi.buildAgenticPrompt(f),S=null;if(wi.requiresOrchestration(e)&&g)try{S=await mi.execute(e,g,n),S.detectedDomains.length>0&&ai.orchestrate(S.detectedDomains);for(let C of S.agents){let j=C.domain||C.name.replace(".md","");ai.startAgent(C.name,j,`Loading ${j} specialist...`),ai.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));am(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let I={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await mt.loadState(i),B=null,ve=null;i.projectId&&(B={commit_footer:await Ue.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ue.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ue.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ue.getSmartDecision(i.projectId,`preferred_agent_${e}`)},ve=await Ue.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let $e={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Be=await mg.build(o,I,D,null,B,null,ve,$e,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Ds.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:I,state:D,prompt:Be,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:I.agentsPath,agentRoutingPath:I.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:B,relevantMemories:ve,orchestratorContext:S,memory:{create:l(C=>Ue.createMemory(i.projectId,C),"create"),autoRemember:l((C,j,Re)=>Ue.autoRemember(i.projectId,C,j,Re),"autoRemember"),search:l(C=>Ue.searchMemories(i.projectId,C),"search"),findByTags:l(C=>Ue.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>Ue.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Fe.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Fe.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Fe.proposePlan(i.projectId,C),"propose"),approve:l(C=>Fe.approvePlan(i.projectId,C),"approve"),reject:l(C=>Fe.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Fe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Fe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Fe.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Fe.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Fe.failStep(i.projectId,C),"failStep"),abort:l(C=>Fe.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Fe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Ds.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Ds.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Xe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Xe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ua.load(e)).frontmatter["allowed-tools"]||[],i=await mt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},$P=new Al,Si=$P});import bi from"node:fs/promises";import MP from"node:https";import OP from"node:os";import Rl from"node:path";import Lt from"chalk";var Dl,wg,kg=w(()=>{"use strict";F();Me();Dl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(OP.homedir(),".prjct-cli","config"),this.cacheFile=Rl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rl.join(__dirname,"..","..","package.json");return JSON.parse(await bi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=MP.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await R(this.cacheFile))return JSON.parse(await bi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await R(this.cacheDir)||await bi.mkdir(this.cacheDir,{recursive:!0}),await bi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
824
+ `+Lt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
825
+ `+Lt.yellow("\u2502")+" "+Lt.bold("Update available!")+" "+Lt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Lt.yellow("\u2502")+`
826
+ `+Lt.yellow("\u2502")+" "+Lt.yellow("\u2502")+`
827
+ `+Lt.yellow("\u2502")+" Run: "+Lt.cyan("npm update -g prjct-cli")+" "+Lt.yellow("\u2502")+`
828
+ `+Lt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
829
+ `}},wg=Dl});var be,nt=w(()=>{"use strict";Il();nl();Tl();wt();ke();kg();ln();oe();Me();zn();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new wg,this.updateNotificationShown=!1,this.commandExecutor=Si}get agent(){return ws.getAgent()}get agentInfo(){return ws.getInfo()}get currentAuthor(){return Tn.getCurrentAuthor()}async initializeAgent(){return ws.initialize()}async ensureProjectInit(e){return Tn.ensureInit(e)}async ensureAuthor(){return Tn.ensureAuthor()}async getGlobalProjectPath(e){return Tn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return lt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Tn.isEmptyDirectory(e)}async _detectExistingCode(e){return Tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return jo.breakdownFeature(e)}_detectBugSeverity(e){return jo.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ws.assignForTask(e,t,n)}}});var Sg={};jn(Sg,{PlanningCommands:()=>es});import Zn from"node:path";async function FP(){if(!jl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Pi(),bg));jl=new r}return jl}var jl,es,Ci=w(()=>{"use strict";To();Sn();Dt();Xt();Ir();F();Es();As();Jc();Zc();nt();jl=null;l(FP,"getAnalysisCommands");es=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Rs(t).runNonInteractive());else if(a=await new Rs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ys(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
830
830
 
831
831
  No current task. Use \`/p:now\` to set focus.
832
832
  `,"core/next.md":`# NEXT
@@ -855,8 +855,8 @@ ${S}
855
855
  Initialized - awaiting stack recommendation
856
856
 
857
857
  Generated: ${new Date().toLocaleString()}
858
- `;return await Xe.get("Write")(I,D),await ve.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await ve.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await mt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ge(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await xe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:z.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await mt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await xe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Bug Reported",e),dt({Severity:a,Priority:m,Agent:u}),ue([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
859
- `);let s=await this.getGlobalProjectPath(t),o=Zn.join(s,"planning","architect-session.md"),i;try{i=await ye.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
858
+ `;return await Xe.get("Write")(I,D),await xe.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await xe.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await mt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ge(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await fe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:z.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await mt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await fe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:z.getTimestamp()}),n.md?console.log(N(Z("Bug Reported",e),dt({Severity:a,Priority:m,Agent:u}),ue([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
859
+ `);let s=await this.getGlobalProjectPath(t),o=Zn.join(s,"planning","architect-session.md"),i;try{i=await we.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
860
860
 
861
861
  Create a plan first:
862
862
  1. Run /p:init in an empty directory
@@ -899,7 +899,7 @@ Generated: ${new Date().toLocaleString()}
899
899
  `),{success:!0,specs:[]}):(console.log(`
900
900
  \u{1F4CB} SPECIFICATIONS
901
901
  `),console.log("\u2550".repeat(50)),f.forEach((k,S)=>{let I=k.replace(".md","").replace(/-/g," ");console.log(` ${S+1}. ${I}`)}),console.log(`${"\u2550".repeat(50)}
902
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=Zn.join(o,"planning","specs");await ye.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Zn.join(i,`${a}.md`),u=`# Specification: ${e}
902
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=Zn.join(o,"planning","specs");await we.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Zn.join(i,`${a}.md`),u=`# Specification: ${e}
903
903
 
904
904
  ## Overview
905
905
  [Brief description of the feature]
@@ -931,19 +931,19 @@ Created: ${new Date().toLocaleString()}
931
931
  Status: Draft
932
932
  `;return await Xe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:z.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
933
933
  \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
934
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async _seedShipWorkflow(e,t){let n=await ti(t),s=0;Te.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var vi,Tn,Cg=w(()=>{"use strict";rn();To();wt();we();F();Me();zn();vi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ci(),Sg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw go.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await x.ensureProjectStructure(t),x.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ys();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await sn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await sn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Tn=new vi});var _P,Pg,vg,$l,xg,Tg=w(()=>{"use strict";ne();oe();_P=1800*1e3,Pg=50,vg=200,$l=class{static{l(this,"SessionTracker")}async read(e){try{return A.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){A.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:_P}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Pg&&(s.current.commands=s.current.commands.slice(-Pg)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>vg&&(s.current.files=s.current.files.slice(-vg)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:nn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:nn(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},xg=new $l});import{exec as NP}from"node:child_process";import{promisify as LP}from"node:util";var Ml,UP,xi,Nr,Eg=w(()=>{"use strict";ne();F();Tg();Ml=LP(NP),UP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},xi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...UP,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=A.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Ml("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([Ml(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ml(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
934
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async _seedShipWorkflow(e,t){let n=await ti(t),s=0;Te.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var vi,Tn,Cg=w(()=>{"use strict";rn();To();wt();ke();F();Me();zn();vi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ci(),Sg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw go.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await x.ensureProjectStructure(t),x.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ys();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await sn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await sn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Tn=new vi});var _P,Pg,vg,$l,xg,Tg=w(()=>{"use strict";ne();oe();_P=1800*1e3,Pg=50,vg=200,$l=class{static{l(this,"SessionTracker")}async read(e){try{return A.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){A.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:_P}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Pg&&(s.current.commands=s.current.commands.slice(-Pg)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>vg&&(s.current.files=s.current.files.slice(-vg)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:nn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:nn(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},xg=new $l});import{exec as NP}from"node:child_process";import{promisify as LP}from"node:util";var Ml,UP,xi,Nr,Eg=w(()=>{"use strict";ne();F();Tg();Ml=LP(NP),UP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},xi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...UP,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=A.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Ml("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([Ml(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ml(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
935
935
  `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${y(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
936
936
  `)}async getSessionInfo(e){return xg.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
937
937
  `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
938
- `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},Nr=l((r,e)=>new xi(r,e),"createStalenessChecker")});import Rg from"node:fs/promises";import Ti from"node:path";function Ds(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 zP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...Ds(p));let s=[/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 s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...Ds(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(...Ds(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(...Ds(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...Ds(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Dg.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function WP(r){return r.split(/\s+/).flatMap(e=>Ds(e)).filter(e=>e.length>1&&!Dg.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function jg(r,e){let t=[],n=await Rg.readdir(r,{withFileTypes:!0});for(let s of n){if(GP.has(s.name))continue;let o=Ti.join(r,s.name);if(s.isDirectory())t.push(...await jg(o,e));else if(s.isFile()){let i=Ti.extname(s.name).toLowerCase();HP.has(i)&&t.push(Ti.relative(e,o))}}return t}async function VP(r){let e=await jg(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await Rg.readFile(Ti.join(r,d),"utf-8"),p=zP(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function BP(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function JP(r,e){let t=WP(r);if(t.length===0)return[];let n=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=BP(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(Ag+1),m=c+Ag*(1-Ig+Ig*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function qP(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};L.setDoc(r,$g,t)}function KP(r){let e=L.getDoc(r,$g);if(!e)return null;let t={};for(let[n,s]of Object.entries(e.docLengths))t[n]={tokens:[],length:s};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Mg(r,e){let t=await VP(r);return qP(e,t),t}function Og(r,e,t=15){let n=KP(r);return n?JP(e,n).slice(0,t):[]}var Ag,Ig,HP,Dg,GP,$g,Ol=w(()=>{"use strict";ne();Ag=1.2,Ig=.75,HP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Dg=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"]),GP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(Ds,"splitIdentifier");l(zP,"tokenizeFile");l(WP,"tokenizeQuery");l(jg,"listFiles");l(VP,"buildIndex");l(BP,"idf");l(JP,"score");$g="bm25-index";l(qP,"saveIndex");l(KP,"loadIndex");l(Mg,"indexProject");l(Og,"queryFiles")});import Fl from"node:fs/promises";import un from"node:path";function ev(r){let e=[],t,n=new RegExp(ZP.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function tv(r,e,t){let n;if(r.startsWith("@/"))n=un.join(t,"src",r.slice(2));else{let s=un.dirname(un.join(t,e));n=un.resolve(s,r)}for(let s of QP){let o=n+s;try{if((await Fl.stat(o)).isFile())return un.relative(t,o)}catch{}}return null}async function Fg(r,e){let t=[],n=await Fl.readdir(r,{withFileTypes:!0});for(let s of n){if(YP.has(s.name))continue;let o=un.join(r,s.name);if(s.isDirectory())t.push(...await Fg(o,e));else if(s.isFile()){let i=un.extname(s.name).toLowerCase();XP.has(i)&&t.push(un.relative(e,o))}}return t}async function nv(r){let e=await Fg(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await Fl.readFile(un.join(r,u),"utf-8"),m=ev(d),p=[];for(let g of m){let f=await tv(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function sv(r,e){L.setDoc(r,_g,e)}function Ng(r){return L.getDoc(r,_g)}async function Lg(r,e){let t=await nv(r);return sv(e,t),t}var XP,YP,QP,ZP,_g,_l=w(()=>{"use strict";ne();XP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),YP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),QP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ZP=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(ev,"extractImportSources");l(tv,"resolveImport");l(Fg,"listFiles");l(nv,"buildGraph");_g="import-graph";l(sv,"saveGraph");l(Ng,"loadGraph");l(Lg,"indexImports")});function Ug(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Ng(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Hg(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Gg=w(()=>{"use strict";_l();l(Ug,"propagateChanges");l(Hg,"affectedDomains")});import Nl from"node:fs/promises";import Ei from"node:path";async function zg(r,e){let t=[],n=await Nl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(ov.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Ei.join(r,o);if(s.isDirectory())t.push(...await zg(i,e));else if(s.isFile()){let a=Ei.extname(o).toLowerCase();rv.has(a)&&t.push(Ei.relative(e,i))}}return t}function iv(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function av(r){let e=await zg(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=Ei.join(r,a),[u,d]=await Promise.all([Nl.readFile(c,"utf-8"),Nl.stat(c)]);return{path:a,hash:iv(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function cv(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function Ll(r,e){let t=L.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),L.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function lv(r){let e=new Map;try{let t=L.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Ul(r,e){let[t,n]=await Promise.all([av(r),Promise.resolve(lv(e))]);return{diff:cv(t,n),currentHashes:t}}function Wg(r){return L.hasDoc(r,"file-hashes-meta")}var rv,ov,Vg=w(()=>{"use strict";ne();rv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),ov=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(zg,"listProjectFiles");l(iv,"hashContent");l(av,"computeHashes");l(cv,"diffHashes");l(Ll,"saveHashes");l(lv,"loadHashes");l(Ul,"detectChanges");l(Wg,"hasHashRegistry")});import{exec as uv}from"node:child_process";import{promisify as dv}from"node:util";async function gv(r,e=100){try{let{stdout:t}=await pv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
939
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Jg&&n.push(s),s=new Set):i&&s&&fv(i)&&s.add(i)}return s&&s.size>0&&s.size<=Jg&&n.push(s),n}catch{return[]}}function fv(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function hv(r,e=100){let t=await gv(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=yv(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<Bg||m<Bg)continue;let p=d+m-a,g=p>0?a/p:0;g<mv||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function yv(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function kv(r,e){L.setDoc(r,wv,e)}async function qg(r,e,t=100){let n=await hv(r,t);return kv(e,n),n}var pv,mv,Bg,Jg,wv,Kg=w(()=>{"use strict";ne();pv=dv(uv),mv=.1,Bg=2,Jg=30;l(gv,"parseGitLog");l(fv,"isSourceFile");l(hv,"buildMatrix");l(yv,"pairKey");wv="cochange-index";l(kv,"saveMatrix");l(qg,"indexCoChanges")});import js from"node:fs/promises";import Sv from"node:os";import Xg from"node:path";var Hl,bv,Yg,Qg=w(()=>{"use strict";F();Hl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Sv.homedir(),this.configDir=Xg.join(this.homeDir,".prjct-cli","config"),this.configFile=Xg.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await js.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await js.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await js.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",y(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await js.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await js.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await js.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},bv=new Hl,Yg=bv});var zl={};jn(zl,{installAntigravitySkill:()=>sf,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>Ev,run:()=>nf,verifyCodexPRouterReady:()=>Ii});import{execSync as Cv}from"node:child_process";import{createHash as Pv}from"node:crypto";import V from"node:fs/promises";import ts from"node:os";import ee from"node:path";import de from"chalk";async function vv(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Cs.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Cv(`npm install -g ${e}`,{stdio:"inherit",timeout:bs("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function nf(){let r=await ir(),e=await ga(),t=ot[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=ot[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await vv(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await ve.detectClaude()){let p=await ve.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await ve.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await ve.installDocs(),await Dv(),await on.ensureReady()}}else if(a==="gemini"){await xv()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await Tv();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await oo()).installed&&(await sf()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Mn()).installed){if(!(await Gl()).success)throw new Error("Codex skill installation failed");let c=await Ii({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await Yg.saveConfig(Ve,await ve.getInstallPath(),e.provider),await Rv();for(let a of n.providers)jv(a,ot[a.provider]);return n}async function xv(){try{let r=ee.join(ts.homedir(),".gemini","commands"),e=ee.join(r,"p.toml");await V.mkdir(r,{recursive:!0});let t=le("commands/p.toml");if(t)return await V.writeFile(e,t,"utf-8"),!0;let n=ee.join(ce,"templates","commands","p.toml");return await R(n)?(await V.copyFile(n,e),!0):!1}catch(r){return U.warn(`Gemini router warning: ${y(r)}`),!1}}async function Tv(){try{let r=ee.join(ts.homedir(),".gemini"),e=ee.join(r,"GEMINI.md");await V.mkdir(r,{recursive:!0});let t=le("global/GEMINI.md");if(!t){let p=ee.join(ce,"templates","global","GEMINI.md");t=await V.readFile(p,"utf-8")}let n="",s=!1;try{n=await V.readFile(e,"utf-8"),s=!0}catch(p){if(P(p))s=!1;else throw p}if(!s)return await V.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
938
+ `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},Nr=l((r,e)=>new xi(r,e),"createStalenessChecker")});import Rg from"node:fs/promises";import Ti from"node:path";function js(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 zP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...js(p));let s=[/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 s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...js(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(...js(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(...js(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...js(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Dg.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function WP(r){return r.split(/\s+/).flatMap(e=>js(e)).filter(e=>e.length>1&&!Dg.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function jg(r,e){let t=[],n=await Rg.readdir(r,{withFileTypes:!0});for(let s of n){if(GP.has(s.name))continue;let o=Ti.join(r,s.name);if(s.isDirectory())t.push(...await jg(o,e));else if(s.isFile()){let i=Ti.extname(s.name).toLowerCase();HP.has(i)&&t.push(Ti.relative(e,o))}}return t}async function VP(r){let e=await jg(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await Rg.readFile(Ti.join(r,d),"utf-8"),p=zP(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function BP(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function JP(r,e){let t=WP(r);if(t.length===0)return[];let n=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=BP(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(Ag+1),m=c+Ag*(1-Ig+Ig*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function qP(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};L.setDoc(r,$g,t)}function KP(r){let e=L.getDoc(r,$g);if(!e)return null;let t={};for(let[n,s]of Object.entries(e.docLengths))t[n]={tokens:[],length:s};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Mg(r,e){let t=await VP(r);return qP(e,t),t}function Og(r,e,t=15){let n=KP(r);return n?JP(e,n).slice(0,t):[]}var Ag,Ig,HP,Dg,GP,$g,Ol=w(()=>{"use strict";ne();Ag=1.2,Ig=.75,HP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Dg=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"]),GP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(js,"splitIdentifier");l(zP,"tokenizeFile");l(WP,"tokenizeQuery");l(jg,"listFiles");l(VP,"buildIndex");l(BP,"idf");l(JP,"score");$g="bm25-index";l(qP,"saveIndex");l(KP,"loadIndex");l(Mg,"indexProject");l(Og,"queryFiles")});import Fl from"node:fs/promises";import un from"node:path";function ev(r){let e=[],t,n=new RegExp(ZP.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function tv(r,e,t){let n;if(r.startsWith("@/"))n=un.join(t,"src",r.slice(2));else{let s=un.dirname(un.join(t,e));n=un.resolve(s,r)}for(let s of QP){let o=n+s;try{if((await Fl.stat(o)).isFile())return un.relative(t,o)}catch{}}return null}async function Fg(r,e){let t=[],n=await Fl.readdir(r,{withFileTypes:!0});for(let s of n){if(YP.has(s.name))continue;let o=un.join(r,s.name);if(s.isDirectory())t.push(...await Fg(o,e));else if(s.isFile()){let i=un.extname(s.name).toLowerCase();XP.has(i)&&t.push(un.relative(e,o))}}return t}async function nv(r){let e=await Fg(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await Fl.readFile(un.join(r,u),"utf-8"),m=ev(d),p=[];for(let g of m){let f=await tv(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function sv(r,e){L.setDoc(r,_g,e)}function Ng(r){return L.getDoc(r,_g)}async function Lg(r,e){let t=await nv(r);return sv(e,t),t}var XP,YP,QP,ZP,_g,_l=w(()=>{"use strict";ne();XP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),YP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),QP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ZP=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(ev,"extractImportSources");l(tv,"resolveImport");l(Fg,"listFiles");l(nv,"buildGraph");_g="import-graph";l(sv,"saveGraph");l(Ng,"loadGraph");l(Lg,"indexImports")});function Ug(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Ng(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Hg(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Gg=w(()=>{"use strict";_l();l(Ug,"propagateChanges");l(Hg,"affectedDomains")});import Nl from"node:fs/promises";import Ei from"node:path";async function zg(r,e){let t=[],n=await Nl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(ov.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Ei.join(r,o);if(s.isDirectory())t.push(...await zg(i,e));else if(s.isFile()){let a=Ei.extname(o).toLowerCase();rv.has(a)&&t.push(Ei.relative(e,i))}}return t}function iv(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function av(r){let e=await zg(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=Ei.join(r,a),[u,d]=await Promise.all([Nl.readFile(c,"utf-8"),Nl.stat(c)]);return{path:a,hash:iv(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function cv(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function Ll(r,e){let t=L.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),L.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function lv(r){let e=new Map;try{let t=L.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Ul(r,e){let[t,n]=await Promise.all([av(r),Promise.resolve(lv(e))]);return{diff:cv(t,n),currentHashes:t}}function Wg(r){return L.hasDoc(r,"file-hashes-meta")}var rv,ov,Vg=w(()=>{"use strict";ne();rv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),ov=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(zg,"listProjectFiles");l(iv,"hashContent");l(av,"computeHashes");l(cv,"diffHashes");l(Ll,"saveHashes");l(lv,"loadHashes");l(Ul,"detectChanges");l(Wg,"hasHashRegistry")});import{exec as uv}from"node:child_process";import{promisify as dv}from"node:util";async function gv(r,e=100){try{let{stdout:t}=await pv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
939
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Jg&&n.push(s),s=new Set):i&&s&&fv(i)&&s.add(i)}return s&&s.size>0&&s.size<=Jg&&n.push(s),n}catch{return[]}}function fv(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function hv(r,e=100){let t=await gv(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=yv(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<Bg||m<Bg)continue;let p=d+m-a,g=p>0?a/p:0;g<mv||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function yv(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function kv(r,e){L.setDoc(r,wv,e)}async function qg(r,e,t=100){let n=await hv(r,t);return kv(e,n),n}var pv,mv,Bg,Jg,wv,Kg=w(()=>{"use strict";ne();pv=dv(uv),mv=.1,Bg=2,Jg=30;l(gv,"parseGitLog");l(fv,"isSourceFile");l(hv,"buildMatrix");l(yv,"pairKey");wv="cochange-index";l(kv,"saveMatrix");l(qg,"indexCoChanges")});import $s from"node:fs/promises";import Sv from"node:os";import Xg from"node:path";var Hl,bv,Yg,Qg=w(()=>{"use strict";F();Hl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Sv.homedir(),this.configDir=Xg.join(this.homeDir,".prjct-cli","config"),this.configFile=Xg.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await $s.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await $s.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await $s.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",y(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await $s.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await $s.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await $s.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},bv=new Hl,Yg=bv});var zl={};jn(zl,{installAntigravitySkill:()=>sf,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>Ev,run:()=>nf,verifyCodexPRouterReady:()=>Ii});import{execSync as Cv}from"node:child_process";import{createHash as Pv}from"node:crypto";import V from"node:fs/promises";import ts from"node:os";import ee from"node:path";import de from"chalk";async function vv(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Cs.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Cv(`npm install -g ${e}`,{stdio:"inherit",timeout:bs("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function nf(){let r=await ar(),e=await ga(),t=ot[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=ot[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await vv(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await xe.detectClaude()){let p=await xe.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await xe.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await xe.installDocs(),await Dv(),await on.ensureReady()}}else if(a==="gemini"){await xv()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await Tv();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await oo()).installed&&(await sf()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Mn()).installed){if(!(await Gl()).success)throw new Error("Codex skill installation failed");let c=await Ii({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await Yg.saveConfig(Oe,await xe.getInstallPath(),e.provider),await Rv();for(let a of n.providers)jv(a,ot[a.provider]);return n}async function xv(){try{let r=ee.join(ts.homedir(),".gemini","commands"),e=ee.join(r,"p.toml");await V.mkdir(r,{recursive:!0});let t=le("commands/p.toml");if(t)return await V.writeFile(e,t,"utf-8"),!0;let n=ee.join(ce,"templates","commands","p.toml");return await R(n)?(await V.copyFile(n,e),!0):!1}catch(r){return U.warn(`Gemini router warning: ${y(r)}`),!1}}async function Tv(){try{let r=ee.join(ts.homedir(),".gemini"),e=ee.join(r,"GEMINI.md");await V.mkdir(r,{recursive:!0});let t=le("global/GEMINI.md");if(!t){let p=ee.join(ce,"templates","global","GEMINI.md");t=await V.readFile(p,"utf-8")}let n="",s=!1;try{n=await V.readFile(e,"utf-8"),s=!0}catch(p){if(P(p))s=!1;else throw p}if(!s)return await V.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
940
940
 
941
- ${t}`;return await V.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await V.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return U.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function sf(){try{let r=ee.join(ts.homedir(),".gemini","antigravity","skills"),e=ee.join(r,"prjct"),t=ee.join(e,"SKILL.md");await V.mkdir(e,{recursive:!0});let n=await R(t),s=le("antigravity/SKILL.md");if(!s){let o=ee.join(ce,"templates","antigravity","SKILL.md");if(!await R(o))return U.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await V.readFile(o,"utf-8")}return await V.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return U.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ev(){let r=await oo();return r.installed&&!r.skillInstalled}function of(){return ee.join(ts.homedir(),".codex","skills","prjct","SKILL.md")}function Av(r){return`<!-- ${rf}: ${JSON.stringify({version:Ve,templateHash:r})} -->`}function Zg(r){let e=r.match(new RegExp(`<!--\\s*${rf}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Iv(r){return Pv("sha256").update(r).digest("hex")}async function af(){let r=le("codex/SKILL.md");if(r)return r;let e=ee.join(ce,"templates","codex","SKILL.md");return await R(e)?V.readFile(e,"utf-8"):null}function cf(r){let e=r.trimEnd(),t=Iv(e),n=Av(t);return{content:`${e}
941
+ ${t}`;return await V.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await V.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return U.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function sf(){try{let r=ee.join(ts.homedir(),".gemini","antigravity","skills"),e=ee.join(r,"prjct"),t=ee.join(e,"SKILL.md");await V.mkdir(e,{recursive:!0});let n=await R(t),s=le("antigravity/SKILL.md");if(!s){let o=ee.join(ce,"templates","antigravity","SKILL.md");if(!await R(o))return U.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await V.readFile(o,"utf-8")}return await V.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return U.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ev(){let r=await oo();return r.installed&&!r.skillInstalled}function of(){return ee.join(ts.homedir(),".codex","skills","prjct","SKILL.md")}function Av(r){return`<!-- ${rf}: ${JSON.stringify({version:Oe,templateHash:r})} -->`}function Zg(r){let e=r.match(new RegExp(`<!--\\s*${rf}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Iv(r){return Pv("sha256").update(r).digest("hex")}async function af(){let r=le("codex/SKILL.md");if(r)return r;let e=ee.join(ce,"templates","codex","SKILL.md");return await R(e)?V.readFile(e,"utf-8"):null}function cf(r){let e=r.trimEnd(),t=Iv(e),n=Av(t);return{content:`${e}
942
942
 
943
943
  ${n}
944
- `,templateHash:t}}async function Gl(){try{let r=of(),e=ee.dirname(r);await V.mkdir(e,{recursive:!0});let t=await R(r),n=await af();if(!n)return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=cf(n);return t&&await V.readFile(r,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await V.writeFile(r,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return U.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ii(r={}){let e=of();if(!(await Mn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await af();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=cf(n),o=l(async()=>r.autoRepair?(await Gl()).success:!1,"maybeRepair"),i="";if(!await R(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await V.readFile(e,"utf-8").catch(()=>"");let a=Zg(i);if(!(a?.version===Ve&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await V.readFile(e,"utf-8").catch(()=>""),a=Zg(i),!(a?.version===Ve&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await yc.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=hc(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function Rv(){try{let r=ee.join(ts.homedir(),".prjct-cli","projects");if(!await R(r))return;let e=(await V.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=A.getDoc(n,"project");if(!s)continue;s.cliVersion!==Ve&&(s.cliVersion=Ve,A.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${Ve}`)}catch(r){P(r)||U.warn(`Migration warning: ${y(r)}`)}}async function ef(r,e){let t={};if(await R(r))try{t=JSON.parse(await V.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await V.writeFile(r,JSON.stringify(t,null,2))}async function Dv(){try{let r=ee.join(ts.homedir(),".claude"),e=ee.join(r,"settings.json"),t=ee.join(r,"prjct-statusline.sh"),n=ee.join(ts.homedir(),".prjct-cli","statusline"),s=ee.join(n,"statusline.sh"),o=ee.join(n,"themes"),i=ee.join(n,"lib"),a=ee.join(n,"components"),c=ee.join(n,"config.json"),u=ee.join(ce,"assets","statusline"),d=ee.join(u,"statusline.sh"),m=ee.join(u,"themes"),p=ee.join(u,"lib"),g=ee.join(u,"components"),f=ee.join(u,"default-config.json");if(await R(r)||await V.mkdir(r,{recursive:!0}),await R(n)||await V.mkdir(n,{recursive:!0}),await R(o)||await V.mkdir(o,{recursive:!0}),await R(i)||await V.mkdir(i,{recursive:!0}),await R(a)||await V.mkdir(a,{recursive:!0}),await R(s)){let k=await V.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let S=k.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==Ve){let I=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ve}"`);await V.writeFile(s,I,{mode:493})}await Ai(p,i),await Ai(g,a),await tf(t,s),await ef(e,t);return}}if(await R(d)){let k=await V.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ve}"`),await V.writeFile(s,k,{mode:493}),await Ai(p,i),await Ai(g,a),await R(m)){let S=await V.readdir(m);for(let I of S){let D=ee.join(m,I),B=ee.join(o,I);await V.copyFile(D,B)}}!await R(c)&&await R(f)&&await V.copyFile(f,c)}else{let k=`#!/bin/bash
944
+ `,templateHash:t}}async function Gl(){try{let r=of(),e=ee.dirname(r);await V.mkdir(e,{recursive:!0});let t=await R(r),n=await af();if(!n)return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=cf(n);return t&&await V.readFile(r,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await V.writeFile(r,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return U.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ii(r={}){let e=of();if(!(await Mn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await af();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=cf(n),o=l(async()=>r.autoRepair?(await Gl()).success:!1,"maybeRepair"),i="";if(!await R(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await V.readFile(e,"utf-8").catch(()=>"");let a=Zg(i);if(!(a?.version===Oe&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await V.readFile(e,"utf-8").catch(()=>""),a=Zg(i),!(a?.version===Oe&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await yc.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=hc(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function Rv(){try{let r=ee.join(ts.homedir(),".prjct-cli","projects");if(!await R(r))return;let e=(await V.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=A.getDoc(n,"project");if(!s)continue;s.cliVersion!==Oe&&(s.cliVersion=Oe,A.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${Oe}`)}catch(r){P(r)||U.warn(`Migration warning: ${y(r)}`)}}async function ef(r,e){let t={};if(await R(r))try{t=JSON.parse(await V.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await V.writeFile(r,JSON.stringify(t,null,2))}async function Dv(){try{let r=ee.join(ts.homedir(),".claude"),e=ee.join(r,"settings.json"),t=ee.join(r,"prjct-statusline.sh"),n=ee.join(ts.homedir(),".prjct-cli","statusline"),s=ee.join(n,"statusline.sh"),o=ee.join(n,"themes"),i=ee.join(n,"lib"),a=ee.join(n,"components"),c=ee.join(n,"config.json"),u=ee.join(ce,"assets","statusline"),d=ee.join(u,"statusline.sh"),m=ee.join(u,"themes"),p=ee.join(u,"lib"),g=ee.join(u,"components"),f=ee.join(u,"default-config.json");if(await R(r)||await V.mkdir(r,{recursive:!0}),await R(n)||await V.mkdir(n,{recursive:!0}),await R(o)||await V.mkdir(o,{recursive:!0}),await R(i)||await V.mkdir(i,{recursive:!0}),await R(a)||await V.mkdir(a,{recursive:!0}),await R(s)){let k=await V.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let S=k.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==Oe){let I=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`);await V.writeFile(s,I,{mode:493})}await Ai(p,i),await Ai(g,a),await tf(t,s),await ef(e,t);return}}if(await R(d)){let k=await V.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Oe}"`),await V.writeFile(s,k,{mode:493}),await Ai(p,i),await Ai(g,a),await R(m)){let S=await V.readdir(m);for(let I of S){let D=ee.join(m,I),B=ee.join(o,I);await V.copyFile(D,B)}}!await R(c)&&await R(f)&&await V.copyFile(f,c)}else{let k=`#!/bin/bash
945
945
  # prjct Status Line for Claude Code
946
- CLI_VERSION="${Ve}"
946
+ CLI_VERSION="${Oe}"
947
947
  input=$(cat)
948
948
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
949
949
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -972,7 +972,7 @@ if [ -f "$CONFIG" ]; then
972
972
  fi
973
973
  fi
974
974
  echo "prjct"
975
- `;await V.writeFile(s,k,{mode:493})}await tf(t,s),await ef(e,t)}catch(r){P(r)||U.warn(`Status line warning: ${y(r)}`)}}async function Ai(r,e){if(!await R(r))return;let t=await V.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=ee.join(r,n),o=ee.join(e,n);await V.copyFile(s,o),await V.chmod(o,493)}}async function tf(r,e){try{if(await R(r)){if((await V.lstat(r)).isSymbolicLink()&&await V.readlink(r)===e)return;await V.unlink(r)}await V.symlink(e,r)}catch{try{await R(e)&&(await V.copyFile(e,r),await V.chmod(r,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function jv(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${de.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var rf,$v,Ri=w(()=>{"use strict";Jt();Ss();Go();wc();ne();F();an();Me();vn();Bt();Ze();Sn();Qg();l(vv,"installAICLI");l(nf,"run");l(xv,"installGeminiRouter");l(Tv,"installGeminiGlobalConfig");l(sf,"installAntigravitySkill");l(Ev,"needsAntigravityInstallation");rf="prjct-codex-router";l(of,"getCodexSkillPath");l(Av,"getCodexSkillMetadata");l(Zg,"parseCodexSkillMetadata");l(Iv,"hashContent");l(af,"loadCodexSkillTemplate");l(cf,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(Ii,"verifyCodexPRouterReady");l(Rv,"migrateProjectsCliVersion");l(ef,"ensureStatusLineSettings");l(Dv,"installStatusLine");l(Ai,"installStatusLineModules");l(tf,"ensureStatusLineSymlink");l(jv,"showResults");$v=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");$v&&nf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Tt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ns(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var Wl=w(()=>{"use strict";l(Tt,"cite");l(ns,"defaultSources")});function Lr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
975
+ `;await V.writeFile(s,k,{mode:493})}await tf(t,s),await ef(e,t)}catch(r){P(r)||U.warn(`Status line warning: ${y(r)}`)}}async function Ai(r,e){if(!await R(r))return;let t=await V.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=ee.join(r,n),o=ee.join(e,n);await V.copyFile(s,o),await V.chmod(o,493)}}async function tf(r,e){try{if(await R(r)){if((await V.lstat(r)).isSymbolicLink()&&await V.readlink(r)===e)return;await V.unlink(r)}await V.symlink(e,r)}catch{try{await R(e)&&(await V.copyFile(e,r),await V.chmod(r,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function jv(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${de.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var rf,$v,Ri=w(()=>{"use strict";Jt();Ss();Go();wc();ne();F();an();Me();vn();$t();Ze();Sn();Qg();l(vv,"installAICLI");l(nf,"run");l(xv,"installGeminiRouter");l(Tv,"installGeminiGlobalConfig");l(sf,"installAntigravitySkill");l(Ev,"needsAntigravityInstallation");rf="prjct-codex-router";l(of,"getCodexSkillPath");l(Av,"getCodexSkillMetadata");l(Zg,"parseCodexSkillMetadata");l(Iv,"hashContent");l(af,"loadCodexSkillTemplate");l(cf,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(Ii,"verifyCodexPRouterReady");l(Rv,"migrateProjectsCliVersion");l(ef,"ensureStatusLineSettings");l(Dv,"installStatusLine");l(Ai,"installStatusLineModules");l(tf,"ensureStatusLineSymlink");l(jv,"showResults");$v=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");$v&&nf().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Tt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ns(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var Wl=w(()=>{"use strict";l(Tt,"cite");l(ns,"defaultSources")});function Lr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
976
976
  `)}function Ur(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
977
977
  `)}function lf(r){let e=[];return r.packageManager&&e.push(`- Package Manager: \`${r.packageManager}\``),r.sourceDir&&e.push(`- Source: \`${r.sourceDir}/\``),r.testDir&&e.push(`- Tests: \`${r.testDir}/\``),e.length>0?`
978
978
  ### Project Structure
@@ -1084,11 +1084,11 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
1084
1084
  `)}function Nv(r,e){let t=r.sources||ns(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(Tt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Tt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(Lr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Ur(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
1085
1085
  `)}function Lv(r,e){let t=[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
1086
1086
  `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function Uv(r,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${r.name} \u2014 Project Context`),t.push(`<!-- projectId: ${r.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(Lr(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(Ur(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
1087
- `)}function uf(r){return{claude:Ov,cursor:Fv,copilot:_v,windsurf:Nv,continue:Lv,codex:Uv}[r]||null}var Vl=w(()=>{"use strict";Wl();l(Lr,"formatPatterns");l(Ur,"formatAntiPatterns");l(lf,"formatStructure");l(Mv,"formatAnalysisForClaude");l(Ov,"formatForClaude");l(Fv,"formatForCursor");l(_v,"formatForCopilot");l(Nv,"formatForWindsurf");l(Lv,"formatForContinue");l(Uv,"formatForCodex");l(uf,"getFormatter")});import{exec as Hv}from"node:child_process";import df from"node:os";import Zt from"node:path";import{promisify as Gv}from"node:util";function pf(r){return ji[r]||null}function mf(r){let e=df.homedir();switch(r){case"claude":return Zt.join(e,".claude","CLAUDE.md");case"gemini":return Zt.join(e,".gemini","GEMINI.md");case"codex":return Zt.join(e,".codex","CODEX.md");case"aider":return Zt.join(e,".aider","AIDER.md");default:return""}}async function Di(r){try{return await zv(`which ${r}`),!0}catch{return!1}}async function $i(r=process.cwd()){let e=[];return await Di("claude")&&e.push("claude"),(await Di("cursor")||await R(Zt.join(r,".cursor")))&&e.push("cursor"),await R(Zt.join(r,".github"))&&e.push("copilot"),(await Di("windsurf")||await R(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await R(Zt.join(r,".continue"))||await R(Zt.join(df.homedir(),".continue")))&&e.push("continue"),(await Di("codex")||await R(Zt.join(r,".agents")))&&e.push("codex"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await $i(e);return t.length>0?t:["claude"]}return r==="all"?Wv:r.filter(t=>ji[t])}var zv,ji,$s,Wv,Bl=w(()=>{"use strict";Me();zv=Gv(Hv),ji={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},$s=["claude"],Wv=Object.keys(ji);l(pf,"getAIToolConfig");l(mf,"getGlobalConfigPath");l(Di,"commandExists");l($i,"detectInstalledTools");l(gf,"resolveToolIds")});import Hr from"node:fs/promises";import Vv from"node:path";function hf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function Bv(r){let e=[],t="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",n="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->",s=0;for(;;){let o=r.indexOf(t,s);if(o===-1)break;let i=r.indexOf(n,o);if(i===-1){console.warn("\u26A0\uFE0F Found project section without end marker, skipping...");break}let a=r.substring(o,i+n.length),c=hf(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function Jv(r){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=r.indexOf(e),s=r.indexOf(t);return n!==-1&&s!==-1&&s>n?r.substring(n,s+t.length):null}async function yf(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=hf(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await Hr.mkdir(Vv.dirname(r),{recursive:!0});let s="";try{s=await Hr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await ff(r,t);return}let o=Jv(s),i=Bv(s),a=i.findIndex(d=>d.projectId===e),c;a!==-1?(c=[...i],c[a]={projectId:e,startIndex:0,endIndex:0,content:t}):c=[...i,{projectId:e,startIndex:0,endIndex:0,content:t}];let u="";o&&(u+=`${o}
1087
+ `)}function uf(r){return{claude:Ov,cursor:Fv,copilot:_v,windsurf:Nv,continue:Lv,codex:Uv}[r]||null}var Vl=w(()=>{"use strict";Wl();l(Lr,"formatPatterns");l(Ur,"formatAntiPatterns");l(lf,"formatStructure");l(Mv,"formatAnalysisForClaude");l(Ov,"formatForClaude");l(Fv,"formatForCursor");l(_v,"formatForCopilot");l(Nv,"formatForWindsurf");l(Lv,"formatForContinue");l(Uv,"formatForCodex");l(uf,"getFormatter")});import{exec as Hv}from"node:child_process";import df from"node:os";import Zt from"node:path";import{promisify as Gv}from"node:util";function pf(r){return ji[r]||null}function mf(r){let e=df.homedir();switch(r){case"claude":return Zt.join(e,".claude","CLAUDE.md");case"gemini":return Zt.join(e,".gemini","GEMINI.md");case"codex":return Zt.join(e,".codex","CODEX.md");case"aider":return Zt.join(e,".aider","AIDER.md");default:return""}}async function Di(r){try{return await zv(`which ${r}`),!0}catch{return!1}}async function $i(r=process.cwd()){let e=[];return await Di("claude")&&e.push("claude"),(await Di("cursor")||await R(Zt.join(r,".cursor")))&&e.push("cursor"),await R(Zt.join(r,".github"))&&e.push("copilot"),(await Di("windsurf")||await R(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await R(Zt.join(r,".continue"))||await R(Zt.join(df.homedir(),".continue")))&&e.push("continue"),(await Di("codex")||await R(Zt.join(r,".agents")))&&e.push("codex"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await $i(e);return t.length>0?t:["claude"]}return r==="all"?Wv:r.filter(t=>ji[t])}var zv,ji,Ms,Wv,Bl=w(()=>{"use strict";Me();zv=Gv(Hv),ji={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},Ms=["claude"],Wv=Object.keys(ji);l(pf,"getAIToolConfig");l(mf,"getGlobalConfigPath");l(Di,"commandExists");l($i,"detectInstalledTools");l(gf,"resolveToolIds")});import Hr from"node:fs/promises";import Vv from"node:path";function hf(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function Bv(r){let e=[],t="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",n="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->",s=0;for(;;){let o=r.indexOf(t,s);if(o===-1)break;let i=r.indexOf(n,o);if(i===-1){console.warn("\u26A0\uFE0F Found project section without end marker, skipping...");break}let a=r.substring(o,i+n.length),c=hf(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function Jv(r){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=r.indexOf(e),s=r.indexOf(t);return n!==-1&&s!==-1&&s>n?r.substring(n,s+t.length):null}async function yf(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=hf(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await Hr.mkdir(Vv.dirname(r),{recursive:!0});let s="";try{s=await Hr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await ff(r,t);return}let o=Jv(s),i=Bv(s),a=i.findIndex(d=>d.projectId===e),c;a!==-1?(c=[...i],c[a]={projectId:e,startIndex:0,endIndex:0,content:t}):c=[...i,{projectId:e,startIndex:0,endIndex:0,content:t}];let u="";o&&(u+=`${o}
1088
1088
 
1089
1089
  `);for(let d of c)u+=d.content,d!==c[c.length-1]&&(u+=`
1090
1090
 
1091
- `);await ff(r,u)}async function ff(r,e){let t=`${r}.tmp.${Date.now()}`;try{await Hr.writeFile(t,e,"utf-8"),await Hr.rename(t,r)}catch(n){try{await Hr.unlink(t)}catch{}throw n}}var wf=w(()=>{"use strict";l(hf,"extractProjectId");l(Bv,"findProjectSections");l(Jv,"extractGlobalSection");l(yf,"updateProjectSection");l(ff,"writeFileAtomic")});import Jl from"node:fs/promises";import ql from"node:path";async function kf(r,e,t,n=$s){let s=[];for(let o of n){let i=pf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await qv(r,i,e,t);s.push(a)}return s}async function qv(r,e,t,n){let s=uf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;if(e.outputPath==="repo")i=ql.join(n,e.outputFile);else{let a=mf(e.id);a?i=a:i=ql.join(t,"context",e.outputFile)}if(await Jl.mkdir(ql.dirname(i),{recursive:!0}),e.outputPath==="global")await yf(i,r.projectId,o);else{try{let a=await Jl.readFile(i,"utf-8"),c=Va(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Wa(o,a)}catch{}await Jl.writeFile(i,o,"utf-8")}return{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:y(o)}}}var Sf=w(()=>{"use strict";F();Ba();Vl();Bl();wf();l(kf,"generateAIToolContexts");l(qv,"generateForTool")});var bf=w(()=>{"use strict";Vl();Sf();Bl()});async function Cf(r){try{let e=A.getDb(r),t=e.prepare(`
1091
+ `);await ff(r,u)}async function ff(r,e){let t=`${r}.tmp.${Date.now()}`;try{await Hr.writeFile(t,e,"utf-8"),await Hr.rename(t,r)}catch(n){try{await Hr.unlink(t)}catch{}throw n}}var wf=w(()=>{"use strict";l(hf,"extractProjectId");l(Bv,"findProjectSections");l(Jv,"extractGlobalSection");l(yf,"updateProjectSection");l(ff,"writeFileAtomic")});import Jl from"node:fs/promises";import ql from"node:path";async function kf(r,e,t,n=Ms){let s=[];for(let o of n){let i=pf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await qv(r,i,e,t);s.push(a)}return s}async function qv(r,e,t,n){let s=uf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;if(e.outputPath==="repo")i=ql.join(n,e.outputFile);else{let a=mf(e.id);a?i=a:i=ql.join(t,"context",e.outputFile)}if(await Jl.mkdir(ql.dirname(i),{recursive:!0}),e.outputPath==="global")await yf(i,r.projectId,o);else{try{let a=await Jl.readFile(i,"utf-8"),c=Va(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Wa(o,a)}catch{}await Jl.writeFile(i,o,"utf-8")}return{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:y(o)}}}var Sf=w(()=>{"use strict";F();Ba();Vl();Bl();wf();l(kf,"generateAIToolContexts");l(qv,"generateForTool")});var bf=w(()=>{"use strict";Vl();Sf();Bl()});async function Cf(r){try{let e=A.getDb(r),t=e.prepare(`
1092
1092
  SELECT description, completed_at, branch
1093
1093
  FROM tasks
1094
1094
  WHERE status = 'done' OR status = 'shipped'
@@ -1157,11 +1157,11 @@ Domain specialist for ${r} tasks.
1157
1157
  You are the ${r} expert for this project. Apply best practices for the detected stack.
1158
1158
  `}function Nf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Et.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:Y(o)})}),n}async function Lf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Et.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(ux.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Et.access(m),g=!0}catch{try{await Et.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let S=await $f.install(k);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),U.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),U.debug(`Failed to install skill ${d}`,{errors:S.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),U.debug(`Skill install error for ${d}`,{error:Y(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:Y(t)})}return e}var Uf=w(()=>{"use strict";Jt();rn();oe();vn();Mf();l(Of,"generateAgents");l(Ff,"loadExistingAgents");l(_f,"resolveTemplateIncludes");l(dx,"generateWorkflowAgent");l(px,"generateDomainAgent");l(mx,"injectFeedbackSection");l(gx,"generateMinimalWorkflowAgent");l(fx,"generateMinimalDomainAgent");l(Nf,"configureSkills");l(Lf,"autoInstallSkills")});import Hf from"node:fs/promises";import Gf from"node:path";var Mi,zf=w(()=>{"use strict";Mi=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Gf.join(this.projectPath,"package.json"),t=await Hf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Hf.access(Gf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as hx}from"node:child_process";import Wf from"node:fs/promises";import su from"node:path";import{promisify as yx}from"node:util";async function Vf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ss("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await ss("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await ss("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await ss("git status --porcelain",{cwd:r}),i=o.trim().split(`
1159
1159
  `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await ss('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1160
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ss('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:Y(t)})}return e}async function en(r,e){try{return await Wf.access(su.join(r,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:Y(t)}),!1}}async function Bf(r){let e={fileCount:0,version:"0.0.0",name:su.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ss('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:r,error:Y(t)}),e.fileCount=0}try{let t=su.join(r,"package.json"),n=JSON.parse(await Wf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await en(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:r,error:Y(t)})}return await en(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await en(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await en(r,"requirements.txt")||await en(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Jf(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await en(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await en(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await en(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await en(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await en(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function qf(r,e){let t=ns(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Kf(r){return new Mi(r).detect()}var ss,Xf=w(()=>{"use strict";rn();Wl();vn();zf();ss=yx(hx);l(Vf,"analyzeGit");l(en,"fileExists");l(Bf,"gatherStats");l(Jf,"detectCommands");l(qf,"buildSources");l(Kf,"detectStack")});import{exec as wx}from"node:child_process";import ru from"node:fs/promises";import Oi from"node:path";import{promisify as kx}from"node:util";var Sx,ou,iu,Yf,Qf=w(()=>{"use strict";Xt();F();Sx=kx(wx),ou={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Oi.join(r,s);try{await ru.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=Oi.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Oi.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await ru.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ru.readFile(Oi.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},iu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[ou.contextFilesExist(t),ou.jsonFilesValid(t),ou.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Sx(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Yf=new iu});import Fi from"node:fs/promises";import _i from"node:path";var Ni,En,au=w(()=>{"use strict";ms();Ol();Gg();Vg();Kg();_l();rn();Ze();Sn();wt();we();Ri();Pr();Cn();ne();vr();Yo();Zo();Tr();Er();xs();bf();Pf();oe();vn();Yc();Qc();Ss();Tf();gc();bc();Uf();Xf();Qf();Ni=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let i=await $i(e),a=i.filter(u=>$s.includes(u)||u==="codex"),c=i.filter(u=>!$s.includes(u)&&u!=="codex");s=[...a.length>0?a:$s,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await $i(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;let o={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if((await Mn()).installed){let O=await Ii({autoRepair:!0});if(!O.verified)return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:`Codex p. router is required but not ready: ${O.message||"verification failed"}. Run 'prjct start' or 'prjct setup' to repair.`}}try{o=await on.ensureReady()}catch(O){return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:Y(O)},error:`Context7 MCP is required but not ready: ${Y(O)}. Run 'prjct start' to repair.`}}this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await xr(this.projectId);try{let O=await Qo(this.projectId);O>0&&U.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){U.debug("Legacy JSON sweep failed (non-critical)",{error:Y(O)})}let[c,u,d,m]=await Promise.all([Vf(this.projectPath),Bf(this.projectPath),Jf(this.projectPath),Kf(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,S=new Set;if(!p&&Wg(this.projectId))try{let{diff:O,currentHashes:Yh}=await Ul(this.projectPath,this.projectId),Ou=O.added.length+O.modified.length+O.deleted.length;if(Ou===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let oa=Ug(O,this.projectId);S=Hg(oa.allAffected);let Qh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=oa.allAffected.some(Rn=>{let Zh=Rn.substring(Rn.lastIndexOf("."));return Qh.has(Zh)}),k=oa.directlyChanged.some(Rn=>Rn==="package.json"||Rn==="tsconfig.json"||Rn.includes("Dockerfile")||Rn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Ou,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(S)}}Ll(this.projectId,Yh)}catch(O){U.debug("Incremental detection failed, falling back to full sync",{error:Y(O)})}else try{let{currentHashes:O}=await Ul(this.projectPath,this.projectId);Ll(this.projectId,O)}catch(O){U.debug("Hash computation failed (non-critical)",{error:Y(O)})}if(f)try{await Promise.all([Mg(this.projectPath,this.projectId),Lg(this.projectPath,this.projectId),qg(this.projectPath,this.projectId)])}catch(O){U.debug("File ranking index build failed (non-critical)",{error:Y(O)})}let I;if(k)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(I=O)}catch{}let D=k?await Of(this.globalPath,m,u,I):await Ff(this.globalPath),B=Nf(D,this.projectId,this.globalPath),Pe=k?await Lf(D):[],$e=qf(u,d),Be=[],C;try{let O=await He.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(C={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let j;try{j=await Cf(this.projectId)}catch{}let Re={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:D.filter(O=>O.type==="workflow").map(O=>O.name),domain:D.filter(O=>O.type==="domain").map(O=>O.name)},sources:$e,analysis:C,learnings:j},tr=await kf(Re,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let nr=await He.getActive(this.projectId),Ht={patterns:nr?.patterns?.length||0,antiPatterns:nr?.antiPatterns?.length||0,criticalAntiPatterns:nr?.antiPatterns?.filter(O=>O.severity==="high").length||0},Kh=Date.now()-n,Xh=await this.recordSyncMetrics(u,Be,D,Kh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await ve.installGlobalConfig(),await ve.syncCommands();let Mu;try{let O=await $.readConfig(this.projectPath);Mu=await Yf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){U.debug("Verification failed (non-critical)",{error:Y(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:D,skills:B,skillsInstalled:Pe,contextFiles:Be,aiTools:tr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Ht,syncMetrics:Xh,verification:Mu,incremental:g}}catch(i){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:Y(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Fi.mkdir(_i.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await xf.generate(this.projectPath,s)}catch(o){U.debug("Local state generation failed (optional)",{error:Y(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=_i.join(this.globalPath,m),g=await Fi.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:Y(p)})}for(let m of n)try{let p=_i.join(this.globalPath,"agents",`${m.name}.md`),g=await Fi.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:Y(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Wn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:Y(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,s){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Mp.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:s});i=u.patterns,a=u.antiPatterns,await He.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){U.debug("Failed to save draft analysis (non-critical)",{error:Y(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([ut.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:Y(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Fn,n=await Xc.learnFromTaskHistory(this.projectId,e,t);try{let s=await sm.getFeatureOutcomes(this.projectId);s.length>0&&await Xc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:Y(e)})}}async getCliVersion(){try{let e=_i.join(__dirname,"..","..","package.json");return JSON.parse(await Fi.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:Y(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},En=new Ni});import{exec as bx}from"node:child_process";import Ms from"node:path";import{promisify as Cx}from"node:util";function eh(r){return/^\d+\.\d+\.\d+/.test(r)}function Os(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function Px(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function vx(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function xx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Zf,Br,th=w(()=>{"use strict";Me();Zf=Cx(bx),Br=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Ms.join(this.projectPath,"package.json"),t=await Gt(e,null);return t?.version?{current:t.version,next:Os(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Ms.join(this.projectPath,"Cargo.toml"),t=await Qe(e,"");if(!t)return null;let n=Px(t);return n?{current:n,next:Os(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Ms.join(this.projectPath,"pyproject.toml"),t=await Qe(e,"");if(!t)return null;let n=vx(t);return n?{current:n,next:Os(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await sn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Ms.join(this.projectPath,e[0]),n=await Qe(t,"");if(!n)return null;let s=xx(n);return s?{current:s,next:Os(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Ms.join(this.projectPath,e),n=await Qe(t,"");if(!n)return null;let s=n.trim();return eh(s)?{current:s,next:Os(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Zf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1161
- `);for(let n of t){let s=n.trim().replace(/^v/,"");if(eh(s))return{current:s,next:Os(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Ms.join(this.projectPath,"VERSION");return await zt(e,`0.1.0
1162
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Zf(`git tag v${e.next}`,{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await zt(e.file,`${e.next}
1163
- `);break}}async writeJsonVersion(e,t){let n=await Gt(e,{});n&&(n.version=t,await $n(e,n))}async writeTomlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await zt(e,s)}async writeXmlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await zt(e,s)}};l(eh,"isSemver");l(Os,"bumpPatch");l(Px,"parseTomlVersion");l(vx,"parsePyprojectVersion");l(xx,"parseCsprojVersion")});var ln=w(()=>{"use strict";sp();pp();mp();fp();kp();Ss();Tp();ac();Ip();gc();Rp();wc();bc();Op();Cg();Eg();au();th()});var cu,Tx,Fs,lu=w(()=>{"use strict";oe();ne();cu=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),s=b();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),n.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=A.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?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},Tx=new cu,Fs=Tx});import nh from"node:fs/promises";import sh from"node:path";async function rh(r,e,t,n){let[s,o,i,a]=await Promise.all([Ix(r,e,n),Rx(r),Dx(r),jx(r)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,Ex).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Ix(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Og(r,s,uu*2);for(let a of o){if(n.length>=uu)break;try{let c=sh.join(e,a.path),u=await nh.readFile(c,"utf-8");u.length>Li*3?n.push({path:a.path,content:`${u.slice(0,Li)}
1164
- // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,Li),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=uu)break;if(!n.some(c=>c.path===a))try{let c=sh.join(e,a),u=await nh.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,Li),reason:"entry point"})}catch{}}return n}async function Rx(r){try{let e=await He.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 Dx(r){try{return(await _.getTaskHistory(r)).slice(0,Ax).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function jx(r){try{let e=Fs.getActiveSummary(r);return Promise.resolve(e)}catch(e){return U.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Li,uu,Ex,Ax,oh=w(()=>{"use strict";Ol();Pr();lu();xs();vn();Li=3e3,uu=15,Ex=15,Ax=10;l(rh,"buildAnalysisPayload");l(Ix,"selectCodeSamples");l(Rx,"getExistingPatterns");l(Dx,"getTaskHistory");l(jx,"getPreviousAnalysisSummary")});import pn from"chalk";function ih(r){return Math.ceil(r.length/$x)}function ah(r){let e=r.split(`
1160
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ss('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:Y(t)})}return e}async function en(r,e){try{return await Wf.access(su.join(r,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:Y(t)}),!1}}async function Bf(r){let e={fileCount:0,version:"0.0.0",name:su.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ss('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:r,error:Y(t)}),e.fileCount=0}try{let t=su.join(r,"package.json"),n=JSON.parse(await Wf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await en(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:r,error:Y(t)})}return await en(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await en(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await en(r,"requirements.txt")||await en(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Jf(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await en(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await en(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await en(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await en(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await en(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function qf(r,e){let t=ns(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Kf(r){return new Mi(r).detect()}var ss,Xf=w(()=>{"use strict";rn();Wl();vn();zf();ss=yx(hx);l(Vf,"analyzeGit");l(en,"fileExists");l(Bf,"gatherStats");l(Jf,"detectCommands");l(qf,"buildSources");l(Kf,"detectStack")});import{exec as wx}from"node:child_process";import ru from"node:fs/promises";import Oi from"node:path";import{promisify as kx}from"node:util";var Sx,ou,iu,Yf,Qf=w(()=>{"use strict";Xt();F();Sx=kx(wx),ou={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Oi.join(r,s);try{await ru.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=Oi.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Oi.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await ru.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ru.readFile(Oi.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},iu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[ou.contextFilesExist(t),ou.jsonFilesValid(t),ou.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Sx(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Yf=new iu});import Fi from"node:fs/promises";import _i from"node:path";var Ni,En,au=w(()=>{"use strict";ms();Ol();Gg();Vg();Kg();_l();rn();Ze();Sn();wt();ke();Ri();vr();Cn();ne();xr();Yo();Zo();xs();Er();Ts();bf();Pf();oe();vn();Yc();Qc();Ss();Tf();gc();bc();Uf();Xf();Qf();Ni=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let i=await $i(e),a=i.filter(u=>Ms.includes(u)||u==="codex"),c=i.filter(u=>!Ms.includes(u)&&u!=="codex");s=[...a.length>0?a:Ms,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await $i(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;let o={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if((await Mn()).installed){let O=await Ii({autoRepair:!0});if(!O.verified)return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:`Codex p. router is required but not ready: ${O.message||"verification failed"}. Run 'prjct start' or 'prjct setup' to repair.`}}try{o=await on.ensureReady()}catch(O){return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:Y(O)},error:`Context7 MCP is required but not ready: ${Y(O)}. Run 'prjct start' to repair.`}}this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Tr(this.projectId);try{let O=await Qo(this.projectId);O>0&&U.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){U.debug("Legacy JSON sweep failed (non-critical)",{error:Y(O)})}let[c,u,d,m]=await Promise.all([Vf(this.projectPath),Bf(this.projectPath),Jf(this.projectPath),Kf(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,S=new Set;if(!p&&Wg(this.projectId))try{let{diff:O,currentHashes:Yh}=await Ul(this.projectPath,this.projectId),Ou=O.added.length+O.modified.length+O.deleted.length;if(Ou===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let oa=Ug(O,this.projectId);S=Hg(oa.allAffected);let Qh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=oa.allAffected.some(Rn=>{let Zh=Rn.substring(Rn.lastIndexOf("."));return Qh.has(Zh)}),k=oa.directlyChanged.some(Rn=>Rn==="package.json"||Rn==="tsconfig.json"||Rn.includes("Dockerfile")||Rn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Ou,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(S)}}Ll(this.projectId,Yh)}catch(O){U.debug("Incremental detection failed, falling back to full sync",{error:Y(O)})}else try{let{currentHashes:O}=await Ul(this.projectPath,this.projectId);Ll(this.projectId,O)}catch(O){U.debug("Hash computation failed (non-critical)",{error:Y(O)})}if(f)try{await Promise.all([Mg(this.projectPath,this.projectId),Lg(this.projectPath,this.projectId),qg(this.projectPath,this.projectId)])}catch(O){U.debug("File ranking index build failed (non-critical)",{error:Y(O)})}let I;if(k)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(I=O)}catch{}let D=k?await Of(this.globalPath,m,u,I):await Ff(this.globalPath),B=Nf(D,this.projectId,this.globalPath),ve=k?await Lf(D):[],$e=qf(u,d),Be=[],C;try{let O=await Ge.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(C={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let j;try{j=await Cf(this.projectId)}catch{}let Re={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:D.filter(O=>O.type==="workflow").map(O=>O.name),domain:D.filter(O=>O.type==="domain").map(O=>O.name)},sources:$e,analysis:C,learnings:j},nr=await kf(Re,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let sr=await Ge.getActive(this.projectId),Gt={patterns:sr?.patterns?.length||0,antiPatterns:sr?.antiPatterns?.length||0,criticalAntiPatterns:sr?.antiPatterns?.filter(O=>O.severity==="high").length||0},Kh=Date.now()-n,Xh=await this.recordSyncMetrics(u,Be,D,Kh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await xe.installGlobalConfig(),await xe.syncCommands();let Mu;try{let O=await $.readConfig(this.projectPath);Mu=await Yf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){U.debug("Verification failed (non-critical)",{error:Y(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:D,skills:B,skillsInstalled:ve,contextFiles:Be,aiTools:nr.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Gt,syncMetrics:Xh,verification:Mu,incremental:g}}catch(i){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:Y(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Fi.mkdir(_i.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await xf.generate(this.projectPath,s)}catch(o){U.debug("Local state generation failed (optional)",{error:Y(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=_i.join(this.globalPath,m),g=await Fi.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:Y(p)})}for(let m of n)try{let p=_i.join(this.globalPath,"agents",`${m.name}.md`),g=await Fi.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:Y(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Wn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:Y(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,s){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Mp.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:s});i=u.patterns,a=u.antiPatterns,await Ge.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){U.debug("Failed to save draft analysis (non-critical)",{error:Y(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([ut.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:Y(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Fn,n=await Xc.learnFromTaskHistory(this.projectId,e,t);try{let s=await sm.getFeatureOutcomes(this.projectId);s.length>0&&await Xc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:Y(e)})}}async getCliVersion(){try{let e=_i.join(__dirname,"..","..","package.json");return JSON.parse(await Fi.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:Y(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},En=new Ni});import{exec as bx}from"node:child_process";import Os from"node:path";import{promisify as Cx}from"node:util";function eh(r){return/^\d+\.\d+\.\d+/.test(r)}function Fs(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function Px(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function vx(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function xx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Zf,Br,th=w(()=>{"use strict";Me();Zf=Cx(bx),Br=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Os.join(this.projectPath,"package.json"),t=await zt(e,null);return t?.version?{current:t.version,next:Fs(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Os.join(this.projectPath,"Cargo.toml"),t=await Qe(e,"");if(!t)return null;let n=Px(t);return n?{current:n,next:Fs(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Os.join(this.projectPath,"pyproject.toml"),t=await Qe(e,"");if(!t)return null;let n=vx(t);return n?{current:n,next:Fs(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await sn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Os.join(this.projectPath,e[0]),n=await Qe(t,"");if(!n)return null;let s=xx(n);return s?{current:s,next:Fs(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Os.join(this.projectPath,e),n=await Qe(t,"");if(!n)return null;let s=n.trim();return eh(s)?{current:s,next:Fs(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Zf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
1161
+ `);for(let n of t){let s=n.trim().replace(/^v/,"");if(eh(s))return{current:s,next:Fs(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Os.join(this.projectPath,"VERSION");return await Wt(e,`0.1.0
1162
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Zf(`git tag v${e.next}`,{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Wt(e.file,`${e.next}
1163
+ `);break}}async writeJsonVersion(e,t){let n=await zt(e,{});n&&(n.version=t,await $n(e,n))}async writeTomlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Wt(e,s)}async writeXmlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wt(e,s)}};l(eh,"isSemver");l(Fs,"bumpPatch");l(Px,"parseTomlVersion");l(vx,"parsePyprojectVersion");l(xx,"parseCsprojVersion")});var ln=w(()=>{"use strict";sp();pp();mp();fp();kp();Ss();Tp();ac();Ip();gc();Rp();wc();bc();Op();Cg();Eg();au();th()});var cu,Tx,_s,lu=w(()=>{"use strict";oe();ne();cu=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=A.getDb(e),s=b();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),n.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=A.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?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},Tx=new cu,_s=Tx});import nh from"node:fs/promises";import sh from"node:path";async function rh(r,e,t,n){let[s,o,i,a]=await Promise.all([Ix(r,e,n),Rx(r),Dx(r),jx(r)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,Ex).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Ix(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Og(r,s,uu*2);for(let a of o){if(n.length>=uu)break;try{let c=sh.join(e,a.path),u=await nh.readFile(c,"utf-8");u.length>Li*3?n.push({path:a.path,content:`${u.slice(0,Li)}
1164
+ // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,Li),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=uu)break;if(!n.some(c=>c.path===a))try{let c=sh.join(e,a),u=await nh.readFile(c,"utf-8");n.push({path:a,content:u.slice(0,Li),reason:"entry point"})}catch{}}return n}async function Rx(r){try{let e=await Ge.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 Dx(r){try{return(await _.getTaskHistory(r)).slice(0,Ax).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function jx(r){try{let e=_s.getActiveSummary(r);return Promise.resolve(e)}catch(e){return U.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Li,uu,Ex,Ax,oh=w(()=>{"use strict";Ol();vr();lu();Ts();vn();Li=3e3,uu=15,Ex=15,Ax=10;l(rh,"buildAnalysisPayload");l(Ix,"selectCodeSamples");l(Rx,"getExistingPatterns");l(Dx,"getTaskHistory");l(jx,"getPreviousAnalysisSummary")});import pn from"chalk";function ih(r){return Math.ceil(r.length/$x)}function ah(r){let e=r.split(`
1165
1165
  `),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
1166
1166
  ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function du(r){return r.includes("<!-- prjct:preserve")}function ch(r,e){let t=ah(r),n=ah(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:ih(r),tokensAfter:ih(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)du(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1167
1167
  `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(du(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
@@ -1180,7 +1180,7 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function du(r){return r.incl
1180
1180
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1181
1181
  `).length>5&&n.push(a(` ... ${c.before.split(`
1182
1182
  `).length-5} more lines`))}n.push("")}return n.join(`
1183
- `)}var $x,dh=w(()=>{"use strict";$x=4;l(ih,"estimateTokens");l(ah,"parseMarkdownSections");l(du,"isPreservedSection");l(ch,"generateSyncDiff");l(lh,"formatDiffPreview");l(uh,"formatFullDiff")});import Mx from"node:path";async function pu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await ve.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
1183
+ `)}var $x,dh=w(()=>{"use strict";$x=4;l(ih,"estimateTokens");l(ah,"parseMarkdownSections");l(du,"isPreservedSection");l(ch,"generateSyncDiff");l(lh,"formatDiffPreview");l(uh,"formatFullDiff")});import Mx from"node:path";async function pu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await xe.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
1184
1184
  `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(r.context7&&u.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&u.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function ph(r){try{let e=await lt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=z.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Jr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function mu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function mh(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function gh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${Jr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${So(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${mu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Jr(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
1185
1185
  `)}function fh(r,e){let t=[];t.push(`# Repository Analysis
1186
1186
  `),t.push(`Generated: ${new Date().toLocaleString()}
@@ -1200,11 +1200,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function du(r){return r.incl
1200
1200
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1201
1201
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1202
1202
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1203
- `)}var hh=w(()=>{"use strict";Sn();bo();ln();Es();zn();nt();l(pu,"showSyncResult");l(ph,"getSessionActivity");l(Jr,"formatTokens");l(mu,"formatDuration");l(mh,"generateSparkline");l(gh,"generateStatsMarkdown");l(fh,"generateAnalysisSummary")});var bg={};jn(bg,{AnalysisCommands:()=>os});import gu from"node:fs/promises";import yh from"node:path";import*as rs from"@clack/prompts";var os,Pi=w(()=>{"use strict";ms();Vd();Sn();bo();ln();xc();oh();dh();Pr();ne();lu();Yo();F();Ts();Es();zn();hh();nt();os=class extends Se{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1204
- `),We.init(t);let n=await mt.build(t,e),s={packageJson:await We.readPackageJson(),cargoToml:await We.readCargoToml(),goMod:await We.readGoMod(),requirements:await We.readRequirements(),directories:await We.listDirectories(),fileCount:await We.countFiles(),gitStats:await We.getGitStats(),gitLog:await We.getGitLog(20),hasDockerfile:await We.fileExists("Dockerfile"),hasDockerCompose:await We.fileExists("docker-compose.yml"),hasReadme:await We.fileExists("README.md"),hasTsconfig:await We.fileExists("tsconfig.json"),hasViteConfig:await We.fileExists("vite.config.ts")||await We.fileExists("vite.config.js"),hasNextConfig:await We.fileExists("next.config.js")||await We.fileExists("next.config.mjs")},o=fh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Xe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ze(),Pt(ht)).getActiveProvider(),d=await ve.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1203
+ `)}var hh=w(()=>{"use strict";Sn();bo();ln();As();zn();nt();l(pu,"showSyncResult");l(ph,"getSessionActivity");l(Jr,"formatTokens");l(mu,"formatDuration");l(mh,"generateSparkline");l(gh,"generateStatsMarkdown");l(fh,"generateAnalysisSummary")});var bg={};jn(bg,{AnalysisCommands:()=>os});import gu from"node:fs/promises";import yh from"node:path";import*as rs from"@clack/prompts";var os,Pi=w(()=>{"use strict";ms();Vd();Sn();bo();ln();xc();oh();dh();vr();ne();lu();Yo();F();Es();As();zn();hh();nt();os=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1204
+ `),Ve.init(t);let n=await mt.build(t,e),s={packageJson:await Ve.readPackageJson(),cargoToml:await Ve.readCargoToml(),goMod:await Ve.readGoMod(),requirements:await Ve.readRequirements(),directories:await Ve.listDirectories(),fileCount:await Ve.countFiles(),gitStats:await Ve.getGitStats(),gitLog:await Ve.getGitLog(20),hasDockerfile:await Ve.fileExists("Dockerfile"),hasDockerCompose:await Ve.fileExists("docker-compose.yml"),hasReadme:await Ve.fileExists("README.md"),hasTsconfig:await Ve.fileExists("tsconfig.json"),hasViteConfig:await Ve.fileExists("vite.config.ts")||await Ve.fileExists("vite.config.js"),hasNextConfig:await Ve.fileExists("next.config.js")||await Ve.fileExists("next.config.mjs")},o=fh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Xe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ze(),Pt(ht)).getActiveProvider(),d=await xe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1205
1205
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1206
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await En.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(N(fe(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=yh.join(o,"context","CLAUDE.md"),c=null;try{c=await gu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(N("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await gu.readFile(a,"utf-8")}catch{p=""}let g=ch(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(N(fe("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await gu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let D of g.added)S.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)S.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)S.push(`Removed: ${D.name} (${D.lineCount} lines)`);let I=N("## \u26A1 Sync Preview",S.length>0?Z("Changes",Ce(S)):"No section changes.",dt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:S,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(lh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await rs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rs.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1207
- ${uh(g)}`);let S=await rs.confirm({message:"Apply these changes?",initialValue:!0});if(rs.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),pu(m,i)}t.md||h.spin("Syncing project...");let d=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(N("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(I=>I.success).length||0),g=d.agents.length,f=null;try{let I=await He.diff(s);I?.hasChanges&&(f=vc(I))}catch{}let k=ei("sync"),S=N(fe("Sync Complete"),dt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Xp("Uncommitted changes detected"):null,ue(k.map(I=>({label:I.desc,command:I.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return pu(d,i)}catch(n){return t.md?console.log(N("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async analysisPayload(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await En.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Fs.isCurrent(s,i))return t.md?console.log(N(fe("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await rh(s,e,o.git,o.stats);return t.md?console.log(N("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(n){return{success:!1,error:y(n)}}}async saveLlmAnalysis(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Fs.save(o,i),n.md?console.log(N(fe("LLM Analysis Saved"),dt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(s){return{success:!1,error:y(s)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=Fs.getActive(s);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[fe(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Z("Architecture Insights",Ce(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",Ce(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",Ce(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",Ce(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",Ce(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(n){return{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Wn.getSummary(s),i=await Wn.getDailyStats(s,30),a=await ph(s),c=await Le.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Wn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Jr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${So(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${mu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=mh(i);if(console.log(` ${p} ${Jr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=gh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Nr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await He.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=yh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=N(`## \u26A1 Status: ${u}`,dt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Z("Analysis",Ce(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await He.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(N(vc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Lp(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Diff Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await He.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await He.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(fe("Analysis Rolled Back"),dt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(N("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Rollback Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await He.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await He.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as Kx}from"node:child_process";import{promisify as Xx}from"node:util";async function Ki(r){if(process.platform!=="darwin")return Ah(r);try{let{stdout:e}=await Yx(`security find-generic-password -s "${Qx}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Ah(r)}}function Ah(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var Yx,Qx,Eu=w(()=>{"use strict";F();Yx=Xx(Kx),Qx="prjct-cli";l(Ki,"getCredential");l(Ah,"getEnvFallback")});import It from"node:fs";import{createServer as XT}from"node:net";aa();Pi();ln();Xt();F();Ts();nt();import Ox from"node:path";wt();we();F();oe();var Ui=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new Ui;var _s=class extends Se{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=Ox.basename(t),a=await _.getCurrentTask(o),c=await xe.getActiveTasks(o),u=await ut.getRecent(o,5),d=await qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=z.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
1206
+ `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await En.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(N(he(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=yh.join(o,"context","CLAUDE.md"),c=null;try{c=await gu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(N("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await gu.readFile(a,"utf-8")}catch{p=""}let g=ch(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(N(he("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await gu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let D of g.added)S.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)S.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)S.push(`Removed: ${D.name} (${D.lineCount} lines)`);let I=N("## \u26A1 Sync Preview",S.length>0?Z("Changes",Pe(S)):"No section changes.",dt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(I),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let S={added:g.added.map(I=>({name:I.name,lineCount:I.lineCount})),modified:g.modified.map(I=>({name:I.name,lineCount:I.lineCount})),removed:g.removed.map(I=>({name:I.name,lineCount:I.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:S,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(lh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await rs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rs.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
1207
+ ${uh(g)}`);let S=await rs.confirm({message:"Apply these changes?",initialValue:!0});if(rs.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),pu(m,i)}t.md||h.spin("Syncing project...");let d=await En.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(N("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(I=>I.success).length||0),g=d.agents.length,f=null;try{let I=await Ge.diff(s);I?.hasChanges&&(f=vc(I))}catch{}let k=ei("sync"),S=N(he("Sync Complete"),dt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Xp("Uncommitted changes detected"):null,ue(k.map(I=>({label:I.desc,command:I.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return pu(d,i)}catch(n){return t.md?console.log(N("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async analysisPayload(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await En.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&_s.isCurrent(s,i))return t.md?console.log(N(he("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await rh(s,e,o.git,o.stats);return t.md?console.log(N("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(n){return{success:!1,error:y(n)}}}async saveLlmAnalysis(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(_s.save(o,i),n.md?console.log(N(he("LLM Analysis Saved"),dt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(s){return{success:!1,error:y(s)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=_s.getActive(s);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[he(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Z("Architecture Insights",Pe(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",Pe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",Pe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",Pe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",Pe(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(n){return{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Wn.getSummary(s),i=await Wn.getDailyStats(s,30),a=await ph(s),c=await Ue.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Wn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Jr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${So(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${mu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=mh(i);if(console.log(` ${p} ${Jr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=gh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Nr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Ge.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=yh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=N(`## \u26A1 Status: ${u}`,dt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Z("Analysis",Pe(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(N(vc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Lp(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Diff Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ge.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(he("Analysis Rolled Back"),dt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(N("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(N("## \u274C Rollback Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Ge.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await Ge.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as Kx}from"node:child_process";import{promisify as Xx}from"node:util";async function Ki(r){if(process.platform!=="darwin")return Ah(r);try{let{stdout:e}=await Yx(`security find-generic-password -s "${Qx}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Ah(r)}}function Ah(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var Yx,Qx,Eu=w(()=>{"use strict";F();Yx=Xx(Kx),Qx="prjct-cli";l(Ki,"getCredential");l(Ah,"getEnvFallback")});import It from"node:fs";import{createServer as YT}from"node:net";aa();Pi();ln();Xt();F();Es();nt();import Ox from"node:path";wt();ke();F();oe();var Ui=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new Ui;var Ns=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=Ox.basename(t),a=await _.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await ut.getRecent(o,5),d=await qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=z.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
1208
1208
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
1209
1209
  `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
1210
1210
  Activity: ${k}
@@ -1213,7 +1213,7 @@ ${uh(g)}`);let S=await rs.confirm({message:"Apply these changes?",initialValue:!
1213
1213
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1214
1214
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let S=f.split(`
1215
1215
  `)[0].trim();console.log(` ${k+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1216
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${z.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=N(`## \u26A1 Dashboard: ${i}`,Z("Current Focus",m),Z(`Queue (${c.length})`,Ce(p,!0)),Z("Recent Ships",Ce(g)),Z("Ideas",`${d.length} pending`),ue([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1216
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${z.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=N(`## \u26A1 Dashboard: ${i}`,Z("Current Focus",m),Z(`Queue (${c.length})`,Pe(p,!0)),Z("Recent Ships",Pe(g)),Z("Ideas",`${d.length} pending`),ue([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1217
1217
  \u{1F4CA} DASHBOARD - ${i}
1218
1218
  `),console.log("\u2550".repeat(50));let m=Nr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
1219
1219
  ${g}`),console.log(`
@@ -1237,7 +1237,7 @@ ${"\u2550".repeat(50)}
1237
1237
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1238
1238
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1239
1239
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1240
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};hl();wt();we();Xt();F();import Fx from"node:fs/promises";import _x from"node:path";var is=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await mi.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=_x.join(e,"analysis","repo-analysis.json"),n=await Fx.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return P(t),null}}},kz=new is;nt();ln();Xt();ne();F();nt();async function Hi(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;L.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(Hi,"cleanupMemory");async function Gi(r){let e=await $.getProjectId(r);if(!e)return;let n=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;L.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(Gi,"cleanupMemoryInternal");async function fu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await Hi(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=L.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;L.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await qe.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await xe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await Gi(e),await lt.log(e,"cleanup_performed",{items:s.length,timestamp:z.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(fu,"cleanup");ln();F();nt();import wh from"node:path";async function hu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=wh.join(x.getGlobalProjectPath(i),"planning","designs");await ye.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1240
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};hl();wt();ke();Xt();F();import Fx from"node:fs/promises";import _x from"node:path";var is=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await mi.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=_x.join(e,"analysis","repo-analysis.json"),n=await Fx.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return P(t),null}}},Sz=new is;nt();ln();Xt();ne();F();nt();async function Hi(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;L.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(Hi,"cleanupMemory");async function Gi(r){let e=await $.getProjectId(r);if(!e)return;let n=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;L.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(Gi,"cleanupMemoryInternal");async function fu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await Hi(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=L.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;L.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await qe.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await fe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await Gi(e),await lt.log(e,"cleanup_performed",{items:s.length,timestamp:z.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(fu,"cleanup");ln();F();nt();import wh from"node:path";async function hu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=wh.join(x.getGlobalProjectPath(i),"planning","designs");await we.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1241
1241
 
1242
1242
  *Use templates/design/architecture.md for full design*
1243
1243
  `;break;case"api":c=`# API Design: ${o}
@@ -1252,12 +1252,12 @@ ${"\u2550".repeat(50)}
1252
1252
  `;break;case"flow":c=`# Flow Design: ${o}
1253
1253
 
1254
1254
  *Use templates/design/flow.md for full design*
1255
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=wh.join(a,u);return await ye.writeFile(d,c),await lt.log(t,"design_created",{type:n,target:o,timestamp:z.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(hu,"design");ln();F();nt();import Ns from"node:path";async function yu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=x.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ye.readFile(t);n=JSON.parse(s)}catch(s){if(P(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1255
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=wh.join(a,u);return await we.writeFile(d,c),await lt.log(t,"design_created",{type:n,target:o,timestamp:z.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(hu,"design");ln();F();nt();import Ls from"node:path";async function yu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=x.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await we.readFile(t);n=JSON.parse(s)}catch(s){if(P(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1256
1256
  Found abandoned session:
1257
1257
  `),console.log(` Task: ${n.task}`),n.startedAt){let s=z.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1258
1258
  Options:`),console.log(" 1. Use /p:work to resume working"),console.log(" 2. Use /p:done to mark as complete"),console.log(` 3. Delete session file to discard
1259
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(yu,"recover");async function wu(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots");await ye.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Ns.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ye.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ye.writeFile(a,JSON.stringify(c,null,2)),await lt.log(r,"undo_performed",{snapshotId:i,timestamp:z.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(wu,"undo");async function ku(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots"),n=Ns.join(t,"history.json"),s;try{let i=await ye.readFile(n);s=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1260
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ye.writeFile(n,JSON.stringify(s,null,2)),await lt.log(r,"redo_performed",{timestamp:z.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(ku,"redo");async function Su(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ns.join(x.getGlobalProjectPath(e),"snapshots"),n=Ns.join(t,"history.json"),s;try{let o=await ye.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1259
+ `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(yu,"recover");async function wu(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ls.join(x.getGlobalProjectPath(e),"snapshots");await we.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Ls.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await we.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await we.writeFile(a,JSON.stringify(c,null,2)),await lt.log(r,"undo_performed",{snapshotId:i,timestamp:z.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(wu,"undo");async function ku(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ls.join(x.getGlobalProjectPath(e),"snapshots"),n=Ls.join(t,"history.json"),s;try{let i=await we.readFile(n);s=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1260
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await we.writeFile(n,JSON.stringify(s,null,2)),await lt.log(r,"redo_performed",{timestamp:z.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(ku,"redo");async function Su(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ls.join(x.getGlobalProjectPath(e),"snapshots"),n=Ls.join(t,"history.json"),s;try{let o=await we.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1261
1261
  SNAPSHOT HISTORY
1262
1262
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1263
1263
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1265,17 +1265,17 @@ ${"\u2550".repeat(50)}
1265
1265
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1266
1266
  `)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1267
1267
  `)),console.log(`${"=".repeat(50)}
1268
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Su,"history");var Ls=class extends Se{static{l(this,"MaintenanceCommands")}_cleanupMemory=Hi;_cleanupMemoryInternal=Gi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?fu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?hu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?yu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?wu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ku(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Su(e):t}};import Ae from"chalk";ne();var bu=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){L.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)L.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){L.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){L.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return L.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Nx=new bu,kh=Nx;F();nt();var An={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function zi(r,e,t){return t==="below"?r<=e?Ae.green("\u2713"):Ae.yellow("\u26A0"):r>=e?Ae.green("\u2713"):Ae.yellow("\u26A0")}l(zi,"statusIcon");var Us=class extends Se{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await kh.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1268
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Su,"history");var Us=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=Hi;_cleanupMemoryInternal=Gi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?fu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?hu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?yu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?wu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ku(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Su(e):t}};import Ae from"chalk";ne();var bu=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){L.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)L.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){L.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){L.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return L.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Nx=new bu,kh=Nx;F();nt();var An={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function zi(r,e,t){return t==="below"?r<=e?Ae.green("\u2713"):Ae.yellow("\u26A0"):r>=e?Ae.green("\u2713"):Ae.yellow("\u26A0")}l(zi,"statusIcon");var Hs=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await kh.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1269
1269
  ${Ae.dim("No performance data yet.")}`),console.log(`${Ae.dim("Metrics are collected automatically as you use the CLI.")}
1270
1270
  `),{success:!0,message:"No data"};if(console.log(`
1271
1271
  ${Ae.cyan("Performance Report")} ${Ae.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=zi(i.startup.avg,An.startup.max,"below");console.log(` Startup: avg ${Ae.bold(`${i.startup.avg}ms`)} ${Ae.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ae.dim(`target: <${An.startup.max}ms`)}`)}if(i.memory){let c=zi(i.memory.peakHeapMB,An.heapMB.max,"below");console.log(` Memory: avg ${Ae.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ae.dim(`target: <${An.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=zi(i.contextCorrectness.rate,An.contextRate.min,"above");console.log(` Context: ${Ae.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ae.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ae.dim(`target: ${An.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=zi(i.subtaskHandoff.rate,An.handoffRate.min,"above");console.log(` Handoff: ${Ae.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ae.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ae.dim(`target: ${An.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1272
- ${Ae.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ae.bold(`${u.avg}ms`)} ${Ae.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};Ci();Sn();we();Ss();F();Me();Bt();nt();import Cu from"node:fs/promises";import Lx from"node:path";import ae from"chalk";var Hs=class extends Se{static{l(this,"SetupCommands")}async start(){let e=await ve.checkInstallation(),t=(Ze(),Pt(ht)),n=await t.detectCodex(),s=e.claudeDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1272
+ ${Ae.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ae.bold(`${u.avg}ms`)} ${Ae.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};Ci();Sn();ke();Ss();F();Me();$t();nt();import Cu from"node:fs/promises";import Lx from"node:path";import ae from"chalk";var Gs=class extends be{static{l(this,"SetupCommands")}async start(){let e=await xe.checkInstallation(),t=(Ze(),Pt(ht)),n=await t.detectCodex(),s=e.claudeDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
1273
1273
  `),!s&&!n.installed)return{success:!1,message:`\u274C No supported AI provider detected.
1274
1274
 
1275
1275
  Please install one first:
1276
1276
  - Claude Code: https://docs.anthropic.com/claude-code
1277
1277
  - Gemini CLI: https://geminicli.com/docs
1278
- - OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await ve.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1278
+ - OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await xe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
1279
1279
  \u2705 Installed ${a.installed?.length??0} commands to:
1280
1280
  ${x.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
1281
1281
  \u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(n.installed){let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Ri(),zl));await a();let u=await c({autoRepair:!0});if(!u.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
@@ -1293,10 +1293,10 @@ Fix:
1293
1293
  2. Re-run: prjct start`}}return console.log(`
1294
1294
  \u{1F389} Setup complete!`),console.log(`
1295
1295
  Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1296
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await ve.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await ve.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1296
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await xe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await xe.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1297
1297
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1298
1298
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
1299
- \u{1F4DD} Installing global configuration...`);let n=await ve.installGlobalConfig(),s=n.path?x.getDisplayPath(n.path):"global config";n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`);let o=(Ze(),Pt(ht)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1299
+ \u{1F4DD} Installing global configuration...`);let n=await xe.installGlobalConfig(),s=n.path?x.getDisplayPath(n.path):"global config";n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`);let o=(Ze(),Pt(ht)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
1300
1300
  \u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed){let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Ri(),zl));await c();let d=await u({autoRepair:!0});if(!d.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
1301
1301
 
1302
1302
  ${d.message||"router verification failed"}
@@ -1316,7 +1316,7 @@ Fix:
1316
1316
  # Shows version update notifications and current task
1317
1317
 
1318
1318
  # Current CLI version (embedded at install time)
1319
- CLI_VERSION="${Ve}"
1319
+ CLI_VERSION="${Oe}"
1320
1320
 
1321
1321
  # Read JSON context from stdin (provided by Claude Code)
1322
1322
  read -r json
@@ -1367,7 +1367,7 @@ fi
1367
1367
 
1368
1368
  # Default: show prjct branding
1369
1369
  echo "\u26A1 prjct"
1370
- `;await Cu.writeFile(n,s,{mode:493});let o={};if(await R(t))try{o=JSON.parse(await Cu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Cu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${Ve} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ms();ln();au();Xt();F();Ts();Es();Ir();F();import{exec as Gx}from"node:child_process";import{promisify as zx}from"node:util";import rt from"chalk";ms();F();an();import{exec as Ux}from"node:child_process";import{promisify as Hx}from"node:util";import bW from"chalk";var xW=Hx(Ux),Sh=new Map,bh=new Map;function Ch(r,e){return`workflow:${r}_${e}`}l(Ch,"prefKey");async function Ph(r,e){let t={};for(let n of["before","after","skip"]){let s=Ch(n,e),o=bh.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Sh.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Le.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(Ph,"getWorkflowPreferences");async function vh(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Ch(o,s),a=bh.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Sh.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Le.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(vh,"listWorkflowPreferences");var Wi=zx(Gx);async function Lt(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=Te.getRulesForCommand(r,e).filter(p=>p.position===t),a=await Ph(r,e);if(a.skip)return s;let c=a[t],u=i.filter(p=>p.type==="gate");for(let p of u){let g=p.description||p.action;console.log(`
1370
+ `;await Cu.writeFile(n,s,{mode:493});let o={};if(await R(t))try{o=JSON.parse(await Cu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Cu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${Oe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ms();ln();au();Xt();F();Es();As();Ir();F();import{exec as Gx}from"node:child_process";import{promisify as zx}from"node:util";import rt from"chalk";ms();F();an();import{exec as Ux}from"node:child_process";import{promisify as Hx}from"node:util";import CW from"chalk";var TW=Hx(Ux),Sh=new Map,bh=new Map;function Ch(r,e){return`workflow:${r}_${e}`}l(Ch,"prefKey");async function Ph(r,e){let t={};for(let n of["before","after","skip"]){let s=Ch(n,e),o=bh.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Sh.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ue.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(Ph,"getWorkflowPreferences");async function vh(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Ch(o,s),a=bh.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Sh.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Ue.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(vh,"listWorkflowPreferences");var Wi=zx(Gx);async function Ut(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=Te.getRulesForCommand(r,e).filter(p=>p.position===t),a=await Ph(r,e);if(a.skip)return s;let c=a[t],u=i.filter(p=>p.type==="gate");for(let p of u){let g=p.description||p.action;console.log(`
1371
1371
  ${rt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await Wi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let k=Date.now()-f,S=k>1e3?`${(k/1e3).toFixed(1)}s`:`${k}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`gate passed (${S})`)}`)}catch(f){return console.log(`${rt.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
1372
1372
  ${y(f)}
1373
1373
  `,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
@@ -1379,15 +1379,15 @@ ${y(p)}
1379
1379
  `}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
1380
1380
  ${rt.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await Wi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`step passed (${k})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${rt.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
1381
1381
  ${y(g)}
1382
- `,s}}return s}l(Lt,"executeWorkflowRules");nt();var Gs=class extends Se{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Lt(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};n.md||h.step(1,4,"Bumping version...");let d=await new Br(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new kr(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let f=await this._gitPush(t);g=f.success?"pushed":f.message}await ut.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.getTimestamp()}),await Le.learnDecision(o,"commit_footer","prjct","ship"),await Le.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d}),await Lt(o,"ship","after",{projectPath:t,skipRules:n.skipHooks});try{n.md||h.step(4,4,"Updating AI context..."),await En.sync(t),n.md||h.done("\u2713 AI context updated")}catch(f){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(f))}if(n.md){let f=ei("ship"),k=N(fe(`Shipped: ${i}`,`Version: ${d}`),Z("Results",Ce([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),ue(f.map(S=>({label:S.desc,command:S.cmd}))));console.log(k)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _createShipCommit(e,t){try{await Xe.get("Bash")("git add .");let n=`feat: ${e}
1382
+ `,s}}return s}l(Ut,"executeWorkflowRules");nt();var zs=class extends be{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Ut(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};n.md||h.step(1,4,"Bumping version...");let d=await new Br(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new Sr(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let f=await this._gitPush(t);g=f.success?"pushed":f.message}await ut.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.getTimestamp()}),await Ue.learnDecision(o,"commit_footer","prjct","ship"),await Ue.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d}),await Ut(o,"ship","after",{projectPath:t,skipRules:n.skipHooks});try{n.md||h.step(4,4,"Updating AI context..."),await En.sync(t),n.md||h.done("\u2713 AI context updated")}catch(f){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(f))}if(n.md){let f=ei("ship"),k=N(he(`Shipped: ${i}`,`Version: ${d}`),Z("Results",Pe([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),ue(f.map(S=>({label:S.desc,command:S.cmd}))));console.log(k)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _createShipCommit(e,t){try{await Xe.get("Bash")("git add .");let n=`feat: ${e}
1383
1383
 
1384
- Generated with [p/](https://www.prjct.app/)`;return await Xe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Xe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};wt();we();Zo();F();zn();nt();import Wx from"node:fs/promises";import Vx from"node:path";import zs from"chalk";var Ws=class extends Se{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(zs.dim(`[dry-run] Would update ${o.length} project(s)
1385
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${zs.dim("would update")} ${m}`);continue}try{let p=await xr(d),g=await Qo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${zs.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${zs.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${zs.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${zs.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=Vx.join(x.getGlobalBasePath(),"projects");try{return(await Wx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};cl();ps();Uc();F();qn();nt();import Ie from"chalk";var Vs=class extends Se{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await pt.getAll(s);if(i.length===0)return console.log(`
1384
+ Generated with [p/](https://www.prjct.app/)`;return await Xe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Xe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};wt();ke();Zo();F();zn();nt();import Wx from"node:fs/promises";import Vx from"node:path";import Ws from"chalk";var Vs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Ws.dim(`[dry-run] Would update ${o.length} project(s)
1385
+ `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ws.dim("would update")} ${m}`);continue}try{let p=await Tr(d),g=await Qo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ws.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ws.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Ws.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ws.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=Vx.join(x.getGlobalBasePath(),"projects");try{return(await Wx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};cl();ps();Uc();F();qn();nt();import Ie from"chalk";var Bs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await pt.getAll(s);if(i.length===0)return console.log(`
1386
1386
  ${Ie.dim("No velocity data yet.")}`),console.log(`${Ie.dim("Complete tasks with estimates to build velocity history.")}
1387
1387
  `),{success:!0,message:"No data"};let a=ui(i,o);await Lc.saveMetrics(s,a),console.log(`
1388
1388
  ${Ie.cyan("Sprint Velocity")} ${Ie.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?Ie.green:m.estimationAccuracy>=60?Ie.yellow:Ie.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ie.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ie.green("\u2191"):a.velocityTrend==="declining"?Ie.red("\u2193"):Ie.dim("\u2192");if(console.log(` Average: ${Ie.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ie.bold(`${a.estimationAccuracy}%`)} ${Ie.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1389
1389
  ${Ie.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ie.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ie.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ie.green("\u2713")} ${m.category} tasks estimated within ${Ie.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Tm(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1390
- ${Ie.dim("Projection:")}`),console.log(` Backlog: ${Ie.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ie.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...wn,...n.velocity}}catch{}return wn}};Il();xl();import lT from"node:fs/promises";import uT from"node:path";qn();var Bx=[1,2,3,5,8,13,21],Jx={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}},Th=l(r=>Bx.includes(r),"isValidPoint"),Vi=l(r=>Jx[r],"pointsToMinutes"),xh=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Eh=l(r=>{let e=Vi(r);return`${xh(e.min)}\u2013${xh(e.max)}`},"pointsToTimeRange");we();F();import Bi from"node:fs/promises";import qx from"node:os";import Ji from"node:path";var Pu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ji.join(qx.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Bi.mkdir(this.commandsPath,{recursive:!0});let n=Ji.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Bi.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1390
+ ${Ie.dim("Projection:")}`),console.log(` Backlog: ${Ie.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ie.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...wn,...n.velocity}}catch{}return wn}};Il();xl();import uT from"node:fs/promises";import dT from"node:path";qn();var Bx=[1,2,3,5,8,13,21],Jx={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}},Th=l(r=>Bx.includes(r),"isValidPoint"),Vi=l(r=>Jx[r],"pointsToMinutes"),xh=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Eh=l(r=>{let e=Vi(r);return`${xh(e.min)}\u2013${xh(e.max)}`},"pointsToTimeRange");ke();F();import Bi from"node:fs/promises";import qx from"node:os";import Ji from"node:path";var Pu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ji.join(qx.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Bi.mkdir(this.commandsPath,{recursive:!0});let n=Ji.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Bi.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Ji.join(this.commandsPath,`${e}.md`);return await Bi.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
1391
1391
  allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
1392
1392
  ---
1393
1393
 
@@ -1423,35 +1423,35 @@ Suggest relevant actions based on the workflow results:
1423
1423
  - View rules: \`prjct workflow ${e} --md\`
1424
1424
  - Add rules: \`prjct workflow add "command" before ${e} --md\`
1425
1425
  - Run again: \`p. ${e}\`
1426
- `}},vu=new Pu;Xo();var qi=300*1e3,Ye=new Ft({ttl:qi,maxSize:100}),Ut=new Ft({ttl:qi,maxSize:10}),Bs=new Ft({ttl:qi,maxSize:5}),Js=new Ft({ttl:qi,maxSize:5});function xu(){Ye.clear(),Ut.clear(),Bs.clear(),Js.clear()}l(xu,"clearLinearCache");function Tu(){return{issues:Ye.stats(),assignedIssues:Ut.stats(),teams:Bs.stats(),projects:Js.stats()}}l(Tu,"getLinearCacheStats");F();Eu();var Zx={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},eT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Ih={none:0,urgent:1,high:2,medium:3,low:4},Xi=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await Ki("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${y(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Ih[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=Ih[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:Zx[t?.type||"backlog"]||"backlog",priority:eT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},gt=new Xi;var Yi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&gt.isConfigured()}async initialize(e){this.initialized||(await gt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Ut.get(t);if(n)return n;let s=await gt.fetchAssignedIssues(e);Ut.set(t,s);for(let o of s)Ye.set(`issue:${o.id}`,o),Ye.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Ut.get(n);if(s)return s;let o=await gt.fetchTeamIssues(e,t);Ut.set(n,o);for(let i of o)Ye.set(`issue:${i.id}`,i),Ye.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ye.get(t);if(n)return n;let s=await gt.fetchIssue(e);return s&&(Ye.set(`issue:${s.id}`,s),Ye.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await gt.createIssue(e);return Ye.set(`issue:${t.id}`,t),Ye.set(`issue:${t.externalId}`,t),Ut.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await gt.updateIssue(e,t);return Ye.set(`issue:${n.id}`,n),Ye.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await gt.markInProgress(e),Ye.delete(`issue:${e}`),Ut.clear()}async markDone(e){this.ensureInitialized(),await gt.markDone(e),Ye.delete(`issue:${e}`),Ut.clear()}async addComment(e,t){this.ensureInitialized(),await gt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Bs.get("teams");if(e)return e;let t=await gt.getTeams();return Bs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Js.get("projects");if(e)return e;let t=await gt.getProjects();return Js.set("projects",t),t}clearCache(){xu()}getCacheStats(){return Tu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},At=new Yi;Ta();ne();F();var Rh=1800*1e3,Qi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await At.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Rh,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await At.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await At.markInProgress(t):n==="done"&&await At.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Rh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=hd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},tT=new Qi;Dt();Ss();we();ne();oe();import{exec as nT}from"node:child_process";import{promisify as sT}from"node:util";var Dh=sT(nT),qs="session-snapshot",rT=30,Au=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,qs,u),u}getSnapshot(e){try{return A.getDoc(e,qs)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,qs)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,qs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=rT){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,qs);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,qs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${nn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${nn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1426
+ `}},vu=new Pu;Xo();var qi=300*1e3,Ye=new _t({ttl:qi,maxSize:100}),Ht=new _t({ttl:qi,maxSize:10}),Js=new _t({ttl:qi,maxSize:5}),qs=new _t({ttl:qi,maxSize:5});function xu(){Ye.clear(),Ht.clear(),Js.clear(),qs.clear()}l(xu,"clearLinearCache");function Tu(){return{issues:Ye.stats(),assignedIssues:Ht.stats(),teams:Js.stats(),projects:qs.stats()}}l(Tu,"getLinearCacheStats");F();Eu();var Zx={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},eT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Ih={none:0,urgent:1,high:2,medium:3,low:4},Xi=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await Ki("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${y(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Ih[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=Ih[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:Zx[t?.type||"backlog"]||"backlog",priority:eT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},gt=new Xi;var Yi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&gt.isConfigured()}async initialize(e){this.initialized||(await gt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Ht.get(t);if(n)return n;let s=await gt.fetchAssignedIssues(e);Ht.set(t,s);for(let o of s)Ye.set(`issue:${o.id}`,o),Ye.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Ht.get(n);if(s)return s;let o=await gt.fetchTeamIssues(e,t);Ht.set(n,o);for(let i of o)Ye.set(`issue:${i.id}`,i),Ye.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ye.get(t);if(n)return n;let s=await gt.fetchIssue(e);return s&&(Ye.set(`issue:${s.id}`,s),Ye.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await gt.createIssue(e);return Ye.set(`issue:${t.id}`,t),Ye.set(`issue:${t.externalId}`,t),Ht.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await gt.updateIssue(e,t);return Ye.set(`issue:${n.id}`,n),Ye.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await gt.markInProgress(e),Ye.delete(`issue:${e}`),Ht.clear()}async markDone(e){this.ensureInitialized(),await gt.markDone(e),Ye.delete(`issue:${e}`),Ht.clear()}async addComment(e,t){this.ensureInitialized(),await gt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Js.get("teams");if(e)return e;let t=await gt.getTeams();return Js.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=qs.get("projects");if(e)return e;let t=await gt.getProjects();return qs.set("projects",t),t}clearCache(){xu()}getCacheStats(){return Tu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},At=new Yi;Ta();ne();xs();F();var tT=/\b[A-Z]+-\d+\b/,Rh=1800*1e3,Qi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await At.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Rh,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await At.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await At.markInProgress(t):n==="done"&&await At.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Rh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}async reconcileQueue(e){let t=this.loadIssues(e);if(!t)return 0;let n=new Set;for(let[i,a]of Object.entries(t.issues))(a.status==="done"||a.status==="in_review")&&n.add(i);if(n.size===0)return 0;let s=await fe.getTasks(e),o=0;for(let i of s){if(i.completed)continue;let a=i.description.match(tT);a&&n.has(a[0])&&(await fe.completeTask(e,i.id),o++)}return o}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=hd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},nT=new Qi;Dt();Ss();ke();ne();oe();import{exec as sT}from"node:child_process";import{promisify as rT}from"node:util";var Dh=rT(sT),Ks="session-snapshot",oT=30,Au=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,Ks,u),u}getSnapshot(e){try{return A.getDoc(e,Ks)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,Ks)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,Ks);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=oT){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,Ks);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,Ks),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${nn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${nn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
1427
1427
  `)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${nn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await Dh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await Dh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
1428
- `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},In=new Au;Xt();Gc();Ir();ll();F();Ts();Es();Jc();F();Me();Eu();import oT from"node:fs/promises";import iT from"node:os";import aT from"node:path";function cT(r){return aT.join(iT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(cT,"getCredentialsPath");async function Zi(r){let e=cT(r);if(!await R(e))return{};try{return JSON.parse(await oT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(Zi,"getProjectCredentials");async function Iu(r){let e=await Zi(r);return e.linear?.apiKey?e.linear.apiKey:Ki("linear-api-key")}l(Iu,"getLinearApiKey");qn();nt();var dT=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Ks=class extends Se{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Lt(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Zi(o),k=await Iu(o);if(k&&f.linear?.teamId){await At.initializeFromApiKey(k,f.linear.teamId);let S=await At.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await At.markInProgress(e))}}catch{}if(n.md){try{await on.ensureReady()}catch(Ht){return vt("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Ht)}),{success:!1,error:y(Ht)}}let f=await _.getCurrentTask(o);if(f)return vt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=x.getGlobalProjectPath(o),[S,I,D,B]=await Promise.all([pT(),He.getActive(o).catch(()=>null),mT(k),pi(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),Pe=null;try{let Ht=In.getSnapshot(o);Ht&&(Pe=In.formatContinuityContext(Ht),In.clearSnapshot(o))}catch{}let $e=Bc({description:c,branch:S,linearId:a}),Be=gT(I,D),C=qp(B.files.map(Ht=>({path:Ht.path,description:Ht.reasons.join(", ")}))),j=fT(D),Re=hT(I),tr=yT(c,B.files,I),nr=ue([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(N(Pe,$e,tr,Be,C,j,Re,nr)),await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await Lt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Si.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await vl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Dr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await Lt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Th,pointsToMinutes:Vi,pointsToTimeRange:Eh,storeEstimate:l(async f=>{let k=Vi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?z.calculateDuration(new Date(i.startedAt)):void 0,c=Bc({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Jp(u,d):"",p=ue([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(N(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?vt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Lt(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=z.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await pt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?jh(d):"0m",actualDuration:c||"0m",variance:d?kT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${jh(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{In.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Zi(s),k=await Iu(s);k&&f.linear?.teamId&&(await At.initializeFromApiKey(k,f.linear.teamId),await At.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(N(fe("Completed",`${a}${f}`),dt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ue([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Dr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await Lt(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await xe.getActiveTasks(s);if(o.length===0)return t.md?vt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(N(Z("Queue",`${o.length} task${o.length!==1?"s":""}`),Ce(i,!0),ue([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await In.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(N(fe("Task Paused",`**Paused:** ${i.description}`),dt({Reason:e||void 0,"Duration worked":a||void 0}),ue([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Dr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?vt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(N(fe("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Dr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?vt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:s}of dT){let o=t.match(s);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(s=>s.action.toLowerCase().includes(n)||(s.description?.toLowerCase().includes(n)??!1)||s.command.toLowerCase().includes(n)||String(s.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=ct.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=ct.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=Te.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=ct.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=ct.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=Te.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(fe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!Te.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(N(fe("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=Te.resetRules(e);return t.md?console.log(N(fe("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let s=e.trim(),o=parseInt(s,10);if(!Number.isNaN(o)){let c=Te.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return Te.updateRule(t,o,{enabled:!1}),n.md?console.log(N(fe("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Te.getAllRules(t),a=this._searchRules(i,s);if(a.length===0){let c=`No rules matching "${s}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Te.updateRule(t,c.id,{enabled:!1}),n.md?console.log(N(fe("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(N(Z("Multiple matches",`${a.length} rules match "${s}"`),Ce(c),ue(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${s}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(N(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",Ce(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Z("Natural Language (EN/ES)",Ce(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=Te.getRulesForCommand(t,e):o=Te.getAllRules(t);let i=await vh(t);if(o.length===0&&i.length===0)return n.md?console.log(N(Z("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=e?[e]:s,c=[];for(let p of a){let g=o.filter(f=>f.command===p);g.length!==0&&c.push(wT(p,g))}let u=null;if(i.length>0){let p=i.map(g=>`[legacy] ${g.key} \u2192 \`${g.action}\` (${g.scope})`);u=Z("Legacy Preferences",Ce(p))}let d=e?`Workflow: ${e}`:"Workflow Rules",m=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(Z(d,m),c.length>0?Bp(c.join(`
1428
+ `).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},In=new Au;Xt();Gc();Ir();ll();F();Es();As();Jc();F();Me();Eu();import iT from"node:fs/promises";import aT from"node:os";import cT from"node:path";function lT(r){return cT.join(aT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(lT,"getCredentialsPath");async function Zi(r){let e=lT(r);if(!await R(e))return{};try{return JSON.parse(await iT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(Zi,"getProjectCredentials");async function Iu(r){let e=await Zi(r);return e.linear?.apiKey?e.linear.apiKey:Ki("linear-api-key")}l(Iu,"getLinearApiKey");qn();nt();var pT=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Xs=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Ut(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Zi(o),k=await Iu(o);if(k&&f.linear?.teamId){await At.initializeFromApiKey(k,f.linear.teamId);let S=await At.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await At.markInProgress(e))}}catch{}if(n.md){try{await on.ensureReady()}catch(Gt){return vt("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Gt)}),{success:!1,error:y(Gt)}}let f=await _.getCurrentTask(o);if(f)return vt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=x.getGlobalProjectPath(o),[S,I,D,B]=await Promise.all([mT(),Ge.getActive(o).catch(()=>null),gT(k),pi(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),ve=null;try{let Gt=In.getSnapshot(o);Gt&&(ve=In.formatContinuityContext(Gt),In.clearSnapshot(o))}catch{}let $e=Bc({description:c,branch:S,linearId:a}),Be=fT(I,D),C=qp(B.files.map(Gt=>({path:Gt.path,description:Gt.reasons.join(", ")}))),j=hT(D),Re=yT(I),nr=wT(c,B.files,I),sr=ue([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(N(ve,$e,nr,Be,C,j,Re,sr)),await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await Ut(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Si.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await vl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Dr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await Ut(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Th,pointsToMinutes:Vi,pointsToTimeRange:Eh,storeEstimate:l(async f=>{let k=Vi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?z.calculateDuration(new Date(i.startedAt)):void 0,c=Bc({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Jp(u,d):"",p=ue([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(N(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?vt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Ut(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=z.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await pt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?jh(d):"0m",actualDuration:c||"0m",variance:d?ST(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${jh(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{In.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Zi(s),k=await Iu(s);k&&f.linear?.teamId&&(await At.initializeFromApiKey(k,f.linear.teamId),await At.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(N(he("Completed",`${a}${f}`),dt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ue([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Dr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await Ut(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await fe.getActiveTasks(s);if(o.length===0)return t.md?vt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(N(Z("Queue",`${o.length} task${o.length!==1?"s":""}`),Pe(i,!0),ue([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?vt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await In.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(N(he("Task Paused",`**Paused:** ${i.description}`),dt({Reason:e||void 0,"Duration worked":a||void 0}),ue([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Dr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?vt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(N(he("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Dr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?vt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:s}of pT){let o=t.match(s);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(s=>s.action.toLowerCase().includes(n)||(s.description?.toLowerCase().includes(n)??!1)||s.command.toLowerCase().includes(n)||String(s.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=ct.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=ct.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=Te.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(he("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=ct.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=ct.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=Te.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(N(he("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!Te.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(N(he("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=Te.resetRules(e);return t.md?console.log(N(he("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let s=e.trim(),o=parseInt(s,10);if(!Number.isNaN(o)){let c=Te.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return Te.updateRule(t,o,{enabled:!1}),n.md?console.log(N(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Te.getAllRules(t),a=this._searchRules(i,s);if(a.length===0){let c=`No rules matching "${s}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Te.updateRule(t,c.id,{enabled:!1}),n.md?console.log(N(he("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(N(Z("Multiple matches",`${a.length} rules match "${s}"`),Pe(c),ue(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${s}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(N(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",Pe(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Z("Natural Language (EN/ES)",Pe(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=Te.getRulesForCommand(t,e):o=Te.getAllRules(t);let i=await vh(t);if(o.length===0&&i.length===0)return n.md?console.log(N(Z("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=e?[e]:s,c=[];for(let p of a){let g=o.filter(f=>f.command===p);g.length!==0&&c.push(kT(p,g))}let u=null;if(i.length>0){let p=i.map(g=>`[legacy] ${g.key} \u2192 \`${g.action}\` (${g.scope})`);u=Z("Legacy Preferences",Pe(p))}let d=e?`Workflow: ${e}`:"Workflow Rules",m=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(Z(d,m),c.length>0?Bp(c.join(`
1429
1429
 
1430
- `),""):null,u,ue([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async _workflowInit(e,t,n){let s=Te.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(s.length>0){let u=`Ship workflow already has ${s.length} rule${s.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await ti(t),i=0,a=[],c=Te.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(n.md)console.log(N(fe("Workflow Initialized",`Added ${a.length} default ship rules`),Ce(a),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,n,s){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!ct.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=ct.createWorkflow(t,{name:i,description:a}),d=await vu.generateWorkflowTemplate(i,a);if(!d.success){ct.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return s.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return s.md?console.log(N(fe("Workflow Created",`Created workflow: ${i}`),Z("Description",a),Z("Template",`Installed at ${d.path}`),ue([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1430
+ `),""):null,u,ue([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async _workflowInit(e,t,n){let s=Te.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(s.length>0){let u=`Ship workflow already has ${s.length} rule${s.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await ti(t),i=0,a=[],c=Te.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=Te.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(n.md)console.log(N(he("Workflow Initialized",`Added ${a.length} default ship rules`),Pe(a),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,n,s){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!ct.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=ct.createWorkflow(t,{name:i,description:a}),d=await vu.generateWorkflowTemplate(i,a);if(!d.success){ct.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return s.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return s.md?console.log(N(he("Workflow Created",`Created workflow: ${i}`),Z("Description",a),Z("Template",`Installed at ${d.path}`),ue([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
1431
1431
  Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return s.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let n=ct.getAllWorkflows(e);if(n.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let s=n.filter(i=>i.isBuiltin),o=n.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(s.length>0){let a=s.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Built-in Workflows",a.join(`
1432
1432
  `)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Z("Custom Workflows",a.join(`
1433
1433
  `)))}console.log(N(...i,ue([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${n.length} workflow${n.length!==1?"s":""}`),s.length>0){console.log(`
1434
1434
  Built-in:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
1435
- Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let s=e.trim();if(!s){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!ct.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await vu.deleteWorkflowTemplate(s),n.md?console.log(N(fe("Workflow Deleted",`Deleted workflow: ${s}`))):h.done(`deleted workflow: ${s}`),{success:!0}}catch(o){let i=y(o);return n.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=ct.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Lt(o,i,"before",{projectPath:t});if(!c.success){if(n.md)vt("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Lt(o,i,"after",{projectPath:t}),n.md?console.log(N(fe(`Workflow: ${i}`,a.description||""),ue([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=y(s);return n.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await In.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await In.listAllSnapshots();if(n.length===0)return t.md?vt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=z.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(N(Z("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),Ce(s),ue([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=z.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function jh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(jh,"formatMinutesToDuration");async function pT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(pT,"getGitBranch");async function mT(r){try{let e=uT.join(r,"analysis","repo-analysis.json"),t=await lT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(mT,"loadRepoAnalysis");function gT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=dt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1436
- ${Ce(g)}`}return[u?`### Project
1435
+ Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let s=e.trim();if(!s){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!ct.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await vu.deleteWorkflowTemplate(s),n.md?console.log(N(he("Workflow Deleted",`Deleted workflow: ${s}`))):h.done(`deleted workflow: ${s}`),{success:!0}}catch(o){let i=y(o);return n.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=ct.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Ut(o,i,"before",{projectPath:t});if(!c.success){if(n.md)vt("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Ut(o,i,"after",{projectPath:t}),n.md?console.log(N(he(`Workflow: ${i}`,a.description||""),ue([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=y(s);return n.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await In.cleanup();return t.md?console.log(he("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await In.listAllSnapshots();if(n.length===0)return t.md?vt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=z.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(N(Z("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),Pe(s),ue([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=z.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function jh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(jh,"formatMinutesToDuration");async function mT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(mT,"getGitBranch");async function gT(r){try{let e=dT.join(r,"analysis","repo-analysis.json"),t=await uT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(gT,"loadRepoAnalysis");function fT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=dt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
1436
+ ${Pe(g)}`}return[u?`### Project
1437
1437
  ${u}`:null,m].filter(Boolean).join(`
1438
1438
 
1439
- `)||null}l(gT,"buildProjectContext");function fT(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Kp(e)}l(fT,"buildRules");function hT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.slice(0,8).map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"",a=o.source?` [${o.source}]`:"";return`- **${o.name}**${a}: ${o.description}${i}`});e.push(`### Patterns (follow these)
1439
+ `)||null}l(fT,"buildProjectContext");function hT(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Kp(e)}l(hT,"buildRules");function yT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.slice(0,8).map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"",a=o.source?` [${o.source}]`:"";return`- **${o.name}**${a}: ${o.description}${i}`});e.push(`### Patterns (follow these)
1440
1440
  ${s.join(`
1441
1441
  `)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s={high:0,medium:1,low:2},i=[...n].sort((a,c)=>{let u=s[a.severity||"low"]??2,d=s[c.severity||"low"]??2;return u-d}).slice(0,8).map(a=>{let c=(a.severity||"low").toUpperCase(),u=a.source?` [${a.source}]`:"";return`- **[${c}] ${a.issue}**${u} \u2014 \`${a.file}\` \u2192 ${a.suggestion}`});e.push(`### Anti-patterns (avoid these)
1442
1442
  ${i.join(`
1443
1443
  `)}`)}return e.length>0?e.join(`
1444
1444
 
1445
- `):null}l(hT,"buildPatterns");function yT(r,e,t){let n=e.slice(0,4).map(c=>`\`${c.path}\``),s=(t?.patterns||[]).slice(0,3).map(c=>c.name),o=l(c=>c==="high"?0:c==="medium"?1:2,"severityWeight"),i=(t?.antiPatterns||[]).sort((c,u)=>o(c.severity)-o(u.severity)).slice(0,3).map(c=>`${c.issue} (${c.file})`);return["### Context Contract",`- Goal: ${r}`,`- Key files: ${n.length>0?n.join(", "):"Run `prjct sync` to improve file targeting"}`,`- Patterns: ${s.length>0?s.join(" | "):"No patterns yet (run `prjct sync`)"}`,`- Must avoid: ${i.length>0?i.join(" | "):"No anti-patterns yet (run `prjct sync`)"}`,"- Do now: confirm approach, follow patterns, avoid anti-patterns before editing"].join(`
1446
- `)}l(yT,"buildContextContract");function wT(r,e){let t=e.filter(d=>d.type==="gate"&&d.position==="before"),n=e.filter(d=>d.type==="hook"&&d.position==="before"),s=e.filter(d=>d.type==="step"&&d.position==="before"),o=e.filter(d=>d.type==="hook"&&d.position==="after"),i=e.filter(d=>d.type==="step"&&d.position==="after"),a=[],c=l((d,m,p)=>{let g=m.map(I=>` ${I.enabled?p:"o"} #${I.id} ${I.action}`),f=[d,...g],S=Math.max(...f.map(I=>I.length))+2;a.push(`+${"-".repeat(S)}+`);for(let I of f)a.push(`| ${I.padEnd(S-1)}|`);a.push(`+${"-".repeat(S)}+`)},"drawBox"),u=l(d=>{d.push(" |"),d.push(" v")},"arrow");return t.length>0&&(c("GATES (must pass)",t,"#"),u(a)),n.length>0&&(c("HOOKS (before)",n,">"),u(a)),s.length>0&&(c("STEPS (before)",s,">"),u(a)),a.push(` [ ${r.toUpperCase()} ]`),o.length>0&&(u(a),c("HOOKS (after)",o,">")),i.length>0&&(u(a),c("STEPS (after)",i,">")),a.join(`
1447
- `)}l(wT,"buildFlowDiagram");function kT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}l(kT,"formatVariance");var as=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ks,this.planning=new es,this.shipping=new Gs,this.analytics=new _s,this.performanceCmds=new Us,this.maintenance=new Ls,this.analysis=new os,this.setupCmds=new Hs,this.updateCmds=new Ws,this.velocityCmds=new Vs,this.contextCmds=new is,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},JB=new as;Pi();var $h={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Mh=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Ci();Sn();we();F();Me();nt();import{execSync as ea}from"node:child_process";import ft from"node:fs/promises";import ST from"node:os";import mn from"node:path";import bT from"node:readline";import be from"chalk";var ta="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",qr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Ru(r){let e=0;try{let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name);if(n.isDirectory())e+=await Ru(s);else try{let o=await ft.stat(s);e+=o.size}catch{}}}catch{}return e}l(Ru,"getDirectorySize");function Oh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Oh,"formatSize");async function CT(r){try{return(await ft.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(CT,"countDirectoryItems");function PT(){let r={homebrew:!1,npm:!1};try{ea("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ea("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(PT,"detectInstallation");async function vT(){let r=[],e=Kd(),t=x.getGlobalBasePath(),n=await R(t),s=n?await CT(mn.join(t,"projects")):0,o=n?await Ru(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=mn.join(e.claude.config,"CLAUDE.md"),a=await R(i),c=!1;if(a)try{let $e=await ft.readFile(i,"utf-8");c=$e.includes(ta)&&$e.includes(qr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await R(u),m=d?await Ru(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await R(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=mn.join(e.claude.config,"prjct-statusline.sh"),k=await R(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,I=await R(S);r.push({path:S,type:"file",description:"Gemini router",exists:I});let D=mn.join(e.gemini.config,"GEMINI.md"),B=await R(D),Pe=!1;if(B)try{let $e=await ft.readFile(D,"utf-8");Pe=$e.includes(ta)&&$e.includes(qr)}catch{}return B&&Pe&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(vT,"gatherUninstallItems");async function xT(r){try{let e=await ft.readFile(r,"utf-8");if(!e.includes(ta)||!e.includes(qr))return!1;let t=e.indexOf(ta),n=e.indexOf(qr)+qr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1445
+ `):null}l(yT,"buildPatterns");function wT(r,e,t){let n=e.slice(0,4).map(c=>`\`${c.path}\``),s=(t?.patterns||[]).slice(0,3).map(c=>c.name),o=l(c=>c==="high"?0:c==="medium"?1:2,"severityWeight"),i=(t?.antiPatterns||[]).sort((c,u)=>o(c.severity)-o(u.severity)).slice(0,3).map(c=>`${c.issue} (${c.file})`);return["### Context Contract",`- Goal: ${r}`,`- Key files: ${n.length>0?n.join(", "):"Run `prjct sync` to improve file targeting"}`,`- Patterns: ${s.length>0?s.join(" | "):"No patterns yet (run `prjct sync`)"}`,`- Must avoid: ${i.length>0?i.join(" | "):"No anti-patterns yet (run `prjct sync`)"}`,"- Do now: confirm approach, follow patterns, avoid anti-patterns before editing"].join(`
1446
+ `)}l(wT,"buildContextContract");function kT(r,e){let t=e.filter(d=>d.type==="gate"&&d.position==="before"),n=e.filter(d=>d.type==="hook"&&d.position==="before"),s=e.filter(d=>d.type==="step"&&d.position==="before"),o=e.filter(d=>d.type==="hook"&&d.position==="after"),i=e.filter(d=>d.type==="step"&&d.position==="after"),a=[],c=l((d,m,p)=>{let g=m.map(I=>` ${I.enabled?p:"o"} #${I.id} ${I.action}`),f=[d,...g],S=Math.max(...f.map(I=>I.length))+2;a.push(`+${"-".repeat(S)}+`);for(let I of f)a.push(`| ${I.padEnd(S-1)}|`);a.push(`+${"-".repeat(S)}+`)},"drawBox"),u=l(d=>{d.push(" |"),d.push(" v")},"arrow");return t.length>0&&(c("GATES (must pass)",t,"#"),u(a)),n.length>0&&(c("HOOKS (before)",n,">"),u(a)),s.length>0&&(c("STEPS (before)",s,">"),u(a)),a.push(` [ ${r.toUpperCase()} ]`),o.length>0&&(u(a),c("HOOKS (after)",o,">")),i.length>0&&(u(a),c("STEPS (after)",i,">")),a.join(`
1447
+ `)}l(kT,"buildFlowDiagram");function ST(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}l(ST,"formatVariance");var as=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Xs,this.planning=new es,this.shipping=new zs,this.analytics=new Ns,this.performanceCmds=new Hs,this.maintenance=new Us,this.analysis=new os,this.setupCmds=new Gs,this.updateCmds=new Vs,this.velocityCmds=new Bs,this.contextCmds=new is,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},KB=new as;Pi();var $h={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Mh=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Ci();Sn();ke();F();Me();nt();import{execSync as ea}from"node:child_process";import ft from"node:fs/promises";import bT from"node:os";import mn from"node:path";import CT from"node:readline";import Ce from"chalk";var ta="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",qr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Ru(r){let e=0;try{let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name);if(n.isDirectory())e+=await Ru(s);else try{let o=await ft.stat(s);e+=o.size}catch{}}}catch{}return e}l(Ru,"getDirectorySize");function Oh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Oh,"formatSize");async function PT(r){try{return(await ft.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(PT,"countDirectoryItems");function vT(){let r={homebrew:!1,npm:!1};try{ea("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ea("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(vT,"detectInstallation");async function xT(){let r=[],e=Kd(),t=x.getGlobalBasePath(),n=await R(t),s=n?await PT(mn.join(t,"projects")):0,o=n?await Ru(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=mn.join(e.claude.config,"CLAUDE.md"),a=await R(i),c=!1;if(a)try{let $e=await ft.readFile(i,"utf-8");c=$e.includes(ta)&&$e.includes(qr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await R(u),m=d?await Ru(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await R(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=mn.join(e.claude.config,"prjct-statusline.sh"),k=await R(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,I=await R(S);r.push({path:S,type:"file",description:"Gemini router",exists:I});let D=mn.join(e.gemini.config,"GEMINI.md"),B=await R(D),ve=!1;if(B)try{let $e=await ft.readFile(D,"utf-8");ve=$e.includes(ta)&&$e.includes(qr)}catch{}return B&&ve&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(xT,"gatherUninstallItems");async function TT(r){try{let e=await ft.readFile(r,"utf-8");if(!e.includes(ta)||!e.includes(qr))return!1;let t=e.indexOf(ta),n=e.indexOf(qr)+qr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1448
1448
 
1449
1449
  `).trim(),!s||s.trim().length===0?await ft.unlink(r):await ft.writeFile(r,`${s}
1450
- `,"utf-8"),!0}catch{return!1}}l(xT,"removePrjctSection");async function TT(){let r=ST.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=mn.join(r,`.prjct-backup-${e}`);try{await ft.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await R(n)&&await Fh(n,mn.join(t,".prjct-cli")),t}catch{return null}}l(TT,"createBackup");async function Fh(r,e){await ft.mkdir(e,{recursive:!0});let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name),o=mn.join(e,n.name);n.isDirectory()?await Fh(s,o):await ft.copyFile(s,o)}}l(Fh,"copyDirectory");async function ET(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await xT(o.path)&&n.push(o.path):o.type==="directory"?(await ft.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ft.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${y(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ea("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${y(o)}`)}}return{deleted:n,errors:s}}l(ET,"performUninstall");async function AT(r){let e=bT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(AT,"promptConfirmation");async function IT(r={},e=process.cwd()){let t=await vT(),n=PT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(be.yellow(`
1451
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(be.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(be.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${Oh(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${Oh(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await TT();c?(console.log(be.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(be.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(be.yellow('Type "uninstall" to confirm:')),!await AT("> ")))return console.log(be.yellow(`
1452
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await ET(t,n,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
1453
- ${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(IT,"uninstall");var na=class extends Se{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return IT(e,t)}};var cs=new Ks,sa=new es,RT=new Gs,_h=new _s,DT=new Us,Xs=new Ls,Ys=new os,Nh=new Hs,jT=new is,$T=new Vs,MT=new na,OT=new Ws;function FT(){for(let[r,e]of Object.entries($h))W.registerCategory(r,e)}l(FT,"registerCategories");function Lh(){if(W.has("work"))return;FT();let r=l(e=>Mh.find(t=>t.name===e),"getMeta");W.registerMethod("task",cs,"now",r("task")),W.registerMethod("done",cs,"done",r("done")),W.registerMethod("next",cs,"next",r("next")),W.registerMethod("pause",cs,"pause",r("pause")),W.registerMethod("resume",cs,"resume",r("resume")),W.registerMethod("workflow",cs,"workflow",r("workflow")),W.registerMethod("sessions",cs,"sessions",r("sessions")),W.registerMethod("init",sa,"init",r("init")),W.registerMethod("bug",sa,"bug",r("bug")),W.registerMethod("idea",sa,"idea",r("idea")),W.registerMethod("spec",sa,"spec",r("spec")),W.registerMethod("ship",RT,"ship",r("ship")),W.registerMethod("dash",_h,"dash",r("dash")),W.registerMethod("help",_h,"help",r("help")),W.registerMethod("perf",DT,"perf",r("perf")),W.registerMethod("velocity",$T,"velocity",r("velocity")),W.registerMethod("cleanup",Xs,"cleanup",r("cleanup")),W.registerMethod("design",Xs,"design",r("design")),W.registerMethod("recover",Xs,"recover",r("recover")),W.registerMethod("undo",Xs,"undo",r("undo")),W.registerMethod("redo",Xs,"redo",r("redo")),W.registerMethod("history",Xs,"history",r("history")),W.registerMethod("analyze",Ys,"analyze",r("analyze")),W.registerMethod("sync",Ys,"sync",r("sync")),W.registerMethod("stats",Ys,"stats",r("stats")),W.registerMethod("status",Ys,"status",r("status")),W.registerMethod("seal",Ys,"seal",r("seal")),W.registerMethod("verify",Ys,"verify",r("verify")),W.registerMethod("start",Nh,"start",r("start")),W.registerMethod("setup",Nh,"setup",r("setup")),W.registerMethod("uninstall",MT,"uninstall",r("uninstall")),W.registerMethod("update",OT,"update",r("update")),W.registerMethod("context",jT,"context",r("context"))}l(Lh,"registerAllCommands");Lh();wt();ya();import{Hono as JT}from"hono";import{cors as qT}from"hono/cors";import{logger as KT}from"hono/logger";we();ne();vr();Tr();Er();xs();F();vn();import _T from"node:fs/promises";import NT from"node:path";import{Hono as LT}from"hono";function UT(r){return x.getGlobalProjectPath(r)}l(UT,"getProjectDataPath");function Uh(r,e){let t=new LT,n=UT(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await xe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await qe.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await ut.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),xe.read(r),qe.read(r),ut.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=NT.join(n,"context",`${o}.md`),c=await _T.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Uh,"createRoutes");we();ne();vr();Tr();Er();xs();import Qs from"node:fs/promises";import HT from"node:path";import{Hono as GT}from"hono";var zT=x.getGlobalBasePath(),Zs=HT.join(zT,"projects");function ra(r){return A.getDoc(r,"project")}l(ra,"getProjectConfig");async function Du(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}l(Du,"calculateDuration");function Hh(){let r=new GT;return r.get("/projects",async e=>{try{await Qs.mkdir(Zs,{recursive:!0});let n=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=ra(o),a=await _.read(o),c=await xe.read(o),u=await qe.read(o),d=await ut.read(o),m=a?.currentTask,p=await Du(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(ra(t)),_.read(t),xe.read(t),qe.read(t),ut.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Du(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),xe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await qe.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Qs.mkdir(Zs,{recursive:!0});let n=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await xe.read(c),m=await qe.read(c),p=await ut.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Qs.mkdir(Zs,{recursive:!0});let s=(await Qs.readdir(Zs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=ra(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=ra(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Du(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Hh,"createExtendedRoutes");ia();import{streamSSE as WT}from"hono/streaming";var Gh=3600*1e3,VT=300*1e3,BT=3e4;function zh(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Gh&&t(i)},VT),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return WT(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},BT),p=setTimeout(()=>{t(a)},Gh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(zh,"createSSEManager");function Wh(r){let e=new JT,t=zh();r.enableCors!==!1&&e.use("*",qT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",KT()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Uh(r.projectId,r.projectPath);e.route("/api",n);let s=Hh();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(ar())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${ar()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(Wh,"createServer");var Vh=3478;var tn={runDir:l(()=>`${process.env.HOME||Dn("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${tn.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${tn.runDir()}/daemon.pid`,"pid"),log:l(()=>`${tn.runDir()}/daemon.log`,"log")},Bh=1800*1e3;function ju(r){return Buffer.from(`${JSON.stringify(r)}
1454
- `)}l(ju,"encodeMessage");var er=null,Kr=null,me=null,Ge=null;async function Jh(r){let e=tn.socket(),t=tn.pid(),n=tn.runDir();if(It.mkdirSync(n,{recursive:!0}),It.existsSync(t)){let s=parseInt(It.readFileSync(t,"utf-8").trim(),10);tE(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),It.unlinkSync(t)}if(It.existsSync(e)&&It.unlinkSync(e),Ge={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Bh,idleTimer:null},me=new as,er=XT(s=>YT(s)),er.listen(e,()=>{It.chmodSync(e,384),It.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),qh()}),er.on("error",s=>{console.error("Daemon socket error:",s.message),Xr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Vh;Kr=Wh({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Kr.start()}}catch{}if(process.on("SIGTERM",()=>Xr(0)),process.on("SIGINT",()=>Xr(0)),process.on("SIGHUP",()=>{me=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Jh,"startDaemon");function YT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1455
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await QT(o);r.write(ju(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ju(i))}}}),r.on("error",()=>{})}l(YT,"handleConnection");async function QT(r){if(!Ge||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(qh(),Ge.commandsServed++,Ge.lastActivity=Date.now(),r.command==="daemon")return eE(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await ZT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1450
+ `,"utf-8"),!0}catch{return!1}}l(TT,"removePrjctSection");async function ET(){let r=bT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=mn.join(r,`.prjct-backup-${e}`);try{await ft.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await R(n)&&await Fh(n,mn.join(t,".prjct-cli")),t}catch{return null}}l(ET,"createBackup");async function Fh(r,e){await ft.mkdir(e,{recursive:!0});let t=await ft.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name),o=mn.join(e,n.name);n.isDirectory()?await Fh(s,o):await ft.copyFile(s,o)}}l(Fh,"copyDirectory");async function AT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await TT(o.path)&&n.push(o.path):o.type==="directory"?(await ft.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ft.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${y(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ea("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${y(o)}`)}}return{deleted:n,errors:s}}l(AT,"performUninstall");async function IT(r){let e=CT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(IT,"promptConfirmation");async function RT(r={},e=process.cwd()){let t=await xT(),n=vT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
1451
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${Oh(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${Oh(o)}`)),console.log("")),r.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(Ce.blue("Creating backup..."));let c=await ET();c?(console.log(Ce.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await IT("> ")))return console.log(Ce.yellow(`
1452
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await AT(t,n,r);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1453
+ ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(RT,"uninstall");var na=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return RT(e,t)}};var cs=new Xs,sa=new es,DT=new zs,_h=new Ns,jT=new Hs,Ys=new Us,Qs=new os,Nh=new Gs,$T=new is,MT=new Bs,OT=new na,FT=new Vs;function _T(){for(let[r,e]of Object.entries($h))W.registerCategory(r,e)}l(_T,"registerCategories");function Lh(){if(W.has("work"))return;_T();let r=l(e=>Mh.find(t=>t.name===e),"getMeta");W.registerMethod("task",cs,"now",r("task")),W.registerMethod("done",cs,"done",r("done")),W.registerMethod("next",cs,"next",r("next")),W.registerMethod("pause",cs,"pause",r("pause")),W.registerMethod("resume",cs,"resume",r("resume")),W.registerMethod("workflow",cs,"workflow",r("workflow")),W.registerMethod("sessions",cs,"sessions",r("sessions")),W.registerMethod("init",sa,"init",r("init")),W.registerMethod("bug",sa,"bug",r("bug")),W.registerMethod("idea",sa,"idea",r("idea")),W.registerMethod("spec",sa,"spec",r("spec")),W.registerMethod("ship",DT,"ship",r("ship")),W.registerMethod("dash",_h,"dash",r("dash")),W.registerMethod("help",_h,"help",r("help")),W.registerMethod("perf",jT,"perf",r("perf")),W.registerMethod("velocity",MT,"velocity",r("velocity")),W.registerMethod("cleanup",Ys,"cleanup",r("cleanup")),W.registerMethod("design",Ys,"design",r("design")),W.registerMethod("recover",Ys,"recover",r("recover")),W.registerMethod("undo",Ys,"undo",r("undo")),W.registerMethod("redo",Ys,"redo",r("redo")),W.registerMethod("history",Ys,"history",r("history")),W.registerMethod("analyze",Qs,"analyze",r("analyze")),W.registerMethod("sync",Qs,"sync",r("sync")),W.registerMethod("stats",Qs,"stats",r("stats")),W.registerMethod("status",Qs,"status",r("status")),W.registerMethod("seal",Qs,"seal",r("seal")),W.registerMethod("verify",Qs,"verify",r("verify")),W.registerMethod("start",Nh,"start",r("start")),W.registerMethod("setup",Nh,"setup",r("setup")),W.registerMethod("uninstall",OT,"uninstall",r("uninstall")),W.registerMethod("update",FT,"update",r("update")),W.registerMethod("context",$T,"context",r("context"))}l(Lh,"registerAllCommands");Lh();wt();ya();$t();import{Hono as qT}from"hono";import{cors as KT}from"hono/cors";import{logger as XT}from"hono/logger";ke();ne();xr();xs();Er();Ts();F();vn();import NT from"node:fs/promises";import LT from"node:path";import{Hono as UT}from"hono";function HT(r){return x.getGlobalProjectPath(r)}l(HT,"getProjectDataPath");function Uh(r,e){let t=new UT,n=HT(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await fe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await qe.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await ut.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),fe.read(r),qe.read(r),ut.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=LT.join(n,"context",`${o}.md`),c=await NT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Uh,"createRoutes");ke();ne();xr();xs();Er();Ts();import Zs from"node:fs/promises";import GT from"node:path";import{Hono as zT}from"hono";var WT=x.getGlobalBasePath(),er=GT.join(WT,"projects");function ra(r){return A.getDoc(r,"project")}l(ra,"getProjectConfig");async function Du(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}l(Du,"calculateDuration");function Hh(){let r=new zT;return r.get("/projects",async e=>{try{await Zs.mkdir(er,{recursive:!0});let n=(await Zs.readdir(er,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=ra(o),a=await _.read(o),c=await fe.read(o),u=await qe.read(o),d=await ut.read(o),m=a?.currentTask,p=await Du(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(ra(t)),_.read(t),fe.read(t),qe.read(t),ut.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Du(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),fe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await qe.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Zs.mkdir(er,{recursive:!0});let n=(await Zs.readdir(er,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await fe.read(c),m=await qe.read(c),p=await ut.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Zs.mkdir(er,{recursive:!0});let s=(await Zs.readdir(er,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=ra(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=ra(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Du(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Hh,"createExtendedRoutes");ia();import{streamSSE as VT}from"hono/streaming";var Gh=3600*1e3,BT=300*1e3,JT=3e4;function zh(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Gh&&t(i)},BT),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return VT(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},JT),p=setTimeout(()=>{t(a)},Gh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(zh,"createSSEManager");function Wh(r){let e=new qT,t=zh();r.enableCors!==!1&&e.use("*",KT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",XT()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Oe,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Uh(r.projectId,r.projectPath);e.route("/api",n);let s=Hh();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(cr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${cr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(Wh,"createServer");var Vh=3478;var tn={runDir:l(()=>`${process.env.HOME||Dn("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${tn.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${tn.runDir()}/daemon.pid`,"pid"),log:l(()=>`${tn.runDir()}/daemon.log`,"log")},Bh=1800*1e3;function ju(r){return Buffer.from(`${JSON.stringify(r)}
1454
+ `)}l(ju,"encodeMessage");var tr=null,Kr=null,me=null,ze=null;async function Jh(r){let e=tn.socket(),t=tn.pid(),n=tn.runDir();if(It.mkdirSync(n,{recursive:!0}),It.existsSync(t)){let s=parseInt(It.readFileSync(t,"utf-8").trim(),10);nE(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),It.unlinkSync(t)}if(It.existsSync(e)&&It.unlinkSync(e),ze={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Bh,idleTimer:null},me=new as,tr=YT(s=>QT(s)),tr.listen(e,()=>{It.chmodSync(e,384),It.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),qh()}),tr.on("error",s=>{console.error("Daemon socket error:",s.message),Xr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||Vh;Kr=Wh({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Kr.start()}}catch{}if(process.on("SIGTERM",()=>Xr(0)),process.on("SIGINT",()=>Xr(0)),process.on("SIGHUP",()=>{me=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Jh,"startDaemon");function QT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1455
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await ZT(o);r.write(ju(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ju(i))}}}),r.on("error",()=>{})}l(QT,"handleConnection");async function ZT(r){if(!ze||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(qh(),ze.commandsServed++,ze.lastActivity=Date.now(),r.command==="daemon")return tE(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await eE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1456
1456
  `)||o.message||void 0,stderr:t.join(`
1457
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(QT,"handleRequest");async function ZT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return me.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return me.status(r.cwd,{json:t.json===!0,md:n});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:n});case"done":return me.done(r.cwd,{md:n});case"next":return me.next(r.cwd,{md:n});case"pause":return me.pause(e||"",r.cwd,{md:n});case"resume":return me.resume(e,r.cwd,{md:n});case"bug":return me.bug(e||"",r.cwd,{md:n});case"idea":return me.idea(e||"",r.cwd,{md:n});case"ship":return me.ship(e,r.cwd,{md:n});case"dash":return me.dash(e||"default",r.cwd,{md:n});case"workflow":return me.workflowPrefs(e,r.cwd,{md:n});case"sessions":return me.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t);case"analysis-payload":return me.analysisPayload(r.cwd,{json:t.json===!0,md:n});case"analysis-save-llm":return me.saveLlmAnalysis(e||"",r.cwd,{md:n});case"analysis-llm":return me.getLlmAnalysis(r.cwd,{json:t.json===!0,md:n});case"analyze":return me.analyze(t);case"cleanup":return me.cleanup(t);default:return W.execute(r.command,e,r.cwd)}}l(ZT,"executeCommand");function eE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:tn.socket(),uptime:Ge?Date.now()-Ge.startedAt:0,commandsServed:Ge?.commandsServed??0,lastActivity:Ge?new Date(Ge.lastActivity).toISOString():null,registeredCommands:W.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Xr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(eE,"handleDaemonCommand");function qh(){Ge&&(Ge.idleTimer&&clearTimeout(Ge.idleTimer),Ge.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ge.idleTimeoutMs/1e3/60} minutes, shutting down`),Xr(0)},Ge.idleTimeoutMs),Ge.idleTimer.unref&&Ge.idleTimer.unref())}l(qh,"resetIdleTimer");function Xr(r){console.log("Daemon shutting down..."),Ge?.idleTimer&&clearTimeout(Ge.idleTimer),Kr&&(Kr.stop(),Kr=null),er&&(er.close(),er=null);let e=tn.socket(),t=tn.pid();try{It.existsSync(e)&&It.unlinkSync(e)}catch{}try{It.existsSync(t)&&It.unlinkSync(t)}catch{}process.exit(r)}l(Xr,"shutdown");function tE(r){try{return process.kill(r,0),!0}catch{return!1}}l(tE,"isProcessRunning");var $u=process.argv.slice(2),nE=parseInt($u.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,sE=$u.includes("--no-http"),rE=$u.includes("--foreground");Jh({port:nE,noHttp:sE,foreground:rE}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1457
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(ZT,"handleRequest");async function eE(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return me.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return me.status(r.cwd,{json:t.json===!0,md:n});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:n});case"done":return me.done(r.cwd,{md:n});case"next":return me.next(r.cwd,{md:n});case"pause":return me.pause(e||"",r.cwd,{md:n});case"resume":return me.resume(e,r.cwd,{md:n});case"bug":return me.bug(e||"",r.cwd,{md:n});case"idea":return me.idea(e||"",r.cwd,{md:n});case"ship":return me.ship(e,r.cwd,{md:n});case"dash":return me.dash(e||"default",r.cwd,{md:n});case"workflow":return me.workflowPrefs(e,r.cwd,{md:n});case"sessions":return me.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t);case"analysis-payload":return me.analysisPayload(r.cwd,{json:t.json===!0,md:n});case"analysis-save-llm":return me.saveLlmAnalysis(e||"",r.cwd,{md:n});case"analysis-llm":return me.getLlmAnalysis(r.cwd,{json:t.json===!0,md:n});case"analyze":return me.analyze(t);case"cleanup":return me.cleanup(t);default:return W.execute(r.command,e,r.cwd)}}l(eE,"executeCommand");function tE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:tn.socket(),uptime:ze?Date.now()-ze.startedAt:0,commandsServed:ze?.commandsServed??0,lastActivity:ze?new Date(ze.lastActivity).toISOString():null,registeredCommands:W.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Xr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(tE,"handleDaemonCommand");function qh(){ze&&(ze.idleTimer&&clearTimeout(ze.idleTimer),ze.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ze.idleTimeoutMs/1e3/60} minutes, shutting down`),Xr(0)},ze.idleTimeoutMs),ze.idleTimer.unref&&ze.idleTimer.unref())}l(qh,"resetIdleTimer");function Xr(r){console.log("Daemon shutting down..."),ze?.idleTimer&&clearTimeout(ze.idleTimer),Kr&&(Kr.stop(),Kr=null),tr&&(tr.close(),tr=null);let e=tn.socket(),t=tn.pid();try{It.existsSync(e)&&It.unlinkSync(e)}catch{}try{It.existsSync(t)&&It.unlinkSync(t)}catch{}process.exit(r)}l(Xr,"shutdown");function nE(r){try{return process.kill(r,0),!0}catch{return!1}}l(nE,"isProcessRunning");var $u=process.argv.slice(2),sE=parseInt($u.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,rE=$u.includes("--no-http"),oE=$u.includes("--foreground");Jh({port:sE,noHttp:rE,foreground:oE}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});