prjct-cli 1.52.3 → 1.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/bin/prjct-core.mjs +304 -295
- package/dist/daemon/entry.mjs +328 -319
- package/dist/mcp/server.mjs +145 -141
- package/package.json +2 -2
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -4,13 +4,17 @@ import { dirname as __pathDirname } from 'path';
|
|
|
4
4
|
var require = __createRequire(import.meta.url);
|
|
5
5
|
var __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
var __dirname = __pathDirname(__filename);
|
|
7
|
-
var
|
|
8
|
-
`)}function
|
|
9
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function
|
|
10
|
-
`,"utf-8")}async function
|
|
11
|
-
`)}async function
|
|
12
|
-
`);await bt(r,t)}function Vy(r){return gs.extname(r)}function By(r){return gs.basename(r,gs.extname(r))}var V=S(()=>{"use strict";Aa();Td();H();l(nn,"walkDir");l(rn,"batchProcess");l(je,"readJson");l(ce,"writeJson");l(De,"readFile");l(bt,"writeFile");l($y,"atomicWrite");l(My,"appendToFile");l(Da,"appendLine");l(_y,"prependToFile");l(E,"fileExists");l(qt,"dirExists");l(Qe,"ensureDir");l(Oy,"deleteFile");l(Ny,"deleteDir");l(fs,"listFiles");l(Ly,"getFileSize");l(Fy,"getFileModifiedTime");l(Uy,"copyFile");l(Hy,"moveFile");l(Gy,"readLines");l(Wy,"writeLines");l(Vy,"getFileExtension");l(By,"getFileNameWithoutExtension")});function Ds(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var $n,on=S(()=>{"use strict";l(Ds,"isExpired");$n=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Pd={};we(Pd,{invalidateProviderCache:()=>Ky,readProviderCache:()=>$a,writeProviderCache:()=>Ma});import Ed from"node:fs/promises";import zy from"node:os";import Cd from"node:path";async function $a(){try{let r=await Ed.readFile(Ia,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ds(e.timestamp,Jy)?null:e.detection}catch{return null}}async function Ma(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(Ia,e)}async function Ky(){try{await Ed.unlink(Ia)}catch{}}var qy,Ia,Jy,_a=S(()=>{"use strict";on();V();qy=Cd.join(zy.homedir(),".prjct-cli","cache"),Ia=Cd.join(qy,"providers.json"),Jy=600*1e3;l($a,"readProviderCache");l(Ma,"writeProviderCache");l(Ky,"invalidateProviderCache")});var It={};we(It,{AntigravityProvider:()=>Na,ClaudeProvider:()=>Ao,CodexProvider:()=>La,CursorProvider:()=>Rd,GeminiProvider:()=>Oa,Providers:()=>Ue,WindsurfProvider:()=>Ad,detectAllProviders:()=>hs,detectAntigravity:()=>Mn,detectCodex:()=>an,detectCursorProject:()=>Id,detectProvider:()=>jo,detectWindsurfProject:()=>$d,getActiveProvider:()=>Zy,getCapabilities:()=>Yy,getCommandsDir:()=>iw,getGlobalContextPath:()=>nw,getGlobalSettingsPath:()=>rw,getProjectCommandsPath:()=>aw,getProviderBranding:()=>Do,getSkillsPath:()=>ow,hasProviderConfig:()=>ew,needsCursorRouterRegeneration:()=>tw,needsWindsurfRouterRegeneration:()=>sw,selectProvider:()=>Fa,validateCliVersion:()=>Dd});import Is from"node:os";import Ze from"node:path";function Yy(r,e){return{...Xy[r],...e}}async function jd(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Qy(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function jo(r){let e=Ue[r];if(!e.cliCommand)return{installed:!1};let t=await jd(e.cliCommand);if(!t)return{installed:!1};let s=await Qy(e.cliCommand),n=Dd(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Dd(r,e){let t=Ue[r];return!t.minCliVersion||!e?null:pd(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 hs(r=!1){if(!r){let i=await $a();if(i)return i}let[e,t,s]=await Promise.all([jo("claude"),jo("gemini"),an()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await Ma(o).catch(()=>{}),o}async function Zy(r){if(r&&Ue[r])return Ue[r];let e=await hs();return e.claude.installed&&!e.gemini.installed?Ao:e.gemini.installed&&!e.claude.installed?Oa:Ao}async function ew(r){let e=Ue[r];return e.configDir?E(e.configDir):!1}function Do(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 Id(r){let e=Ze.join(r,".cursor"),t=Ze.join(e,"rules"),s=Ze.join(t,"prjct.mdc"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function tw(r){let e=await Id(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=Ze.join(r,".windsurf"),t=Ze.join(e,"rules"),s=Ze.join(t,"prjct.md"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function sw(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function Mn(){let r=Na.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ze.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function an(){let r=La.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await jd("codex"),t=Ze.join(r,"skills","prjct","SKILL.md"),s=await E(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function nw(r){let e=Ue[r];return e.configDir?Ze.join(e.configDir,e.contextFile):null}function rw(r){let e=Ue[r];return!e.configDir||!e.settingsFile?null:Ze.join(e.configDir,e.settingsFile)}function ow(r){return Ue[r].skillsDir}function iw(r){return Ue[r].commandsDir}function aw(r,e){let t=Ue[r];return Ze.join(e,t.commandsDir)}async function Fa(){let r=await hs(),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 Xy,Ao,Oa,Na,Rd,Ad,La,Ue,st=S(()=>{"use strict";Hr();Ro();ze();V();_a();Xy={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(Yy,"getCapabilities");Ao={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ze.join(Is.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ze.join(Is.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Oa={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ze.join(Is.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ze.join(Is.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Na={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ze.join(Is.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ze.join(Is.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Rd={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ad={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},La={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ze.join(Is.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ze.join(Is.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ue={claude:Ao,gemini:Oa,cursor:Rd,antigravity:Na,windsurf:Ad,codex:La};l(jd,"whichCommand");l(Qy,"getCliVersion");l(jo,"detectProvider");l(Dd,"validateCliVersion");l(hs,"detectAllProviders");l(Zy,"getActiveProvider");l(ew,"hasProviderConfig");l(Do,"getProviderBranding");l(Id,"detectCursorProject");l(tw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(sw,"needsWindsurfRouterRegeneration");l(Mn,"detectAntigravity");l(an,"detectCodex");l(nw,"getGlobalContextPath");l(rw,"getGlobalSettingsPath");l(ow,"getSkillsPath");l(iw,"getCommandsDir");l(aw,"getProjectCommandsPath");l(Fa,"selectProvider")});import{z as Pe}from"zod";function cw(r){return r instanceof _n}function de(r){return cw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var On,MP,_P,OP,NP,LP,FP,_n,Io,$o,Gr,ys=S(()=>{"use strict";On={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},MP=On.create("FileError",Pe.object({path:Pe.string(),operation:Pe.enum(["read","write","delete","create","copy"]),reason:Pe.string().optional()})),_P=On.create("ValidationError",Pe.object({field:Pe.string(),expected:Pe.string(),received:Pe.string().optional(),message:Pe.string().optional()})),OP=On.create("PermissionError",Pe.object({action:Pe.string(),resource:Pe.string(),reason:Pe.string().optional()})),NP=On.create("TaskError",Pe.object({taskId:Pe.string().optional(),operation:Pe.enum(["create","update","complete","pause","resume","delete"]),reason:Pe.string()})),LP=On.create("SessionError",Pe.object({sessionId:Pe.string().optional(),reason:Pe.string()})),FP=On.create("SyncError",Pe.object({projectId:Pe.string().optional(),operation:Pe.enum(["push","pull","auth","connect"]),reason:Pe.string()})),_n=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)}},Io=class r extends _n{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")}},$o=class r extends _n{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 _n{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(cw,"isPrjctError");l(de,"getErrorMessage")});import{formatDistanceToNowStrict as WP}from"date-fns";function Md(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function _d(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function $s(r){let e=new Date;return e.setDate(e.getDate()-r),e}function vt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function ws(r,e=new Date){let t=e.getTime()-r.getTime();return vt(t)}function Nn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function $t(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(Md,"formatDate");l(_d,"getYearMonthDay");l(v,"getTimestamp");l($s,"getDaysAgo");l(vt,"formatDuration");l(ws,"calculateDuration");l(Nn,"parseVarianceMinutes");l($t,"parseDurationMinutes")});var Ln={};we(Ln,{PACKAGE_ROOT:()=>Tt,VERSION:()=>me,compareVersions:()=>Od,getPackageInfo:()=>lw,getPackageRoot:()=>Ga,getVersion:()=>cn,isCompatible:()=>uw,needsMigration:()=>dw});import Ua from"node:fs";import _o from"node:path";function Ga(){if(Wr)return Wr;let r=__dirname;for(let e=0;e<5;e++){let t=_o.join(r,"package.json");if(Ua.existsSync(t))try{if(JSON.parse(Ua.readFileSync(t,"utf-8")).name==="prjct-cli")return Wr=r,r}catch{}r=_o.dirname(r)}return Wr=_o.join(__dirname,"..","..",".."),Wr}function cn(){if(Mo)return Mo;try{let r=_o.join(Ga(),"package.json"),e=JSON.parse(Ua.readFileSync(r,"utf-8"));return Mo=e.version,Ha=e,Mo}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function lw(){return Ha||cn(),Ha}function Od(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function uw(r){let e=cn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function dw(r,e=null){let t=e||cn();return Od(r,t)<0}var Mo,Ha,Wr,me,Tt,nt=S(()=>{"use strict";H();Mo=null,Ha=null,Wr=null;l(Ga,"getPackageRoot");l(cn,"getVersion");l(lw,"getPackageInfo");l(Od,"compareVersions");l(uw,"isCompatible");l(dw,"needsMigration");me=cn(),Tt=Ga()});async function Oo(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mw(){let r=await Oo("gh api user --jq .login");return r.success&&r.output||(r=await Oo("git config --global github.user"),r.success&&r.output)?r.output:null}async function pw(){let r=await Oo("git config user.name");return r.success&&r.output?r.output:null}async function gw(){let r=await Oo("git config user.email");return r.success&&r.output?r.output:null}async function Fn(){let[r,e,t]=await Promise.all([mw(),pw(),gw()]);return{github:r,email:t,name:e||r||"Unknown"}}var No=S(()=>{"use strict";ze();l(Oo,"execCommand");l(mw,"detectGitHubUsername");l(pw,"detectGitName");l(gw,"detectGitEmail");l(Fn,"detect")});import fw from"node:crypto";import os from"node:fs/promises";import Va from"node:os";import q from"node:path";import{globSync as hw}from"glob";var Ba,yw,D,ke=S(()=>{"use strict";K();V();Ba=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?q.resolve(e):q.join(Va.homedir(),".prjct-cli"),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=q.resolve(e),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}generateProjectId(e){return fw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return q.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return q.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return q.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return q.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await qt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await E(t)}async ensureGlobalStructure(){await Qe(this.globalBaseDir),await Qe(this.globalProjectsDir),await Qe(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await Qe(q.join(t,n));return await Qe(q.join(t,"planning","tasks")),await Qe(q.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=_d(t);return q.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Qe(s),s}async listSessions(e,t=null,s=null){let n=q.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await os.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=q.join(n,a.name),u=await os.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=q.join(c,d.name),m=await os.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:q.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return q.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await os.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 qt(t)}getDisplayPath(e){let t=Va.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return q.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return q.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return q.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return q.join(this.globalBaseDir,".running")}getDocsPath(){return q.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(st(),St(It)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(st(),St(It)).getActiveProvider();return(st(),St(It)).getGlobalSettingsPath(e.name)}getClaudeDir(){return q.join(Va.homedir(),".claude")}getClaudeSettingsPath(){return q.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return q.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return q.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=q.join(e,n.file);if(await E(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=q.join(e,"package.json");if(await E(n))try{let o=await os.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await os.readFile(q.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
13
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=
|
|
7
|
+
var _y=Object.create;var Wr=Object.defineProperty;var Oy=Object.getOwnPropertyDescriptor;var Ny=Object.getOwnPropertyNames;var Ly=Object.getPrototypeOf,Fy=Object.prototype.hasOwnProperty;var l=(r,e)=>Wr(r,"name",{value:e,configurable:!0}),Dt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var Uy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),we=(r,e)=>{for(var t in e)Wr(r,t,{get:e[t],enumerable:!0})},Cd=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ny(e))!Fy.call(r,n)&&n!==t&&Wr(r,n,{get:()=>e[n],enumerable:!(s=Oy(e,n))||s.enumerable});return r};var Hy=(r,e,t)=>(t=r!=null?_y(Ly(r)):{},Cd(e||!r||!r.__esModule?Wr(t,"default",{value:r,enumerable:!0}):t,r)),vt=r=>Cd(Wr({},"__esModule",{value:!0}),r);var Pd={};we(Pd,{DAEMON_PATHS:()=>_e,IDLE_TIMEOUT_MS:()=>Fa,MAX_BUFFER_SIZE:()=>Ua,decodeMessage:()=>Wy,encodeMessage:()=>nn});function nn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
8
|
+
`)}function Wy(r){return JSON.parse(r.trim())}var _e,Fa,Ua,Io=S(()=>{"use strict";_e={runDir:l(()=>`${process.env.HOME||Dt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${_e.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${_e.runDir()}/daemon.pid`,"pid"),log:l(()=>`${_e.runDir()}/daemon.log`,"log")},Fa=1800*1e3,Ua=1024*1024;l(nn,"encodeMessage");l(Wy,"decodeMessage")});function xd(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ha(){if(xd()==="bun")return!0;try{let{execSync:r}=Dt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function rn(){return xd()==="bun"}var Gr=S(()=>{"use strict";l(xd,"detectRuntime");l(Ha,"isBunAvailable");l(rn,"isBun")});var gs={};we(gs,{executeViaDaemon:()=>Vy,forceKillDaemon:()=>zy,getDaemonStatus:()=>By,isDaemonRunning:()=>Rd,sendRequest:()=>Br,spawnDaemon:()=>Ad,stopDaemon:()=>qy});import Do from"node:crypto";import nt from"node:fs";import{connect as Gy}from"node:net";async function Rd(){let r=_e.socket();if(!nt.existsSync(r))return!1;try{return(await Br({id:Do.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{nt.unlinkSync(r)}catch{}return!1}}async function By(){let r=_e.socket(),e=_e.pid();if(!nt.existsSync(r))return{running:!1};try{let t=await Br({id:Do.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return nt.existsSync(e)?{running:!1,pid:parseInt(nt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Br(r){return new Promise((e,t)=>{let s=_e.socket(),n=Gy(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(nn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
9
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Vy(r,e,t,s,n,o=!0){let i=_e.socket();if(!nt.existsSync(i))return o&&Ad().catch(()=>{}),null;try{return await Br({id:Do.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function qy(){try{return(await Br({id:Do.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function zy(){let r=_e.pid(),e=_e.socket(),t=!1;if(nt.existsSync(r)){let s=parseInt(nt.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{nt.existsSync(r)&&nt.unlinkSync(r)}catch{}try{nt.existsSync(e)&&nt.unlinkSync(e)}catch{}return t}async function Ad(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(nt.existsSync(t))o=t,i="bun";else if(nt.existsSync(s))o=s,i=Ha()?"bun":"node";else if(nt.existsSync(n))o=n,i=Ha()?"bun":"node";else return!1;let a=_e.runDir();nt.mkdirSync(a,{recursive:!0});let c=_e.log(),u=nt.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),nt.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Rd())return!0;return!1}var fs=S(()=>{"use strict";Gr();Io();l(Rd,"isDaemonRunning");l(By,"getDaemonStatus");l(Br,"sendRequest");l(Vy,"executeViaDaemon");l(qy,"stopDaemon");l(zy,"forceKillDaemon");l(Ad,"spawnDaemon")});var Vr=S(()=>{"use strict"});import{z as is}from"zod";function jd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var yP,wP,kP,On,SP,$o=S(()=>{"use strict";yP=is.enum(["opus","sonnet","haiku"]),wP=is.enum(["2.5-pro","2.5-flash","2.0-flash"]),kP=is.string().min(1),On=is.object({provider:is.string(),model:is.string(),cliVersion:is.string().optional(),recordedAt:is.string()}),SP=is.object({preferredModel:is.string().optional(),lastAnalysisModel:On.optional()});l(jd,"compareSemver")});var Dd={};we(Dd,{execAsync:()=>L,execFileAsync:()=>on});import{exec as Jy,execFile as Ky}from"node:child_process";import{promisify as Id}from"node:util";var L,on,Ge=S(()=>{"use strict";L=Id(Jy),on=Id(Ky)});var $d,Md,_d,Wa=S(()=>{"use strict";$d=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),Md=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],_d=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Xy(r){return r instanceof Error&&"code"in r}function I(r){return Xy(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function Ga(r){if(r instanceof Error)return r.stack}var H=S(()=>{"use strict";l(Xy,"isNodeError");l(I,"isNotFoundError");l(k,"getErrorMessage");l(Ga,"getErrorStack")});import Ld from"node:fs/promises";async function Fd(r,e){let t;try{t=await Ld.readFile(r,"utf-8")}catch(o){if(I(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Od(r,t),Nd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Od(r,t),Nd(r,Yy(n.error)),null)}async function Od(r,e){let t=`${r}.backup`;try{await Ld.writeFile(t,e,"utf-8")}catch{}}function Nd(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 Yy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Ud=S(()=>{"use strict";H();l(Fd,"safeRead");l(Od,"createBackup");l(Nd,"logCorruption");l(Yy,"formatZodError")});var $t={};we($t,{appendLine:()=>Ba,appendToFile:()=>Zy,atomicWrite:()=>Qy,batchProcess:()=>cn,copyFile:()=>ow,deleteDir:()=>sw,deleteFile:()=>tw,dirExists:()=>zt,ensureDir:()=>et,fileExists:()=>E,getFileExtension:()=>lw,getFileModifiedTime:()=>rw,getFileNameWithoutExtension:()=>uw,getFileSize:()=>nw,listFiles:()=>ys,moveFile:()=>iw,prependToFile:()=>ew,readFile:()=>$e,readJson:()=>De,readLines:()=>aw,walkDir:()=>an,writeFile:()=>Tt,writeJson:()=>le,writeLines:()=>cw});import Ce from"node:fs/promises";import hs from"node:path";async function an(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Ce.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if($d.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=hs.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(hs.relative(r,d))}}return l(o,"walk"),await o(r),t}async function cn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function De(r,e=null,t){if(t)return await Fd(r,t)??e;try{let s=await Ce.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(I(s))return e;throw s}}async function le(r,e,t=2){let s=hs.dirname(r);await Ce.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Ce.writeFile(r,n,"utf-8")}async function $e(r,e=""){try{return await Ce.readFile(r,"utf-8")}catch(t){if(I(t))return e;throw t}}async function Tt(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0}),await Ce.writeFile(r,e,"utf-8")}async function Qy(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Ce.writeFile(s,e,"utf-8"),await Ce.rename(s,r)}async function Zy(r,e){await Ce.appendFile(r,e,"utf-8")}async function Ba(r,e){let t=hs.dirname(r);await Ce.mkdir(t,{recursive:!0}),await Ce.appendFile(r,`${e}
|
|
10
|
+
`,"utf-8")}async function ew(r,e){try{let t=await Ce.readFile(r,"utf-8");await Ce.writeFile(r,e+t,"utf-8")}catch(t){if(I(t))await Ce.writeFile(r,e,"utf-8");else throw t}}async function E(r){try{return await Ce.access(r),!0}catch(e){if(I(e))return!1;throw e}}async function zt(r){try{return(await Ce.stat(r)).isDirectory()}catch(e){if(I(e))return!1;throw e}}async function et(r){await Ce.mkdir(r,{recursive:!0})}async function tw(r){try{return await Ce.unlink(r),!0}catch(e){if(I(e))return!1;throw e}}async function sw(r){try{return await Ce.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(I(e))return!1;throw e}}async function ys(r,e={}){try{let s=await Ce.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(I(t))return[];throw t}}async function nw(r){return(await Ce.stat(r)).size}async function rw(r){return(await Ce.stat(r)).mtime}async function ow(r,e){await Ce.copyFile(r,e)}async function iw(r,e){await Ce.rename(r,e)}async function aw(r){return(await $e(r,"")).split(`
|
|
11
|
+
`)}async function cw(r,e){let t=e.join(`
|
|
12
|
+
`);await Tt(r,t)}function lw(r){return hs.extname(r)}function uw(r){return hs.basename(r,hs.extname(r))}var B=S(()=>{"use strict";Wa();Ud();H();l(an,"walkDir");l(cn,"batchProcess");l(De,"readJson");l(le,"writeJson");l($e,"readFile");l(Tt,"writeFile");l(Qy,"atomicWrite");l(Zy,"appendToFile");l(Ba,"appendLine");l(ew,"prependToFile");l(E,"fileExists");l(zt,"dirExists");l(et,"ensureDir");l(tw,"deleteFile");l(sw,"deleteDir");l(ys,"listFiles");l(nw,"getFileSize");l(rw,"getFileModifiedTime");l(ow,"copyFile");l(iw,"moveFile");l(aw,"readLines");l(cw,"writeLines");l(lw,"getFileExtension");l(uw,"getFileNameWithoutExtension")});function Ms(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Nn,ln=S(()=>{"use strict";l(Ms,"isExpired");Nn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Gd={};we(Gd,{invalidateProviderCache:()=>gw,readProviderCache:()=>qa,writeProviderCache:()=>za});import Hd from"node:fs/promises";import dw from"node:os";import Wd from"node:path";async function qa(){try{let r=await Hd.readFile(Va,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ms(e.timestamp,pw)?null:e.detection}catch{return null}}async function za(r){let e={timestamp:new Date().toISOString(),detection:r};await le(Va,e)}async function gw(){try{await Hd.unlink(Va)}catch{}}var mw,Va,pw,Ja=S(()=>{"use strict";ln();B();mw=Wd.join(dw.homedir(),".prjct-cli","cache"),Va=Wd.join(mw,"providers.json"),pw=600*1e3;l(qa,"readProviderCache");l(za,"writeProviderCache");l(gw,"invalidateProviderCache")});var Mt={};we(Mt,{AntigravityProvider:()=>Xa,ClaudeProvider:()=>Mo,CodexProvider:()=>Ya,CursorProvider:()=>Vd,GeminiProvider:()=>Ka,Providers:()=>Be,WindsurfProvider:()=>qd,detectAllProviders:()=>ws,detectAntigravity:()=>Ln,detectCodex:()=>un,detectCursorProject:()=>Kd,detectProvider:()=>_o,detectWindsurfProject:()=>Xd,getActiveProvider:()=>ww,getCapabilities:()=>hw,getCommandsDir:()=>Cw,getGlobalContextPath:()=>vw,getGlobalSettingsPath:()=>Tw,getProjectCommandsPath:()=>Pw,getProviderBranding:()=>Oo,getSkillsPath:()=>Ew,hasProviderConfig:()=>kw,needsCursorRouterRegeneration:()=>Sw,needsWindsurfRouterRegeneration:()=>bw,selectProvider:()=>Qa,validateCliVersion:()=>Jd});import _s from"node:os";import tt from"node:path";function hw(r,e){return{...fw[r],...e}}async function zd(r){try{let{stdout:e}=await L(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function yw(r){try{let{stdout:e}=await L(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function _o(r){let e=Be[r];if(!e.cliCommand)return{installed:!1};let t=await zd(e.cliCommand);if(!t)return{installed:!1};let s=await yw(e.cliCommand),n=Jd(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Jd(r,e){let t=Be[r];return!t.minCliVersion||!e?null:jd(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 ws(r=!1){if(!r){let i=await qa();if(i)return i}let[e,t,s]=await Promise.all([_o("claude"),_o("gemini"),un()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await za(o).catch(()=>{}),o}async function ww(r){if(r&&Be[r])return Be[r];let e=await ws();return e.claude.installed&&!e.gemini.installed?Mo:e.gemini.installed&&!e.claude.installed?Ka:Mo}async function kw(r){let e=Be[r];return e.configDir?E(e.configDir):!1}function Oo(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 Kd(r){let e=tt.join(r,".cursor"),t=tt.join(e,"rules"),s=tt.join(t,"prjct.mdc"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Sw(r){let e=await Kd(r);return e.detected&&!e.routerInstalled}async function Xd(r){let e=tt.join(r,".windsurf"),t=tt.join(e,"rules"),s=tt.join(t,"prjct.md"),[n,o]=await Promise.all([E(e),E(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function bw(r){let e=await Xd(r);return e.detected&&!e.routerInstalled}async function Ln(){let r=Xa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=tt.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function un(){let r=Ya.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await zd("codex"),t=tt.join(r,"skills","prjct","SKILL.md"),s=await E(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function vw(r){let e=Be[r];return e.configDir?tt.join(e.configDir,e.contextFile):null}function Tw(r){let e=Be[r];return!e.configDir||!e.settingsFile?null:tt.join(e.configDir,e.settingsFile)}function Ew(r){return Be[r].skillsDir}function Cw(r){return Be[r].commandsDir}function Pw(r,e){let t=Be[r];return tt.join(e,t.commandsDir)}async function Qa(){let r=await ws(),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 fw,Mo,Ka,Xa,Vd,qd,Ya,Be,rt=S(()=>{"use strict";Vr();$o();Ge();B();Ja();fw={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(hw,"getCapabilities");Mo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:tt.join(_s.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:tt.join(_s.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Ka={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:tt.join(_s.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:tt.join(_s.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Xa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:tt.join(_s.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:tt.join(_s.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Vd={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},qd={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ya={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:tt.join(_s.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:tt.join(_s.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Be={claude:Mo,gemini:Ka,cursor:Vd,antigravity:Xa,windsurf:qd,codex:Ya};l(zd,"whichCommand");l(yw,"getCliVersion");l(_o,"detectProvider");l(Jd,"validateCliVersion");l(ws,"detectAllProviders");l(ww,"getActiveProvider");l(kw,"hasProviderConfig");l(Oo,"getProviderBranding");l(Kd,"detectCursorProject");l(Sw,"needsCursorRouterRegeneration");l(Xd,"detectWindsurfProject");l(bw,"needsWindsurfRouterRegeneration");l(Ln,"detectAntigravity");l(un,"detectCodex");l(vw,"getGlobalContextPath");l(Tw,"getGlobalSettingsPath");l(Ew,"getSkillsPath");l(Cw,"getCommandsDir");l(Pw,"getProjectCommandsPath");l(Qa,"selectProvider")});import{z as Ae}from"zod";function xw(r){return r instanceof Fn}function pe(r){return xw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Un,tx,sx,nx,rx,ox,ix,Fn,No,Lo,qr,ks=S(()=>{"use strict";Un={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},tx=Un.create("FileError",Ae.object({path:Ae.string(),operation:Ae.enum(["read","write","delete","create","copy"]),reason:Ae.string().optional()})),sx=Un.create("ValidationError",Ae.object({field:Ae.string(),expected:Ae.string(),received:Ae.string().optional(),message:Ae.string().optional()})),nx=Un.create("PermissionError",Ae.object({action:Ae.string(),resource:Ae.string(),reason:Ae.string().optional()})),rx=Un.create("TaskError",Ae.object({taskId:Ae.string().optional(),operation:Ae.enum(["create","update","complete","pause","resume","delete"]),reason:Ae.string()})),ox=Un.create("SessionError",Ae.object({sessionId:Ae.string().optional(),reason:Ae.string()})),ix=Un.create("SyncError",Ae.object({projectId:Ae.string().optional(),operation:Ae.enum(["push","pull","auth","connect"]),reason:Ae.string()})),Fn=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)}},No=class r extends Fn{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")}},Lo=class r extends Fn{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")}},qr=class r extends Fn{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(xw,"isPrjctError");l(pe,"getErrorMessage")});import{formatDistanceToNowStrict as ux}from"date-fns";function Yd(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Qd(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function b(){return new Date().toISOString()}function Os(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Et(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Ss(r,e=new Date){let t=e.getTime()-r.getTime();return Et(t)}function Hn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function _t(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(Yd,"formatDate");l(Qd,"getYearMonthDay");l(b,"getTimestamp");l(Os,"getDaysAgo");l(Et,"formatDuration");l(Ss,"calculateDuration");l(Hn,"parseVarianceMinutes");l(_t,"parseDurationMinutes")});var Wn={};we(Wn,{PACKAGE_ROOT:()=>Ct,VERSION:()=>ge,compareVersions:()=>Zd,getPackageInfo:()=>Rw,getPackageRoot:()=>tc,getVersion:()=>dn,isCompatible:()=>Aw,needsMigration:()=>jw});import Za from"node:fs";import Uo from"node:path";function tc(){if(zr)return zr;let r=__dirname;for(let e=0;e<5;e++){let t=Uo.join(r,"package.json");if(Za.existsSync(t))try{if(JSON.parse(Za.readFileSync(t,"utf-8")).name==="prjct-cli")return zr=r,r}catch{}r=Uo.dirname(r)}return zr=Uo.join(__dirname,"..","..",".."),zr}function dn(){if(Fo)return Fo;try{let r=Uo.join(tc(),"package.json"),e=JSON.parse(Za.readFileSync(r,"utf-8"));return Fo=e.version,ec=e,Fo}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Rw(){return ec||dn(),ec}function Zd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Aw(r){let e=dn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function jw(r,e=null){let t=e||dn();return Zd(r,t)<0}var Fo,ec,zr,ge,Ct,ot=S(()=>{"use strict";H();Fo=null,ec=null,zr=null;l(tc,"getPackageRoot");l(dn,"getVersion");l(Rw,"getPackageInfo");l(Zd,"compareVersions");l(Aw,"isCompatible");l(jw,"needsMigration");ge=dn(),Ct=tc()});async function Ho(r){try{let{stdout:e}=await L(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Iw(){let r=await Ho("gh api user --jq .login");return r.success&&r.output||(r=await Ho("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await Ho("git config user.name");return r.success&&r.output?r.output:null}async function $w(){let r=await Ho("git config user.email");return r.success&&r.output?r.output:null}async function Gn(){let[r,e,t]=await Promise.all([Iw(),Dw(),$w()]);return{github:r,email:t,name:e||r||"Unknown"}}var Wo=S(()=>{"use strict";Ge();l(Ho,"execCommand");l(Iw,"detectGitHubUsername");l(Dw,"detectGitName");l($w,"detectGitEmail");l(Gn,"detect")});import Mw from"node:crypto";import as from"node:fs/promises";import nc from"node:os";import z from"node:path";import{globSync as _w}from"glob";var rc,Ow,j,Te=S(()=>{"use strict";K();B();rc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(nc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return Mw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await zt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await E(t)}async ensureGlobalStructure(){await et(this.globalBaseDir),await et(this.globalProjectsDir),await et(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await et(z.join(t,n));return await et(z.join(t,"planning","tasks")),await et(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Qd(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await et(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await as.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await as.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=z.join(c,d.name),m=await as.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await as.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 zt(t)}getDisplayPath(e){let t=nc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(rt(),vt(Mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(rt(),vt(Mt)).getActiveProvider();return(rt(),vt(Mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(nc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await E(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await E(n))try{let o=await as.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await as.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
13
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await as.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await E(c)){let u=await as.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await as.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=_w(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await E(u))try{let d=await as.readFile(u,"utf-8"),p=JSON.parse(d),m=z.join(c,"PRJCT.md");s.push({name:p.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await E(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},Ow=new rc,j=Ow});var Go={};we(Go,{default:()=>Jt,worktreeService:()=>tm});import oc from"node:fs/promises";import cs from"node:path";var em,ic,tm,Jt,Jr=S(()=>{"use strict";Ge();B();em=".worktrees",ic=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=cs.join(n,em,t),i=s.branch||`feat/${t}`;await oc.mkdir(cs.join(n,em),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await L(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await L("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await L("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await L(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await L(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await L("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await L("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await L("git rev-parse --git-dir",{cwd:e}),n=cs.resolve(e,t.trim()),o=cs.resolve(e,s.trim());if(n!==o){let{stdout:i}=await L("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await L("git rev-parse HEAD",{cwd:e}),{stdout:c}=await L("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=cs.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await L("git worktree list --porcelain",{cwd:e}),n=s.split(`
|
|
14
|
+
`)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await L("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=cs.join(t,".env");await E(s)&&await oc.copyFile(s,cs.join(e,".env"));let n=cs.join(t,".prjct"),o=cs.join(e,".prjct");await E(n)&&!await E(o)&&await oc.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await L("git worktree prune",{cwd:n});for(let o of t)o.isMain||await E(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
|
|
15
|
+
|
|
16
|
+
`);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
|
|
17
|
+
`),a="",c="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?c=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;s.push({path:a,branch:u,commit:c,isMain:p,slug:p?"main":cs.basename(a)})}}return s}},tm=new ic,Jt=tm});var nm={};we(nm,{default:()=>_});import ac from"node:fs/promises";import Nw from"node:path";import*as Bo from"jsonc-parser";function sm(r){let e=[],t=Bo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${Bo.printParseErrorCode(s.error)}`)}return t}var cc,Lw,_,Ee=S(()=>{"use strict";ks();H();K();B();ot();Wo();Te();l(sm,"parseJsonc");cc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=j.getLocalConfigPath(e),s=await ac.readFile(t,"utf-8");return sm(s)}catch(t){return I(t)||console.warn(`Warning: Could not read config at ${e}: ${pe(t)}`),null}}async writeConfig(e,t){let s=j.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=j.getGlobalProjectConfigPath(e),s=await ac.readFile(t,"utf-8");return sm(s)}catch(t){return I(t)||console.warn(`Warning: Could not read global config for ${e}: ${pe(t)}`),null}}async writeGlobalConfig(e,t){let s=j.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=b();t={projectId:e,authors:[],version:ge,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=j.generateProjectId(e),n=j.getGlobalProjectPath(s),o=j.getDisplayPath(n),i=b(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ge,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=b(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await j.hasLegacyStructure(e))return!1;if(!await j.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=j.getGlobalProjectPath(n.projectId);try{return(await ac.readdir(Nw.join(o,"core"))).length===0}catch(i){return I(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(Jr(),Go));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return j.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=b();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=b(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Gn(),s=await this.getProjectId(e);return await this.addAuthor(s,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=j.generateProjectId(e);return{projectId:s,dataPath:j.getDisplayPath(j.getGlobalProjectPath(s))}}},Lw=new cc,_=Lw});var om={};we(om,{default:()=>Kr});import lc from"node:fs/promises";import Fw from"node:os";import rm from"node:path";var uc,Uw,Kr,Vo=S(()=>{"use strict";H();B();uc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Fw.homedir(),this.configDir=rm.join(this.homeDir,".prjct-cli","config"),this.configFile=rm.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await lc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await lc.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await le(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await le(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return E(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await lc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},Uw=new uc,Kr=Uw});var zo={};we(zo,{PrjctDatabase:()=>qo,default:()=>N,prjctDb:()=>x});import dc from"node:fs";import im from"node:path";function Hw(r){if(rn()){let{Database:n}=Dt("bun:sqlite");return new n(r,{create:!0})}let e=Dt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ww,Gw,qo,x,N,se=S(()=>{"use strict";Te();Gr();l(Hw,"openDatabase");Ww=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
14
18
|
-- =======================================================================
|
|
15
19
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
16
20
|
-- =======================================================================
|
|
@@ -460,60 +464,60 @@ var hy=Object.create;var Lr=Object.defineProperty;var yy=Object.getOwnPropertyDe
|
|
|
460
464
|
|
|
461
465
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
|
|
462
466
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
|
|
463
|
-
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],
|
|
467
|
+
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Gw=3,qo=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return im.join(j.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Gw&&this.evictLru();let s=this.getDbPath(e),n=im.dirname(s);dc.existsSync(n)||dc.mkdirSync(n,{recursive:!0});let o=Hw(s);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return dc.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
|
|
464
468
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
465
469
|
version INTEGER PRIMARY KEY,
|
|
466
470
|
name TEXT NOT NULL,
|
|
467
471
|
applied_at TEXT NOT NULL
|
|
468
472
|
)
|
|
469
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Tw)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},x=new Uo,N=x});import{z}from"zod";var Cw,Pw,Gd,xw,Rw,Aw,jw,Dw,Wd,Cx,Vd=S(()=>{"use strict";Cw=z.enum(["low","medium","high"]),Pw=z.enum(["pending","converted","completed","archived","dormant"]),Gd=z.enum(["high","medium","low"]),xw=z.object({impact:Gd,effort:Gd}),Rw=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),Aw=z.object({name:z.string(),description:z.string()}),jw=z.object({name:z.string(),description:z.string().optional()}),Dw=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:Cw,status:Pw,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:xw.optional(),implementationNotes:z.string().optional(),stack:Rw.optional(),modules:z.array(Aw).optional(),roles:z.array(jw).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Wd=z.object({ideas:z.array(Dw),lastUpdated:z.string()}),Cx={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import Iw from"node:crypto";import{homedir as $w}from"node:os";import{join as Mw}from"node:path";function Se(){return Iw.randomUUID()}var Dx,Ut=S(()=>{"use strict";l(Se,"generateUUID");Dx=Mw($w(),".prjct-cli","projects")});var ks,Ya,Ht,ln=S(()=>{"use strict";Ut();K();ee();ks={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ya=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Se(),n=v();return x.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return x.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=x.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(x.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ht=new Ya});var Qa,Ms,Za=S(()=>{"use strict";ke();K();V();Qa=class{static{l(this,"SyncEventBus")}async publish(e){let t=D.getSyncPendingPath(e.projectId),s=await je(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=D.getSyncPendingPath(e);return await je(t,[])??[]}async clearPending(e){let t=D.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=D.getLastSyncPath(e),s={timestamp:v(),success:!0};await ce(t,s)}async getLastSync(e){let t=D.getLastSyncPath(e);return await je(t,null)}},Ms=new Qa});var rt,Ss=S(()=>{"use strict";Za();on();K();ee();rt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new $n({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=x.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Ms.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return x.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ec,qe,_s=S(()=>{"use strict";Vd();Ut();K();ln();Ss();ec=class extends rt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Wd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Se(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=$s(ks.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},qe=new ec});import{z as C}from"zod";var _w,Go,Ow,Nw,Lw,tc,zd,qd,Jd,Kd,Bd,Fw,Uw,Xd,Yd,Qd,Hw,Gw,rR,sc=S(()=>{"use strict";Ro();_w=C.enum(["low","medium","high","critical"]),Go=C.enum(["feature","bug","improvement","chore"]),Ow=C.enum(["active","backlog","previously_active"]),Nw=C.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Lw=C.enum(["task_completed","feature_shipped","idea_captured","session_started"]),tc=C.object({title:C.string(),description:C.string(),filesChanged:C.array(C.object({path:C.string(),action:C.enum(["created","modified","deleted"])})),whatWasDone:C.array(C.string()).min(1),outputForNextAgent:C.string().min(1),notes:C.string().optional()}),zd=C.object({output:C.string().min(1,"Subtask output is required"),summary:tc}),qd=C.object({id:C.string(),description:C.string(),domain:C.string(),agent:C.string(),status:Nw,dependsOn:C.array(C.string()),startedAt:C.string().optional(),completedAt:C.string().optional(),output:C.string().optional(),summary:tc.optional(),skipReason:C.string().optional(),blockReason:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional()}),Jd=C.object({completed:C.number(),total:C.number(),percentage:C.number()}),Kd=C.object({id:C.string(),description:C.string(),type:Go.optional(),startedAt:C.string(),sessionId:C.string(),featureId:C.string().optional(),subtasks:C.array(qd).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:Jd.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:In.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional(),parentDescription:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional()}),Bd=C.object({id:C.string(),description:C.string(),status:C.literal("paused"),startedAt:C.string(),pausedAt:C.string(),pauseReason:C.string().optional(),type:Go.optional(),sessionId:C.string().optional(),featureId:C.string().optional(),subtasks:C.array(qd).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:Jd.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:In.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),Fw=C.object({stackConfirmed:C.array(C.string()).optional(),patternsDiscovered:C.array(C.string()).optional(),agentAccuracy:C.array(C.object({agent:C.string(),rating:C.enum(["helpful","neutral","inaccurate"]),note:C.string().optional()})).optional(),issuesEncountered:C.array(C.string()).optional()}),Uw=C.object({taskId:C.string(),title:C.string(),classification:Go,startedAt:C.string(),completedAt:C.string(),subtaskCount:C.number(),subtaskSummaries:C.array(tc),outcome:C.string(),branchName:C.string(),linearId:C.string().optional(),linearUuid:C.string().optional(),prUrl:C.string().optional(),feedback:Fw.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),Xd=C.object({currentTask:Kd.nullable(),previousTask:Bd.nullable().optional(),pausedTasks:C.array(Bd).optional(),taskHistory:C.array(Uw).optional(),lastUpdated:C.string()}),Yd=C.object({id:C.string(),description:C.string(),priority:_w,type:Go,featureId:C.string().optional(),originFeature:C.string().optional(),completed:C.boolean(),completedAt:C.string().optional(),createdAt:C.string(),section:Ow,agent:C.string().optional(),groupName:C.string().optional(),groupId:C.string().optional()}),Qd=C.object({tasks:C.array(Yd),lastUpdated:C.string()}),Hw=C.object({tasksToday:C.number(),tasksThisWeek:C.number(),streak:C.number(),velocity:C.string(),avgDuration:C.string()}),Gw=C.object({type:Lw,description:C.string(),timestamp:C.string(),duration:C.string().optional()}),rR=C.object({projectId:C.string(),currentTask:Kd.nullable(),queue:C.array(Yd),stats:Hw,recentActivity:C.array(Gw),lastSync:C.string()})});function tm(r){return[...r].sort((e,t)=>{let s=em[e.section]-em[t.section];return s!==0?s:Zd[e.priority]-Zd[t.priority]})}function nc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Zd,em,rc=S(()=>{"use strict";Zd={critical:0,high:1,medium:2,low:3},em={active:0,previously_active:1,backlog:2};l(tm,"sortBySectionAndPriority");l(nc,"uniqueBy")});var oc,Ee,is=S(()=>{"use strict";Ut();sc();rc();K();ln();Ss();oc=class extends rt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Qd)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return tm(t)[0]||null}async addTask(e,t){let s={...t,id:Se(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),n=t.map(o=>({...o,id:Se(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=$s(ks.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},Ee=new oc});import{z as te}from"zod";var Ww,sm,Vw,Bw,zw,qw,Jw,Kw,Xw,nm,rm=S(()=>{"use strict";Ww=te.enum(["feature","fix","improvement","refactor"]),sm=te.enum(["pass","warning","fail","skipped"]),Vw=te.enum(["added","changed","fixed","removed"]),Bw=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),zw=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),qw=te.object({description:te.string(),type:Vw.optional()}),Jw=te.object({lintStatus:sm.nullable().optional(),lintDetails:te.string().optional(),testStatus:sm.nullable().optional(),testDetails:te.string().optional()}),Kw=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),Xw=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:Ww,agent:te.string().optional(),description:te.string().optional(),changes:te.array(qw).optional(),codeSnippets:te.array(te.string()).optional(),commit:Kw.optional(),codeMetrics:zw.optional(),qualityMetrics:Jw.optional(),quantitativeImpact:te.string().optional(),duration:Bw.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),nm=te.object({shipped:te.array(Xw),lastUpdated:te.string()})});var ic,lt,un=S(()=>{"use strict";Ut();rm();K();ln();Ss();ic=class extends rt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",nm)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Se(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=$s(ks.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Ht.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},lt=new ic});var Br,ac,dn,cc=S(()=>{"use strict";Br={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"}},ac=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=Br[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Br[e]}getPrompt(e){return Br[e].prompt}getValidCommands(e){return Br[e].transitions}formatNextSteps(e){return Br[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},dn=new ac});var lc,L,xt=S(()=>{"use strict";Ut();sc();K();cc();ln();Ss();lc=class extends rt{static{l(this,"StateStorage")}constructor(){super("state.json",Xd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=dn.getCurrentState(e),n=dn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Se()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Ht.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:v()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=zd.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
473
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Ww)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},x=new qo,N=x});import{z as q}from"zod";var Bw,Vw,am,qw,zw,Jw,Kw,Xw,cm,Yx,lm=S(()=>{"use strict";Bw=q.enum(["low","medium","high"]),Vw=q.enum(["pending","converted","completed","archived","dormant"]),am=q.enum(["high","medium","low"]),qw=q.object({impact:am,effort:am}),zw=q.object({frontend:q.string().optional(),backend:q.string().optional(),payments:q.string().optional(),ai:q.string().optional(),deploy:q.string().optional(),other:q.array(q.string()).optional()}),Jw=q.object({name:q.string(),description:q.string()}),Kw=q.object({name:q.string(),description:q.string().optional()}),Xw=q.object({id:q.string(),text:q.string(),details:q.string().optional(),priority:Bw,status:Vw,tags:q.array(q.string()),addedAt:q.string(),completedAt:q.string().optional(),convertedTo:q.string().optional(),source:q.string().optional(),sourceFiles:q.array(q.string()).optional(),painPoints:q.array(q.string()).optional(),solutions:q.array(q.string()).optional(),filesAffected:q.array(q.string()).optional(),impactEffort:qw.optional(),implementationNotes:q.string().optional(),stack:zw.optional(),modules:q.array(Jw).optional(),roles:q.array(Kw).optional(),risks:q.array(q.string()).optional(),risksCount:q.number().optional()}),cm=q.object({ideas:q.array(Xw),lastUpdated:q.string()}),Yx={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import Yw from"node:crypto";import{homedir as Qw}from"node:os";import{join as Zw}from"node:path";function Q(){return Yw.randomUUID()}var nR,Nt=S(()=>{"use strict";l(Q,"generateUUID");nR=Zw(Qw(),".prjct-cli","projects")});var bs,mc,Gt,mn=S(()=>{"use strict";Nt();K();se();bs={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 s=Q(),n=b();return x.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=b();return x.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Q(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=x.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(x.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Gt=new mc});var pc,Ns,gc=S(()=>{"use strict";Te();K();B();pc=class{static{l(this,"SyncEventBus")}async publish(e){let t=j.getSyncPendingPath(e.projectId),s=await De(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=j.getSyncPendingPath(e);return await De(t,[])??[]}async clearPending(e){let t=j.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=j.getLastSyncPath(e),s={timestamp:b(),success:!0};await le(t,s)}async getLastSync(e){let t=j.getLastSyncPath(e);return await De(t,null)}},Ns=new pc});var it,vs=S(()=>{"use strict";gc();ln();K();se();it=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Nn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=x.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:b(),projectId:e};await Ns.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return x.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var fc,Xe,Ls=S(()=>{"use strict";lm();Nt();K();mn();vs();fc=class extends it{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",cm)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Q(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Os(bs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Xe=new fc});import{z as C}from"zod";var ek,Jo,tk,sk,nk,hc,dm,mm,pm,yc,um,rk,ok,ik,gm,fm,hm,ak,ck,jR,wc=S(()=>{"use strict";$o();ek=C.enum(["low","medium","high","critical"]),Jo=C.enum(["feature","bug","improvement","chore"]),tk=C.enum(["active","backlog","previously_active"]),sk=C.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),nk=C.enum(["task_completed","feature_shipped","idea_captured","session_started"]),hc=C.object({title:C.string(),description:C.string(),filesChanged:C.array(C.object({path:C.string(),action:C.enum(["created","modified","deleted"])})),whatWasDone:C.array(C.string()).min(1),outputForNextAgent:C.string().min(1),notes:C.string().optional()}),dm=C.object({output:C.string().min(1,"Subtask output is required"),summary:hc}),mm=C.object({id:C.string(),description:C.string(),domain:C.string(),agent:C.string(),status:sk,dependsOn:C.array(C.string()),startedAt:C.string().optional(),completedAt:C.string().optional(),output:C.string().optional(),summary:hc.optional(),skipReason:C.string().optional(),blockReason:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional()}),pm=C.object({completed:C.number(),total:C.number(),percentage:C.number()}),yc=C.object({id:C.string(),description:C.string(),type:Jo.optional(),startedAt:C.string(),sessionId:C.string(),featureId:C.string().optional(),subtasks:C.array(mm).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:pm.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:On.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional(),parentDescription:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional()}),um=C.object({id:C.string(),description:C.string(),status:C.literal("paused"),startedAt:C.string(),pausedAt:C.string(),pauseReason:C.string().optional(),type:Jo.optional(),sessionId:C.string().optional(),featureId:C.string().optional(),subtasks:C.array(mm).optional(),currentSubtaskIndex:C.number().optional(),subtaskProgress:pm.optional(),linearId:C.string().optional(),linearUuid:C.string().optional(),estimatedPoints:C.number().optional(),estimatedMinutes:C.number().optional(),modelMetadata:On.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),rk=C.object({stackConfirmed:C.array(C.string()).optional(),patternsDiscovered:C.array(C.string()).optional(),agentAccuracy:C.array(C.object({agent:C.string(),rating:C.enum(["helpful","neutral","inaccurate"]),note:C.string().optional()})).optional(),issuesEncountered:C.array(C.string()).optional()}),ok=C.object({taskId:C.string(),title:C.string(),classification:Jo,startedAt:C.string(),completedAt:C.string(),subtaskCount:C.number(),subtaskSummaries:C.array(hc),outcome:C.string(),branchName:C.string(),linearId:C.string().optional(),linearUuid:C.string().optional(),prUrl:C.string().optional(),feedback:rk.optional(),tokensIn:C.number().optional(),tokensOut:C.number().optional()}),ik=yc.extend({workspaceId:C.string(),worktreePath:C.string().optional(),agentSessionId:C.string().optional(),jiraId:C.string().optional(),jiraUuid:C.string().optional(),dispatchedFrom:C.string().optional()}),gm=C.object({currentTask:yc.nullable(),previousTask:um.nullable().optional(),pausedTasks:C.array(um).optional(),taskHistory:C.array(ok).optional(),activeTasks:C.array(ik).optional(),lastUpdated:C.string()}),fm=C.object({id:C.string(),description:C.string(),priority:ek,type:Jo,featureId:C.string().optional(),originFeature:C.string().optional(),completed:C.boolean(),completedAt:C.string().optional(),createdAt:C.string(),section:tk,agent:C.string().optional(),groupName:C.string().optional(),groupId:C.string().optional()}),hm=C.object({tasks:C.array(fm),lastUpdated:C.string()}),ak=C.object({tasksToday:C.number(),tasksThisWeek:C.number(),streak:C.number(),velocity:C.string(),avgDuration:C.string()}),ck=C.object({type:nk,description:C.string(),timestamp:C.string(),duration:C.string().optional()}),jR=C.object({projectId:C.string(),currentTask:yc.nullable(),queue:C.array(fm),stats:ak,recentActivity:C.array(ck),lastSync:C.string()})});function Ko(r){return[...r].sort((e,t)=>{let s=wm[e.section]-wm[t.section];return s!==0?s:ym[e.priority]-ym[t.priority]})}function kc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var ym,wm,Xo=S(()=>{"use strict";ym={critical:0,high:1,medium:2,low:3},wm={active:0,previously_active:1,backlog:2};l(Ko,"sortBySectionAndPriority");l(kc,"uniqueBy")});var Sc,ke,Kt=S(()=>{"use strict";Nt();wc();Xo();K();mn();vs();Sc=class extends it{static{l(this,"QueueStorage")}constructor(){super("queue.json",hm)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Ko(t)[0]||null}async addTask(e,t){let s={...t,id:Q(),createdAt:b(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=b(),n=t.map(o=>({...o,id:Q(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:b()},s):i),lastUpdated:b()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:b()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Os(bs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ke=new Sc});import{z as ne}from"zod";var lk,km,uk,dk,mk,pk,gk,fk,hk,Sm,bm=S(()=>{"use strict";lk=ne.enum(["feature","fix","improvement","refactor"]),km=ne.enum(["pass","warning","fail","skipped"]),uk=ne.enum(["added","changed","fixed","removed"]),dk=ne.object({hours:ne.number(),minutes:ne.number(),totalMinutes:ne.number()}),mk=ne.object({filesChanged:ne.number().nullable().optional(),linesAdded:ne.number().nullable().optional(),linesRemoved:ne.number().nullable().optional(),commits:ne.number().nullable().optional()}),pk=ne.object({description:ne.string(),type:uk.optional()}),gk=ne.object({lintStatus:km.nullable().optional(),lintDetails:ne.string().optional(),testStatus:km.nullable().optional(),testDetails:ne.string().optional()}),fk=ne.object({hash:ne.string().optional(),message:ne.string().optional(),branch:ne.string().optional()}),hk=ne.object({id:ne.string(),name:ne.string(),version:ne.string().nullable().optional(),type:lk,agent:ne.string().optional(),description:ne.string().optional(),changes:ne.array(pk).optional(),codeSnippets:ne.array(ne.string()).optional(),commit:fk.optional(),codeMetrics:mk.optional(),qualityMetrics:gk.optional(),quantitativeImpact:ne.string().optional(),duration:dk.optional(),tasksCompleted:ne.number().nullable().optional(),shippedAt:ne.string(),featureId:ne.string().optional()}),Sm=ne.object({shipped:ne.array(hk),lastUpdated:ne.string()})});var bc,dt,pn=S(()=>{"use strict";Nt();bm();K();mn();vs();bc=class extends it{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Sm)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Q(),shippedAt:b()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Os(bs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Gt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},dt=new bc});var Xr,vc,gn,Tc=S(()=>{"use strict";Xr={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"}},vc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=Xr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Xr[e]}getPrompt(e){return Xr[e].prompt}getValidCommands(e){return Xr[e].transitions}formatNextSteps(e){return Xr[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},gn=new vc});var Ec,F,Pt=S(()=>{"use strict";Nt();wc();K();Tc();mn();vs();Ec=class extends it{static{l(this,"StateStorage")}constructor(){super("state.json",gm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=gn.getCurrentState(e),n=gn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=b(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??Q()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Gt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:b()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=b(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:b()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:b()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=dm.safeParse(t);if(!s.success){let w=s.error.issues.map(v=>`${v.path.join(".")}: ${v.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
470
474
|
${w.join(`
|
|
471
|
-
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new lc});function Qw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Yw.has(r)||r.includes("prjct"))return{level:Un.debug,name:"debug"};let e=Un[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Wo(r,e,t){return om>=r?(...s)=>console[t](e,...s):ek}var Un,Yw,om,Zw,ek,tk,B,bs=S(()=>{"use strict";Un={error:0,warn:1,info:2,debug:3},Yw=new Set(["1","true","*"]);l(Qw,"getLogLevel");({level:om,name:Zw}=Qw()),ek=l(()=>{},"noop");l(Wo,"createLogMethod");tk={error:Wo(Un.error,"[prjct:error]","error"),warn:Wo(Un.warn,"[prjct:warn]","warn"),info:Wo(Un.info,"[prjct:info]","log"),debug:Wo(Un.debug,"[prjct:debug]","log"),isEnabled:l(()=>om>=0,"isEnabled"),level:l(()=>Zw,"level")},B=tk});import sk from"node:fs/promises";import nk from"node:path";import{Hono as rk}from"hono";function ok(r){return D.getGlobalProjectPath(r)}function im(r,e){let t=new rk,s=ok(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await Ee.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await qe.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=x.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await lt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),Ee.read(r),qe.read(r),lt.read(r)]),u=x.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=nk.join(s,"context",`${o}.md`),c=await sk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return I(a)||B.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var am=S(()=>{"use strict";ke();ee();_s();is();un();xt();H();bs();l(ok,"getProjectDataPath");l(im,"createRoutes")});import Hn from"node:fs/promises";import ik from"node:path";import{Hono as ak}from"hono";function Vo(r){return x.getDoc(r,"project")}async function uc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function cm(){let r=new ak;return r.get("/projects",async e=>{try{await Hn.mkdir(Gn,{recursive:!0});let s=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Vo(o),a=await L.read(o),c=await Ee.read(o),u=await qe.read(o),d=await lt.read(o),p=a?.currentTask,m=await uc(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Vo(t)),L.read(t),Ee.read(t),qe.read(t),lt.read(t)]),c=x.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await uc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=d)?.length||0,g=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:i?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),Ee.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await qe.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await Hn.mkdir(Gn,{recursive:!0});let s=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await Ee.read(c),p=await qe.read(c),m=await lt.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Hn.mkdir(Gn,{recursive:!0});let n=(await Hn.readdir(Gn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=Vo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await L.read(d),m=Vo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await uc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}var ck,Gn,lm=S(()=>{"use strict";ke();ee();_s();is();un();xt();ck=D.getGlobalBasePath(),Gn=ik.join(ck,"projects");l(Vo,"getProjectConfig");l(uc,"calculateDuration");l(cm,"createExtendedRoutes")});var um=S(()=>{"use strict"});import{streamSSE as lk}from"hono/streaming";function mm(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>dm&&t(i)},uk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return lk(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},dk),m=setTimeout(()=>{t(a)},dm);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var dm,uk,dk,pm=S(()=>{"use strict";um();dm=3600*1e3,uk=300*1e3,dk=3e4;l(mm,"createSSEManager")});var gm={};we(gm,{DEFAULT_PORT:()=>zo,createServer:()=>Bo,startServer:()=>hk});import{Hono as mk}from"hono";import{cors as pk}from"hono/cors";import{logger as gk}from"hono/logger";import{secureHeaders as fk}from"hono/secure-headers";function Bo(r){let e=new mk,t=mm();e.use("*",fk()),r.enableCors!==!1&&e.use("*",pk({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",gk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:me,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=im(r.projectId,r.projectPath);e.route("/api",s);let n=cm();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(tn())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: ${tn()?"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)}}}async function hk(r,e,t=zo){let s=Bo({port:t,projectId:r,projectPath:e});return await s.start(),s}var zo,dc=S(()=>{"use strict";Fr();nt();am();lm();pm();l(Bo,"createServer");zo=3478;l(hk,"startServer")});import mn from"chalk";var fm,yk,wk,Jt,hm=S(()=>{"use strict";st();fm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],yk=80,wk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:fm,speed:yk},cli:{header:l(()=>`${mn.cyan.bold("\u26A1")} ${mn.cyan("prjct")}`,"header"),footer:l(()=>mn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${mn.cyan("\u26A1")} ${mn.cyan("prjct")} ${mn.cyan(fm[r%10])} ${mn.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")=>Do(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Do(r).signature,"getSignature")},Jt=wk});function Wn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return kk[r]}var le,mc,pc,qo,kk,Gt,ym,pn=S(()=>{"use strict";le={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},mc=["feature","spec","design","refactor","migrate"],pc=["ship","cleanup","git","migrate"],qo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],kk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Wn,"getTimeout");Gt={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},ym={HISTORY_MAX:100}});var zr,gc=S(()=>{"use strict";zr={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function gn(r,e){return{...zr[r],...e}}function Vn(r,e,t){return{message:r,hint:e,...t}}var qr=S(()=>{"use strict";gc();gc();l(gn,"getError");l(Vn,"createError")});var km={};we(km,{ERRORS:()=>zr,ICONS:()=>Os,OUTPUT_TIERS:()=>wm,createError:()=>Vn,default:()=>f,formatForHuman:()=>Ek,getError:()=>gn,getOutputTier:()=>bk,getTierConfig:()=>Ko,isQuietMode:()=>Tk,limitLines:()=>Jo,setOutputTier:()=>Sk,setQuietMode:()=>vk});import ie from"chalk";function Sk(r){zn=r}function bk(){return zn}function Ko(){return wm[zn]}function vk(r){Et=r}function Tk(){return Et}function Jo(r,e){let t=e??Ko().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
|
|
475
|
+
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},F=new Ec});function wk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(yk.has(r)||r.includes("prjct"))return{level:Bn.debug,name:"debug"};let e=Bn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Yo(r,e,t){return vm>=r?(...s)=>console[t](e,...s):Sk}var Bn,yk,vm,kk,Sk,bk,V,Ts=S(()=>{"use strict";Bn={error:0,warn:1,info:2,debug:3},yk=new Set(["1","true","*"]);l(wk,"getLogLevel");({level:vm,name:kk}=wk()),Sk=l(()=>{},"noop");l(Yo,"createLogMethod");bk={error:Yo(Bn.error,"[prjct:error]","error"),warn:Yo(Bn.warn,"[prjct:warn]","warn"),info:Yo(Bn.info,"[prjct:info]","log"),debug:Yo(Bn.debug,"[prjct:debug]","log"),isEnabled:l(()=>vm>=0,"isEnabled"),level:l(()=>kk,"level")},V=bk});import vk from"node:fs/promises";import Tk from"node:path";import{Hono as Ek}from"hono";function Ck(r){return j.getGlobalProjectPath(r)}function Tm(r,e){let t=new Ek,s=Ck(r);return t.get("/state",async n=>{let o=await F.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ke.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Xe.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=x.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await dt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([F.read(r),ke.read(r),Xe.read(r),dt.read(r)]),u=x.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await F.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Tk.join(s,"context",`${o}.md`),c=await vk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return I(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Em=S(()=>{"use strict";Te();se();Ls();Kt();pn();Pt();H();Ts();l(Ck,"getProjectDataPath");l(Tm,"createRoutes")});import Vn from"node:fs/promises";import Pk from"node:path";import{Hono as xk}from"hono";function Qo(r){return x.getDoc(r,"project")}async function Cc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function Cm(){let r=new xk;return r.get("/projects",async e=>{try{await Vn.mkdir(qn,{recursive:!0});let s=(await Vn.readdir(qn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Qo(o),a=await F.read(o),c=await ke.read(o),u=await Xe.read(o),d=await dt.read(o),p=a?.currentTask,m=await Cc(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Qo(t)),F.read(t),ke.read(t),Xe.read(t),dt.read(t)]),c=x.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Cc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=d)?.length||0,g=o?.tasks?.filter(w=>!w.completed||!w.completedAt?!1:new Date(w.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:i?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([F.read(t),ke.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await Xe.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await Vn.mkdir(qn,{recursive:!0});let s=(await Vn.readdir(qn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await F.read(c),d=await ke.read(c),p=await Xe.read(c),m=await dt.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Vn.mkdir(qn,{recursive:!0});let n=(await Vn.readdir(qn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=Qo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await F.read(d),m=Qo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Cc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}var Rk,qn,Pm=S(()=>{"use strict";Te();se();Ls();Kt();pn();Pt();Rk=j.getGlobalBasePath(),qn=Pk.join(Rk,"projects");l(Qo,"getProjectConfig");l(Cc,"calculateDuration");l(Cm,"createExtendedRoutes")});var xm=S(()=>{"use strict"});import{streamSSE as Ak}from"hono/streaming";function Am(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Rm&&t(i)},jk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Ak(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Ik),m=setTimeout(()=>{t(a)},Rm);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var Rm,jk,Ik,jm=S(()=>{"use strict";xm();Rm=3600*1e3,jk=300*1e3,Ik=3e4;l(Am,"createSSEManager")});var Im={};we(Im,{DEFAULT_PORT:()=>ei,createServer:()=>Zo,startServer:()=>Ok});import{Hono as Dk}from"hono";import{cors as $k}from"hono/cors";import{logger as Mk}from"hono/logger";import{secureHeaders as _k}from"hono/secure-headers";function Zo(r){let e=new Dk,t=Am();e.use("*",_k()),r.enableCors!==!1&&e.use("*",$k({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",Mk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ge,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=Tm(r.projectId,r.projectPath);e.route("/api",s);let n=Cm();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(rn())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: ${rn()?"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)}}}async function Ok(r,e,t=ei){let s=Zo({port:t,projectId:r,projectPath:e});return await s.start(),s}var ei,Pc=S(()=>{"use strict";Gr();ot();Em();Pm();jm();l(Zo,"createServer");ei=3478;l(Ok,"startServer")});import fn from"chalk";var Dm,Nk,Lk,Xt,$m=S(()=>{"use strict";rt();Dm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Nk=80,Lk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Dm,speed:Nk},cli:{header:l(()=>`${fn.cyan.bold("\u26A1")} ${fn.cyan("prjct")}`,"header"),footer:l(()=>fn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${fn.cyan("\u26A1")} ${fn.cyan("prjct")} ${fn.cyan(Dm[r%10])} ${fn.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")=>Oo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Oo(r).signature,"getSignature")},Xt=Lk});function zn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Fk[r]}var ue,xc,Rc,ti,Fk,Bt,Mm,hn=S(()=>{"use strict";ue={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},xc=["feature","spec","design","refactor","migrate"],Rc=["ship","cleanup","git","migrate"],ti=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Fk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(zn,"getTimeout");Bt={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},Mm={HISTORY_MAX:100}});var Yr,Ac=S(()=>{"use strict";Yr={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function yn(r,e){return{...Yr[r],...e}}function Jn(r,e,t){return{message:r,hint:e,...t}}var Qr=S(()=>{"use strict";Ac();Ac();l(yn,"getError");l(Jn,"createError")});var Om={};we(Om,{ERRORS:()=>Yr,ICONS:()=>Fs,OUTPUT_TIERS:()=>_m,createError:()=>Jn,default:()=>f,formatForHuman:()=>Bk,getError:()=>yn,getOutputTier:()=>Hk,getTierConfig:()=>ni,isQuietMode:()=>Gk,limitLines:()=>si,setOutputTier:()=>Uk,setQuietMode:()=>Wk});import ce from"chalk";function Uk(r){Xn=r}function Hk(){return Xn}function ni(){return _m[Xn]}function Wk(r){xt=r}function Gk(){return xt}function si(r,e){let t=e??ni().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
|
|
472
476
|
`);if(s.length<=t)return r;let n=s.slice(0,t),o=s.length-t;return`${n.join(`
|
|
473
477
|
`)}
|
|
474
|
-
${
|
|
475
|
-
`),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${
|
|
476
|
-
`)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?
|
|
477
|
-
`),e.maxLines):
|
|
478
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
479
|
-
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(
|
|
480
|
-
${
|
|
481
|
-
`),this)},progress(r,e,t){if(
|
|
482
|
-
`),this)}},f=Pk});var vm={};we(vm,{default:()=>Rk,sessionTracker:()=>Ns});var Sm,bm,yc,Ns,Rk,Xo=S(()=>{"use strict";Hr();ee();on();K();Sm=50,bm=200,yc=class{static{l(this,"SessionTracker")}async read(e){try{return x.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){x.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ds(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>Sm&&(n.current.commands=n.current.commands.slice(-Sm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>bm&&(n.current.files=n.current.files.slice(-bm)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:vt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:vt(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Ns=new yc,Rk=Ns});var Em={};we(Em,{default:()=>fn,performanceTracker:()=>Tm});var Ak,wc,Tm,fn,Yo=S(()=>{"use strict";ee();Ak=BigInt(300*1e9),wc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>Ak&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:m(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},Tm=new wc,fn=Tm});import Qo from"node:fs/promises";var kc,jk,hn,Zo=S(()=>{"use strict";ve();ke();H();on();V();kc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new $n({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await M.getProjectId(e),n=D.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:D.getFilePath(s,"core","now.md"),next:D.getFilePath(s,"core","next.md"),context:D.getFilePath(s,"core","context.md"),shipped:D.getFilePath(s,"progress","shipped.md"),metrics:D.getFilePath(s,"progress","metrics.md"),ideas:D.getFilePath(s,"planning","ideas.md"),roadmap:D.getFilePath(s,"planning","roadmap.md"),specs:D.getFilePath(s,"planning","specs"),memory:D.getFilePath(s,"memory","context.jsonl"),patterns:D.getFilePath(s,"memory","patterns.json"),analysis:D.getFilePath(s,"analysis","repo-summary.md"),codePatterns:D.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Qo.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(I(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[p,m]=await Promise.all([Qo.readFile(d,"utf-8"),Qo.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(I(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Qo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(I(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return E(e)}getCacheStats(){return this._cache.stats()}},jk=new kc,hn=jk});function ei(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ke,Jr=S(()=>{"use strict";Ke={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(ei,"calculateConfidence")});var ti,si,ni,Sc=S(()=>{"use strict";ee();Jr();K();ti=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},si=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()}},ni=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var ri,Cm=S(()=>{"use strict";ee();Jr();K();Sc();ri=class r extends ti{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=ei(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=ei(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:ei(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=v(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import{createHash as Pm}from"node:crypto";function Kr(r){return Pm("sha256").update(r).digest("hex")}function yn(r){return Kr(r).slice(0,16)}function xm(r){return Pm("md5").update(r).digest("hex")}var wn=S(()=>{"use strict";l(Kr,"sha256");l(yn,"sha256Short");l(xm,"md5")});function vs(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var qn,bc=S(()=>{"use strict";Ut();ee();Jr();K();wn();l(vs,"rowToMemory");qn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ke));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=yn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
483
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=
|
|
478
|
+
${ce.dim(`...${o} more lines`)}`}function Bk(r){let e=ni();if(Xn==="silent")return"";if(Xn==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Vt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Vt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&Xn==="compact"&&o.push(ce.dim(String(t.url))),si(o.join(`
|
|
479
|
+
`),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Vt(String(a.title),Bt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(ce.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
480
|
+
`)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?si(n.map(o=>`${o}: ${Vt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
481
|
+
`),e.maxLines):si(JSON.stringify(r,null,2),e.maxLines)}var mj,jc,_m,Xn,Fs,Kn,Ic,xt,Vt,Vk,qk,f,Ve=S(()=>{"use strict";$m();hn();Qr();Qr();mj=Xt.spinner.frames,jc=Xt.spinner.speed,_m={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}},Xn="compact";l(Uk,"setOutputTier");l(Hk,"getOutputTier");l(ni,"getTierConfig");Fs={success:ce.green("\u2713"),fail:ce.red("\u2717"),warn:ce.yellow("\u26A0"),info:ce.blue("\u2139"),debug:ce.dim("\u{1F527}"),bullet:ce.dim("\u2022"),arrow:ce.dim("\u2192"),check:ce.green("\u2713"),cross:ce.red("\u2717"),spinner:ce.cyan("\u25D0")},Kn=null,Ic=0,xt=!1;l(Wk,"setQuietMode");l(Gk,"isQuietMode");Vt=l((r,e)=>{let t=e??(ni().maxCharsPerLine||Bt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(si,"limitLines");l(Bk,"formatForHuman");Vk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Bt.CLEAR_WIDTH)}\r`):!0,"clear"),qk={start(){return xt||console.log(Xt.cli.header()),this},end(){return xt||console.log(Xt.cli.footer()),this},spin(r){return xt?this:(this.stop(),process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,Vt(r,Bt.SPINNER_MSG))}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,Vt(r,Bt.SPINNER_MSG))}
|
|
482
|
+
`),this))},done(r,e){if(this.stop(),!xt){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=ce.dim(` [${s.join(" | ")}]`))}console.log(`${Fs.success} ${Vt(r,Bt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Fs.fail} ${Vt(r,Bt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?yn(r):r;return console.error(),console.error(`${Fs.fail} ${e.message}`),e.file&&console.error(ce.dim(` File: ${e.file}`)),e.hint&&console.error(ce.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ce.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),xt||console.log(`${Fs.warn} ${Vt(r,Bt.WARN_MSG)}`),this},info(r){return this.stop(),xt||console.log(`${Fs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!xt&&e&&console.log(`${Fs.debug} ${ce.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),xt)return this;let t=e.bullet||Fs.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),xt||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ce.dim(n)),console.log(ce.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),xt)return this;let t=e.split(`
|
|
483
|
+
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ce.dim(`\u250C${n}\u2510`)),console.log(`${ce.dim("\u2502")} ${ce.bold(r.padEnd(s))} ${ce.dim("\u2502")}`),console.log(ce.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ce.dim("\u2502")} ${o.padEnd(s)} ${ce.dim("\u2502")}`);return console.log(ce.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),xt?this:(console.log(`
|
|
484
|
+
${ce.bold(r)}`),console.log(ce.dim("\u2500".repeat(r.length))),this)},stop(){return Kn&&(clearInterval(Kn),Kn=null,Vk()),this},step(r,e,t){if(xt)return this;this.stop();let s=ce.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,`${s} ${Vt(t,Bt.STEP_MSG)}`)}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,`${s} ${Vt(t,Bt.STEP_MSG)}`)}
|
|
485
|
+
`),this)},progress(r,e,t){if(xt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ce.cyan("\u2588".repeat(n))+ce.dim("\u2591".repeat(o)),a=t?` ${Vt(t,Bt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Kn=setInterval(()=>{process.stdout.write(`\r${Xt.cli.spin(Ic++,`[${i}] ${s}%${a}`)}`)},jc),this):(process.stdout.write(`${Xt.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
486
|
+
`),this)}},f=qk});var Fm={};we(Fm,{default:()=>Jk,sessionTracker:()=>Us});var Nm,Lm,Dc,Us,Jk,ri=S(()=>{"use strict";Vr();se();ln();K();Nm=50,Lm=200,Dc=class{static{l(this,"SessionTracker")}async read(e){try{return x.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){x.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ms(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>Nm&&(n.current.commands=n.current.commands.slice(-Nm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>Lm&&(n.current.files=n.current.files.slice(-Lm)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:Et(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:Et(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Us=new Dc,Jk=Us});var Hm={};we(Hm,{default:()=>wn,performanceTracker:()=>Um});var Kk,$c,Um,wn,oi=S(()=>{"use strict";se();Kk=BigInt(300*1e9),$c=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>Kk&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(v=>Math.round(v/1048576*10)/10,"toMB"),g=a.map(v=>v.value),w=c.map(v=>v.value);o.memory={avgHeapMB:m(g.reduce((v,h)=>v+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((v,h)=>v+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((v,h)=>v+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},Um=new $c,wn=Um});import ii from"node:fs/promises";var Mc,Xk,kn,ai=S(()=>{"use strict";Ee();Te();H();ln();B();Mc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Nn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await _.getProjectId(e),n=j.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:j.getFilePath(s,"core","now.md"),next:j.getFilePath(s,"core","next.md"),context:j.getFilePath(s,"core","context.md"),shipped:j.getFilePath(s,"progress","shipped.md"),metrics:j.getFilePath(s,"progress","metrics.md"),ideas:j.getFilePath(s,"planning","ideas.md"),roadmap:j.getFilePath(s,"planning","roadmap.md"),specs:j.getFilePath(s,"planning","specs"),memory:j.getFilePath(s,"memory","context.jsonl"),patterns:j.getFilePath(s,"memory","patterns.json"),analysis:j.getFilePath(s,"analysis","repo-summary.md"),codePatterns:j.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await ii.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(I(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[p,m]=await Promise.all([ii.readFile(d,"utf-8"),ii.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(I(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await ii.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(I(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return E(e)}getCacheStats(){return this._cache.stats()}},Xk=new Mc,kn=Xk});function ci(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ye,Zr=S(()=>{"use strict";Ye={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(ci,"calculateConfidence")});var li,ui,di,_c=S(()=>{"use strict";se();Zr();K();li=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},ui=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},di=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:b(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var mi,Wm=S(()=>{"use strict";se();Zr();K();_c();mi=class r extends li{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=ci(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=b();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=ci(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:b(),confidence:ci(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import{createHash as Gm}from"node:crypto";function eo(r){return Gm("sha256").update(r).digest("hex")}function Sn(r){return eo(r).slice(0,16)}function Bm(r){return Gm("md5").update(r).digest("hex")}var bn=S(()=>{"use strict";l(eo,"sha256");l(Sn,"sha256Short");l(Bm,"md5")});function Es(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var Yn,Oc=S(()=>{"use strict";Nt();se();Zr();K();bn();l(Es,"rowToMemory");Yn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ye));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=b(),d=Sn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
487
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=Q();return N.run(e,`INSERT INTO memories
|
|
484
488
|
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
485
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?
|
|
486
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,
|
|
487
|
-
AND (${a}) ORDER BY updated_at DESC`,...c).map(
|
|
489
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?Sn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
490
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,b(),t),!0}async deleteMemory(e,t){return N.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",b(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return N.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
|
|
491
|
+
AND (${a}) ORDER BY updated_at DESC`,...c).map(Es)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
|
|
488
492
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
489
493
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
490
|
-
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(
|
|
494
|
+
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Es)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
|
|
491
495
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
492
496
|
AND (title LIKE ? OR content LIKE ?)
|
|
493
|
-
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(
|
|
497
|
+
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Es)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Es);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
|
|
494
498
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
495
499
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
496
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(
|
|
500
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Es)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Es)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Ye.COMMIT_STYLE],branch_naming:[Ye.BRANCH_NAMING],test_before_ship:[Ye.TEST_BEHAVIOR,Ye.SHIP_WORKFLOW],preferred_agent:[Ye.AGENT_PREFERENCE],code_style:[Ye.CODE_STYLE],verbosity:[Ye.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
497
501
|
Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return N.query(e,`SELECT m.* FROM memories m
|
|
498
502
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
499
503
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
500
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(
|
|
504
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Es)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
501
505
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
502
|
-
GROUP BY title HAVING cnt > 1`,e),n=
|
|
506
|
+
GROUP BY title HAVING cnt > 1`,e),n=b();for(let o of s){let i=N.query(e,`SELECT * FROM memories
|
|
503
507
|
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
504
508
|
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,w)=>w.indexOf(m)===g).join(`
|
|
505
509
|
|
|
506
510
|
---
|
|
507
511
|
|
|
508
|
-
`),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?
|
|
509
|
-
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await
|
|
510
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
511
|
-
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function
|
|
512
|
+
`),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Es(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Es)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var Nc,Yk,yt,pi=S(()=>{"use strict";_c();Wm();Oc();Nc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Yn,this._patternStore=new mi,this._historyStore=new di,this._sessionStore=new ui}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Yk=new Nc,yt=Yk});import qt from"node:fs/promises";import Yt from"node:path";var Lc,Qk,at,Vm=S(()=>{"use strict";H();Ge();B();Lc=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Yt.join(this.projectPath,"package.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Yt.join(this.projectPath,"Cargo.toml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readRequirements(){try{let e=Yt.join(this.projectPath,"requirements.txt");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGoMod(){try{let e=Yt.join(this.projectPath,"go.mod");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readGemfile(){try{let e=Yt.join(this.projectPath,"Gemfile");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readMixExs(){try{let e=Yt.join(this.projectPath,"mix.exs");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readPomXml(){try{let e=Yt.join(this.projectPath,"pom.xml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async readComposerJson(){try{let e=Yt.join(this.projectPath,"composer.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Yt.join(this.projectPath,"pyproject.toml");return await qt.readFile(e,"utf-8")}catch(e){if(I(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await L('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(`
|
|
513
|
+
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await qt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(n=>n.test(s)))}catch(e){if(I(e))return[];throw e}}async listDirectories(){try{return(await qt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(I(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await L(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await L("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await L('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await L('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await L('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return E(Yt.join(this.projectPath,e))}async readFile(e){try{let t=Yt.join(this.projectPath,e);return await qt.readFile(t,"utf-8")}catch(t){if(I(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await L(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
514
|
+
`).filter(Boolean)}catch{return[]}}},Qk=new Lc,at=Qk});import Uc from"node:fs";import Zk from"node:fs/promises";import gi from"node:path";function Hc(){if(qm)return Fc;qm=!0;let r=gi.join(Ct,"dist","templates.json");try{let e=Uc.readFileSync(r,"utf-8");return Fc=JSON.parse(e),Fc}catch{return null}}function tS(r){let e=vn.indexOf(r);e>-1&&vn.splice(e,1),vn.push(r)}function sS(){for(;Qn.size>=eS&&vn.length>0;){let r=vn.shift();r&&Qn.delete(r)}}function zm(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
|
|
515
|
+
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function Jm(r){if(Qn.has(r))return tS(r),Qn.get(r);let e,t=Hc();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=gi.join(Ct,"templates","commands",`${r}.md`);try{e=await Zk.readFile(n,"utf-8")}catch{throw Lo.notFound(r)}}let s=zm(e);return sS(),Qn.set(r,s),vn.push(r),s}async function nS(r){return(await Jm(r)).frontmatter["allowed-tools"]||[]}function rS(){Qn.clear(),vn.length=0}function wt(r){let e=Hc();if(e?.[r])return e[r];let t=gi.join(Ct,"templates",r);try{return Uc.readFileSync(t,"utf-8")}catch{return null}}function Hs(r){let e=Hc();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=gi.join(Ct,"templates",r);try{return Uc.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var eS,Qn,vn,Fc,qm,oS,Km,Ws=S(()=>{"use strict";ks();ot();eS=50,Qn=new Map,vn=[],Fc=null,qm=!1;l(Hc,"loadBundle");l(tS,"updateLruOrder");l(sS,"evictLru");l(zm,"parseFrontmatter");l(Jm,"load");l(nS,"getAllowedTools");l(rS,"clearCache");l(wt,"getTemplateContent");l(Hs,"listTemplates");oS={load:Jm,parseFrontmatter:zm,getAllowedTools:nS,clearCache:rS,getTemplateContent:wt,listTemplates:Hs},Km=oS});function fi(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
|
|
512
516
|
|
|
513
|
-
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var
|
|
517
|
+
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var Wc=S(()=>{"use strict";Ws();H();B();Ts();ot();l(fi,"mergeWithMarkers")});import mt from"node:fs/promises";import hi from"node:os";import Re from"node:path";async function iS(){try{let r=Re.join(hi.homedir(),".prjct-cli","docs");await mt.mkdir(r,{recursive:!0});let e=Hs("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Re.basename(n);await mt.writeFile(Re.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ot(),vt(Wn)),s=Re.join(t,"templates/global/docs");try{let n=await mt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Re.join(s,o),a=Re.join(r,o),c=await mt.readFile(i,"utf-8");await mt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function aS(){let r=(rt(),vt(Mt)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await mt.mkdir(e.configDir,{recursive:!0});let n=Re.join(e.configDir,e.contextFile),o=Xm;if(t!=="claude"){let g=wt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ot(),vt(Wn)),v=Re.join(w,"templates","global",e.contextFile);try{o=await mt.readFile(v,"utf-8")}catch{t==="gemini"&&(o=Xm.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await mt.readFile(n,"utf-8"),a=!0}catch(g){if(I(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
|
|
514
518
|
|
|
515
519
|
`).trim()}
|
|
516
|
-
`}let m=
|
|
520
|
+
`}let m=fi(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await mt.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function Ym(){let r=hi.homedir();return{claude:{commands:Re.join(r,".claude","commands"),config:Re.join(r,".claude"),router:Re.join(r,".claude","commands","p.md")},gemini:{commands:Re.join(r,".gemini","commands"),config:Re.join(r,".gemini"),router:Re.join(r,".gemini","commands","p.toml")}}}var Xm,Cs,cS,Oe,Ps=S(()=>{"use strict";Ws();H();B();Wc();Xm=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
|
|
517
521
|
# p/ \u2014 Context layer for AI agents
|
|
518
522
|
|
|
519
523
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -529,20 +533,20 @@ Data:
|
|
|
529
533
|
|
|
530
534
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
531
535
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
532
|
-
`;l(
|
|
536
|
+
`;l(iS,"installDocs");l(aS,"installGlobalConfig");Cs=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=hi.homedir()}async ensureInit(){if(this._initialized)return;let t=await(rt(),vt(Mt)).getActiveProvider();this.commandsPath=Re.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),E(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(rt(),vt(Mt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Re.join(this.commandsPath,t);try{await mt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Re.join(this.commandsPath,t);try{await mt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Re.join(this.commandsPath,"p");try{if((await mt.stat(e).catch(()=>null))?.isDirectory())return await mt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return aS()}async cleanupAllLegacy(){let e=hi.homedir(),t=[],s=[Re.join(e,".claude","commands","p.md"),Re.join(e,".claude","commands","p.toml"),Re.join(e,".gemini","commands","p.md"),Re.join(e,".gemini","commands","p.toml")];for(let i of s)try{await mt.unlink(i),t.push(i)}catch{}let n=[Re.join(e,".claude","commands","p"),Re.join(e,".gemini","commands","p")];for(let i of n)try{(await mt.stat(i).catch(()=>null))?.isDirectory()&&(await mt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Re.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await mt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return iS()}};l(Ym,"getProviderPaths");cS=new Cs,Oe=cS});import{z as qe}from"zod";function tp(r,e="default"){let t=Qm[e]||Qm.default;return r/1e3*t}function yi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var lS,uS,Zm,ep,Qm,wi=S(()=>{"use strict";lS=qe.object({date:qe.string(),tokensSaved:qe.number(),syncs:qe.number(),avgCompressionRate:qe.number(),totalDuration:qe.number()}),uS=qe.object({agentName:qe.string(),usageCount:qe.number(),tokensSaved:qe.number()}),Zm=qe.object({totalTokensSaved:qe.number(),avgCompressionRate:qe.number(),syncCount:qe.number(),watchTriggers:qe.number(),avgSyncDuration:qe.number(),totalSyncDuration:qe.number(),agentUsage:qe.array(uS),dailyStats:qe.array(lS),firstSync:qe.string(),lastUpdated:qe.string()}),ep={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(tp,"estimateCostSaved");l(yi,"formatCost")});function sp(r,e){let t=[];to("Languages",r.languages,e.languages,t),to("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),to("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);to("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);to("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Gc(r){if(!r.hasChanges)return`## Analysis Diff
|
|
533
537
|
|
|
534
538
|
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
535
|
-
`)}function
|
|
536
|
-
`)}function Xr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var Ac=S(()=>{"use strict";l(Fm,"generateAnalysisDiff");l(Rc,"formatAnalysisDiffMd");l(Um,"formatAnalysisDiffText");l(Xr,"diffStringArray")});var jc,Dc,Hm,Yr=S(()=>{"use strict";jc=[1,2,3,5,8,13,21],Dc={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}},Hm={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Bk from"node:fs/promises";import zk from"node:path";function Kn(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 qk(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...Kn(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Kn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Kn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...Kn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...Kn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Vm.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function Jk(r){return r.split(/\s+/).flatMap(e=>Kn(e)).filter(e=>e.length>1&&!Vm.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kk(r){let e=await nn(r),t={},s={},n=0,o=await rn(e,50,async a=>{try{let c=await Bk.readFile(zk.join(r,a),"utf-8"),u=qk(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Xk(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Yk(r,e){let t=Jk(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=Xk(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Qk(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Bm,t)}function di(r){let e=N.getDoc(r,Bm);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function zm(r,e){let t=await Kk(r);return Qk(e,t),t}function qm(r,e,t=15){let s=di(r);return s?Yk(e,s).slice(0,t):[]}var Vm,Bm,Ic=S(()=>{"use strict";Yr();ee();V();Vm=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(Kn,"splitIdentifier");l(qk,"tokenizeFile");l(Jk,"tokenizeQuery");l(Kk,"buildIndex");l(Xk,"idf");l(Yk,"score");Bm="bm25-index";l(Qk,"saveIndex");l(di,"loadIndex");l(zm,"indexProject");l(qm,"queryFiles")});import $c from"node:fs/promises";import Us from"node:path";import{z as Y}from"zod";async function nS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Us.join(e,"package.json"),n=await $c.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return I(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await cS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=sS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function oS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=Us.join(e,a);await E(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function iS(r,e){let t=Date.now();try{let s=await lS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function aS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Us.join(e,o.file);await E(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Jm(r,e){let t=Date.now(),s=await Promise.all([nS(r,e),rS(r,e),oS(r,e),iS(r,e),aS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function cS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await $c.readdir(n,{withFileTypes:!0});for(let i of o){let a=Us.join(n,i.name),c=Us.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Us.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function lS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await $c.readdir(n,{withFileTypes:!0});for(let i of o){let a=Us.join(n,i.name),c=Us.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var Zk,eS,tS,Mc,R0,sS,Km=S(()=>{"use strict";H();V();Ro();Zk=Y.enum(["draft","verified","sealed"]),eS=Y.object({name:Y.string(),description:Y.string(),location:Y.string().optional(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),tS=Y.object({issue:Y.string(),file:Y.string(),suggestion:Y.string(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),Mc=Y.object({projectId:Y.string(),languages:Y.array(Y.string()),frameworks:Y.array(Y.string()),packageManager:Y.string().optional(),sourceDir:Y.string().optional(),testDir:Y.string().optional(),configFiles:Y.array(Y.string()),fileCount:Y.number(),patterns:Y.array(eS),antiPatterns:Y.array(tS),analyzedAt:Y.string(),modelMetadata:In.optional(),status:Zk.default("draft"),commitHash:Y.string().optional(),signature:Y.string().optional(),sealedAt:Y.string().optional(),verifiedAt:Y.string().optional()}),R0={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sS={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(nS,"verifyFrameworks");l(rS,"verifyLanguages");l(oS,"verifyPatternLocations");l(iS,"verifyFileCount");l(aS,"verifyAntiPatternFiles");l(Jm,"semanticVerify");l(cS,"getProjectExtensions");l(lS,"countProjectFiles")});var _c,it,Xn=S(()=>{"use strict";Km();Ac();K();wn();Ss();_c=class extends rt{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};Mc.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:v()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Mc.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=v();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Fm(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await Jm(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Kr(JSON.stringify(t))}},it=new _c});var Oc,uS,Xt,Qr=S(()=>{"use strict";K();ee();Oc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},uS=new Oc,Xt=uS});import Xm from"node:fs/promises";import Ym from"node:path";async function Lc(r,e,t,s){let[n,o,i,a]=await Promise.all([pS(r,e,s),gS(r),fS(r),hS(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,dS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function pS(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=qm(r,n,Nc*2);for(let a of o){if(s.length>=Nc)break;try{let c=Ym.join(e,a.path),u=await Xm.readFile(c,"utf-8");u.length>mi*3?s.push({path:a.path,content:`${u.slice(0,mi)}
|
|
537
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,
|
|
539
|
+
`)}function np(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(`
|
|
540
|
+
`)}function to(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var Bc=S(()=>{"use strict";l(sp,"generateAnalysisDiff");l(Gc,"formatAnalysisDiffMd");l(np,"formatAnalysisDiffText");l(to,"diffStringArray")});var Vc,qc,rp,so=S(()=>{"use strict";Vc=[1,2,3,5,8,13,21],qc={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}},rp={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import dS from"node:fs/promises";import mS from"node:path";function Zn(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 pS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...Zn(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Zn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...Zn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...Zn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...Zn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!ap.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function gS(r){return r.split(/\s+/).flatMap(e=>Zn(e)).filter(e=>e.length>1&&!ap.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function fS(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async a=>{try{let c=await dS.readFile(mS.join(r,a),"utf-8"),u=pS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function hS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function yS(r,e){let t=gS(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=hS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function wS(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,cp,t)}function ki(r){let e=N.getDoc(r,cp);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function lp(r,e){let t=await fS(r);return wS(e,t),t}function up(r,e,t=15){let s=ki(r);return s?yS(e,s).slice(0,t):[]}var ap,cp,zc=S(()=>{"use strict";so();se();B();ap=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(Zn,"splitIdentifier");l(pS,"tokenizeFile");l(gS,"tokenizeQuery");l(fS,"buildIndex");l(hS,"idf");l(yS,"score");cp="bm25-index";l(wS,"saveIndex");l(ki,"loadIndex");l(lp,"indexProject");l(up,"queryFiles")});import Jc from"node:fs/promises";import Gs from"node:path";import{z as Z}from"zod";async function TS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Gs.join(e,"package.json"),n=await Jc.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return I(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ES(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await RS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=vS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function CS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=Gs.join(e,a);await E(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function PS(r,e){let t=Date.now();try{let s=await AS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function xS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Gs.join(e,o.file);await E(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function dp(r,e){let t=Date.now(),s=await Promise.all([TS(r,e),ES(r,e),CS(r,e),PS(r,e),xS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function RS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Jc.readdir(n,{withFileTypes:!0});for(let i of o){let a=Gs.join(n,i.name),c=Gs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Gs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function AS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await Jc.readdir(n,{withFileTypes:!0});for(let i of o){let a=Gs.join(n,i.name),c=Gs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var kS,SS,bS,Kc,eI,vS,mp=S(()=>{"use strict";H();B();$o();kS=Z.enum(["draft","verified","sealed"]),SS=Z.object({name:Z.string(),description:Z.string(),location:Z.string().optional(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),bS=Z.object({issue:Z.string(),file:Z.string(),suggestion:Z.string(),severity:Z.enum(["low","medium","high"]).optional(),language:Z.string().optional(),framework:Z.string().optional(),source:Z.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Z.number().min(0).max(1).optional()}),Kc=Z.object({projectId:Z.string(),languages:Z.array(Z.string()),frameworks:Z.array(Z.string()),packageManager:Z.string().optional(),sourceDir:Z.string().optional(),testDir:Z.string().optional(),configFiles:Z.array(Z.string()),fileCount:Z.number(),patterns:Z.array(SS),antiPatterns:Z.array(bS),analyzedAt:Z.string(),modelMetadata:On.optional(),status:kS.default("draft"),commitHash:Z.string().optional(),signature:Z.string().optional(),sealedAt:Z.string().optional(),verifiedAt:Z.string().optional()}),eI={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},vS={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(TS,"verifyFrameworks");l(ES,"verifyLanguages");l(CS,"verifyPatternLocations");l(PS,"verifyFileCount");l(xS,"verifyAntiPatternFiles");l(dp,"semanticVerify");l(RS,"getProjectExtensions");l(AS,"countProjectFiles")});var Xc,ct,er=S(()=>{"use strict";mp();Bc();K();bn();vs();Xc=class extends it{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};Kc.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Kc.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:sp(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await dp(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return eo(JSON.stringify(t))}},ct=new Xc});var Yc,jS,Qt,no=S(()=>{"use strict";K();se();Yc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),n=b();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},jS=new Yc,Qt=jS});import pp from"node:fs/promises";import gp from"node:path";async function Zc(r,e,t,s){let[n,o,i,a]=await Promise.all([$S(r,e,s),MS(r),_S(r),OS(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,IS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function $S(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=up(r,n,Qc*2);for(let a of o){if(s.length>=Qc)break;try{let c=gp.join(e,a.path),u=await pp.readFile(c,"utf-8");u.length>Si*3?s.push({path:a.path,content:`${u.slice(0,Si)}
|
|
541
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Si),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(s.length>=Qc)break;if(!s.some(c=>c.path===a))try{let c=gp.join(e,a),u=await pp.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Si),reason:"entry point"})}catch{}}return s}async function MS(r){try{let e=await ct.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 _S(r){try{return(await F.getTaskHistory(r)).slice(0,DS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function OS(r){try{let e=Qt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Si,Qc,IS,DS,fp=S(()=>{"use strict";zc();er();no();Pt();Ts();Si=3e3,Qc=15,IS=15,DS=10;l(Zc,"buildAnalysisPayload");l($S,"selectCodeSamples");l(MS,"getExistingPatterns");l(_S,"getTaskHistory");l(OS,"getPreviousAnalysisSummary")});var bi=S(()=>{"use strict"});import xs from"chalk";function hp(r){return Math.ceil(r.length/4)}function yp(r){let e=r.split(`
|
|
538
542
|
`),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
|
|
539
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
540
|
-
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
543
|
+
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function el(r){return r.includes("<!-- prjct:preserve")}function wp(r,e){let t=yp(r),s=yp(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:hp(r),tokensAfter:hp(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)el(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
544
|
+
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(el(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
541
545
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
542
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
543
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
546
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!el(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
547
|
+
`).length}),n.hasChanges=!0)}return n}function kp(r,e={}){let{colorize:t=!0}=e,s=[],n=t?xs.green:m=>m,o=t?xs.red:m=>m,i=t?xs.yellow:m=>m,a=t?xs.dim:m=>m,c=t?xs.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
544
548
|
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
545
|
-
`)}function
|
|
549
|
+
`)}function Sp(r,e={}){let{colorize:t=!0}=e,s=[],n=t?xs.green:c=>c,o=t?xs.red:c=>c,i=t?xs.cyan:c=>c,a=t?xs.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
546
550
|
`))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
547
551
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
548
552
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -553,19 +557,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Fc(r){return r.incl
|
|
|
553
557
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
554
558
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
555
559
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
556
|
-
`)}var
|
|
560
|
+
`)}var bp=S(()=>{"use strict";bi();l(hp,"estimateTokens");l(yp,"parseMarkdownSections");l(el,"isPreservedSection");l(wp,"generateSyncDiff");l(kp,"formatDiffPreview");l(Sp,"formatFullDiff")});var NS,tl,vi,sl=S(()=>{"use strict";se();H();Ge();ri();NS={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},tl=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...NS,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=x.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await L("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([L(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),L(`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(`
|
|
557
561
|
`).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${k(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
558
|
-
`)}async getSessionInfo(e){return
|
|
562
|
+
`)}async getSessionInfo(e){return Us.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
559
563
|
`);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
560
|
-
`)}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}},
|
|
561
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&
|
|
562
|
-
`);throw new
|
|
563
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
564
|
+
`)}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}},vi=l((r,e)=>new tl(r,e),"createStalenessChecker")});import vp from"node:fs/promises";import sr from"node:path";function LS(r){let e=[],t,s=new RegExp(_d.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function FS(r,e,t){let s;if(r.startsWith("@/"))s=sr.join(t,"src",r.slice(2));else{let n=sr.dirname(sr.join(t,e));s=sr.resolve(n,r)}for(let n of Md){let o=s+n;try{if((await vp.stat(o)).isFile())return sr.relative(t,o)}catch{}}return null}async function US(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async i=>{try{let a=await vp.readFile(sr.join(r,i),"utf-8"),c=LS(a),u=[];for(let d of c){let p=await FS(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function HS(r,e){N.setDoc(r,Tp,e)}function Ti(r){return N.getDoc(r,Tp)}async function Ep(r,e){let t=await US(r);return HS(e,t),t}var Tp,nl=S(()=>{"use strict";Wa();se();B();l(LS,"extractImportSources");l(FS,"resolveImport");l(US,"buildGraph");Tp="import-graph";l(HS,"saveGraph");l(Ti,"loadGraph");l(Ep,"indexImports")});function Cp(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Ti(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Pp(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var xp=S(()=>{"use strict";nl();l(Cp,"propagateChanges");l(Pp,"affectedDomains")});import Rp from"node:fs/promises";import WS from"node:path";function GS(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 BS(r){let e=await an(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await cn(e,100,async n=>{try{let o=WS.join(r,n),[i,a]=await Promise.all([Rp.readFile(o,"utf-8"),Rp.stat(o)]);return{path:n,hash:GS(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function VS(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function rl(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function qS(r){let e=new Map;try{let t=N.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function ol(r,e){let[t,s]=await Promise.all([BS(r),Promise.resolve(qS(e))]);return{diff:VS(t,s),currentHashes:t}}function Ap(r){return N.hasDoc(r,"file-hashes-meta")}var jp=S(()=>{"use strict";se();B();l(GS,"hashContent");l(BS,"computeHashes");l(VS,"diffHashes");l(rl,"saveHashes");l(qS,"loadHashes");l(ol,"detectChanges");l(Ap,"hasHashRegistry")});async function JS(r,e=100){try{let{stdout:t}=await L(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
|
|
565
|
+
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&KS(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function KS(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 XS(r,e=100){let t=await JS(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=YS(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function YS(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function QS(r,e){N.setDoc(r,$p,e)}function Mp(r){return N.getDoc(r,$p)}async function _p(r,e,t=100){let s=await XS(r,t);return QS(e,s),s}var $p,Op=S(()=>{"use strict";so();se();Ge();l(JS,"parseGitLog");l(KS,"isSourceFile");l(XS,"buildMatrix");l(YS,"pairKey");$p="cochange-index";l(QS,"saveMatrix");l(Mp,"loadMatrix");l(_p,"indexCoChanges")});import Up from"node:fs/promises";import Np from"node:os";import il from"node:path";function eb(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:al}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:al}}}}function Hp(){return eb().mcpServers?.context7||al}function Lp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?il.join(Np.tmpdir(),"prjct-context7-test","mcp.json"):il.join(Np.homedir(),".claude","mcp.json")}async function Fp(r){try{let e=await Up.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e))return{};throw e}}async function tb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Hp(),e=[...r.args||[],"--help"];await on(r.command||"npx",e,{timeout:15e3})}var al,nr,cl,sb,Zt,rr=S(()=>{"use strict";Ws();Vr();H();Ge();B();al={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},nr=null;l(eb,"parseTemplateConfig");l(Hp,"getContext7Config");l(Lp,"getConfigPath");l(Fp,"readConfig");l(tb,"runSmokeCheck");cl=class{static{l(this,"Context7Service")}async install(){let e=Lp(),t=il.dirname(e);await Up.mkdir(t,{recursive:!0});let s=await Fp(e),n=s.mcpServers||{};return n.context7=Hp(),s.mcpServers=n,await le(e,s),nr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(nr&&Date.now()-nr.at<3e5)return nr.status;let e=Lp(),n=((await Fp(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await tb();let o={installed:!0,verified:!0,configPath:e};return nr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return nr={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}},sb=new cl,Zt=sb});import{execFileSync as Wp,execSync as nb}from"node:child_process";var Ei,ll,Ci,Gp,Bp=S(()=>{"use strict";ln();Qr();Ei={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"}},ll=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=Ei[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Ei[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Ci(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Ei[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
566
|
+
`);throw new Ci({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
567
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ei),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=nb(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:Jn(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:Jn(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Wp(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Wp(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Jn(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ms(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())}},Ci=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}},Gp=new ll});var xi={};we(xi,{installAntigravitySkill:()=>Kp,installCodexSkill:()=>ul,needsAntigravityInstallation:()=>cb,run:()=>Jp,verifyCodexPRouterReady:()=>or});import{execFileSync as rb}from"node:child_process";import re from"node:fs/promises";import Tn from"node:os";import de from"node:path";import Se from"chalk";async function ob(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Gp.isAvailable("npm"))return console.log(`${Se.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Se.dim(`Install ${r.displayName} using one of:`)}`),console.log(Se.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Se.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(Se.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Se.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),rb("npm",["install","-g",e],{stdio:"inherit",timeout:zn("NPM_INSTALL")}),console.log(""),console.log(`${Se.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(Se.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(Se.dim("The npm install took too long. Try:")),console.log(Se.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Se.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Se.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(Se.dim("Alternative installation methods:")),console.log(Se.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Se.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Se.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Se.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Jp(){let r=await ws(),e=await Qa(),t=Be[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=Be[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await ob(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Oe.detectActiveProvider()){let m=await Oe.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Oe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Oe.installDocs(),await mb(),await Zt.ensureReady()}}else if(a==="gemini"){await ib()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await ab();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Ln()).installed&&(await Kp()).success&&console.log(` ${Se.green("\u2713")} Antigravity skill installed`),(await un()).installed){if(!(await ul()).success)throw new Error("Codex skill installation failed");let c=await or({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${Se.green("\u2713")} Codex skill installed`),console.log(` ${Se.green("\u2713")} Codex p. router ready`)}await Kr.saveConfig(ge,await Oe.getInstallPath(),e.provider),await db();for(let a of s.providers)pb(a,Be[a.provider]);return s}async function ib(){try{let r=de.join(Tn.homedir(),".gemini","commands"),e=de.join(r,"p.toml");try{return await re.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function ab(){try{let r=de.join(Tn.homedir(),".gemini"),e=de.join(r,"GEMINI.md");await re.mkdir(r,{recursive:!0});let t=wt("global/GEMINI.md");if(!t){let c=de.join(Ct,"templates","global","GEMINI.md");t=await re.readFile(c,"utf-8")}let s="",n=!1;try{s=await re.readFile(e,"utf-8"),n=!0}catch(c){if(I(c))n=!1;else throw c}let a=fi(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await re.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function Kp(){try{let r=de.join(Tn.homedir(),".gemini","antigravity","skills"),e=de.join(r,"prjct"),t=de.join(e,"SKILL.md");await re.mkdir(e,{recursive:!0});let s=await E(t),n=wt("antigravity/SKILL.md");if(!n){let o=de.join(Ct,"templates","antigravity","SKILL.md");if(!await E(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await re.readFile(o,"utf-8")}return await re.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function cb(){let r=await Ln();return r.installed&&!r.skillInstalled}function Yp(){return de.join(Tn.homedir(),".codex","skills","prjct","SKILL.md")}function lb(r){return`<!-- ${Xp}: ${JSON.stringify({version:ge,templateHash:r})} -->`}function Vp(r){let e=r.match(new RegExp(`<!--\\s*${Xp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function ub(r){return eo(r)}async function Qp(){let r=wt("codex/SKILL.md");if(r)return r;let e=de.join(Ct,"templates","codex","SKILL.md");return await E(e)?re.readFile(e,"utf-8"):null}function Zp(r){let e=r.trimEnd(),t=ub(e),s=lb(t);return{content:`${e}
|
|
564
568
|
|
|
565
569
|
${s}
|
|
566
|
-
`,templateHash:t}}async function
|
|
570
|
+
`,templateHash:t}}async function ul(){try{let r=Yp(),e=de.dirname(r);await re.mkdir(e,{recursive:!0});let t=await E(r),s=await Qp();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Zp(s);return t&&await re.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await re.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function or(r={}){let e=Yp();if(!(await un()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Qp();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=Zp(s),o=l(async()=>r.autoRepair?(await ul()).success:!1,"maybeRepair"),i="";if(!await E(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await re.readFile(e,"utf-8").catch(()=>"");let a=Vp(i);if(!(a?.version===ge&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await re.readFile(e,"utf-8").catch(()=>""),a=Vp(i),!(a?.version===ge&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function db(){try{let r=de.join(Tn.homedir(),".prjct-cli","projects");if(!await E(r))return;let e=(await re.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=x.getDoc(s,"project");if(!n)continue;n.cliVersion!==ge&&(n.cliVersion=ge,x.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Se.green("\u2713")} Updated ${t} project(s) to v${ge}`)}catch(r){I(r)||V.warn(`Migration warning: ${k(r)}`)}}async function qp(r,e){let t={};if(await E(r))try{t=await De(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function mb(){try{let r=de.join(Tn.homedir(),".claude"),e=de.join(r,"settings.json"),t=de.join(r,"prjct-statusline.sh"),s=de.join(Tn.homedir(),".prjct-cli","statusline"),n=de.join(s,"statusline.sh"),o=de.join(s,"themes"),i=de.join(s,"lib"),a=de.join(s,"components"),c=de.join(s,"config.json"),u=de.join(Ct,"assets","statusline"),d=de.join(u,"statusline.sh"),p=de.join(u,"themes"),m=de.join(u,"lib"),g=de.join(u,"components"),w=de.join(u,"default-config.json");if(await E(r)||await re.mkdir(r,{recursive:!0}),await E(s)||await re.mkdir(s,{recursive:!0}),await E(o)||await re.mkdir(o,{recursive:!0}),await E(i)||await re.mkdir(i,{recursive:!0}),await E(a)||await re.mkdir(a,{recursive:!0}),await E(n)){let v=await re.readFile(n,"utf8");if(v.includes("CLI_VERSION=")){let h=v.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==ge){let P=v.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ge}"`);await re.writeFile(n,P,{mode:493})}await Pi(m,i),await Pi(g,a),await zp(t,n),await qp(e,t);return}}if(await E(d)){let v=await re.readFile(d,"utf8");if(v=v.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ge}"`),await re.writeFile(n,v,{mode:493}),await Pi(m,i),await Pi(g,a),await E(p)){let h=await re.readdir(p);for(let P of h){let T=de.join(p,P),$=de.join(o,P);await re.copyFile(T,$)}}!await E(c)&&await E(w)&&await re.copyFile(w,c)}else{let v=`#!/bin/bash
|
|
567
571
|
# prjct Status Line for Claude Code
|
|
568
|
-
CLI_VERSION="${
|
|
572
|
+
CLI_VERSION="${ge}"
|
|
569
573
|
input=$(cat)
|
|
570
574
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
571
575
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -594,7 +598,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
594
598
|
fi
|
|
595
599
|
fi
|
|
596
600
|
echo "prjct"
|
|
597
|
-
`;await
|
|
601
|
+
`;await re.writeFile(n,v,{mode:493})}await zp(t,n),await qp(e,t)}catch(r){I(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Pi(r,e){if(!await E(r))return;let t=await re.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=de.join(r,s),o=de.join(e,s);await re.copyFile(n,o),await re.chmod(o,493)}}async function zp(r,e){try{if(await E(r)){if((await re.lstat(r)).isSymbolicLink()&&await re.readlink(r)===e)return;await re.unlink(r)}await re.symlink(e,r)}catch{try{await E(e)&&(await re.copyFile(e,r),await re.chmod(r,493))}catch(s){I(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function pb(r,e){if(console.log(""),r.cliInstalled?console.log(` ${Se.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Se.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${Se.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${Se.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${Se.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${Se.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${Se.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Xp,gb,ir=S(()=>{"use strict";Ws();rr();Bp();se();H();hn();B();bn();Ts();ot();rt();Ps();Vo();Wc();l(ob,"installAICLI");l(Jp,"run");l(ib,"installGeminiRouter");l(ab,"installGeminiGlobalConfig");l(Kp,"installAntigravitySkill");l(cb,"needsAntigravityInstallation");Xp="prjct-codex-router";l(Yp,"getCodexSkillPath");l(lb,"getCodexSkillMetadata");l(Vp,"parseCodexSkillMetadata");l(ub,"hashContent");l(Qp,"loadCodexSkillTemplate");l(Zp,"buildCodexSkillContent");l(ul,"installCodexSkill");l(or,"verifyCodexPRouterReady");l(db,"migrateProjectsCliVersion");l(qp,"ensureStatusLineSettings");l(mb,"installStatusLine");l(Pi,"installStatusLineModules");l(zp,"ensureStatusLineSymlink");l(pb,"showResults");gb=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");gb&&Jp().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var dl,Bs,Ri=S(()=>{"use strict";wi();K();vs();dl=class extends it{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zm)}getDefault(){return{...ep}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(P=>P.date===o);if(m>=0){let P=p[m];p[m]={...P,tokensSaved:P.tokensSaved+s,syncs:P.syncs+1,avgCompressionRate:(P.avgCompressionRate*P.syncs+n)/(P.syncs+1),totalDuration:P.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],v=p.filter(P=>P.date>=w),h=[...i.agentUsage];if(t.agents)for(let P of t.agents){let T=h.findIndex($=>$.agentName===P);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:P,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:h,dailyStats:v,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:tp(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Bs=new dl});import oe from"node:fs/promises";import ee from"node:path";async function Ai(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(r)&&x.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=j.getGlobalProjectPath(r),n=ee.join(s,"storage"),o=ee.join(s,"index"),i=ee.join(s,"memory");t.backupDir=await fb(n,o,i),x.getDb(r);for(let{filename:c,key:u}of gl){let d=ee.join(n,c),p=await es(d);if(p===null){t.skippedFiles.push(c);continue}try{x.setDoc(r,u,p),eg(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of pl){let d=ee.join(o,c),p=await es(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),tg(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await Tb(r,o,t),await Eb(r,o,t),await Cb(r,i,t),await Pb(r,i,t);let a=ee.join(s,"sessions");return await xb(r,a,t),t.errors.length===0&&await Rb(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function fb(r,e,t){let s=ee.join(r,"backup");return await oe.mkdir(s,{recursive:!0}),await oe.mkdir(ee.join(s,"index"),{recursive:!0}),await oe.mkdir(ee.join(s,"memory"),{recursive:!0}),await ml(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await ml(e,ee.join(s,"index")),await ml(t,ee.join(s,"memory")),s}async function ml(r,e,t){try{let s=await oe.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=ee.join(r,n.name),i=ee.join(e,n.name);await oe.copyFile(o,i)}}catch(s){if(!I(s))throw s}}function eg(r,e,t){switch(e){case"state":hb(r,t);break;case"queue":yb(r,t);break;case"ideas":wb(r,t);break;case"shipped":kb(r,t);break;case"metrics":Sb(r,t);break;case"analysis":bb(r,t);break}}function hb(r,e){let t=x.getDb(r),s=t.prepare(`
|
|
598
602
|
INSERT OR REPLACE INTO tasks
|
|
599
603
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
600
604
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -605,92 +609,92 @@ echo "prjct"
|
|
|
605
609
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
606
610
|
depends_on, started_at, completed_at, output, summary)
|
|
607
611
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
608
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(
|
|
612
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(O(a.id)??`task-${Date.now()}`,O(a.description??a.parentDescription)??"",O(a.type),O(c??a.status)??"unknown",O(a.parentDescription),O(a.branch),O(a.linearId),O(a.linearUuid),O(a.sessionId),O(a.featureId),O(a.startedAt)??new Date().toISOString(),O(a.completedAt),O(a.shippedAt),O(a.pausedAt),O(a.pauseReason),O(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let p=u[d];n.run(O(p.id)??`subtask-${d}`,O(a.id),O(p.description)??"",O(p.status)??"pending",O(p.domain),O(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,O(p.startedAt),O(p.completedAt),O(p.output),p.summary?JSON.stringify(p.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function yb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
|
|
609
613
|
INSERT OR REPLACE INTO queue_tasks
|
|
610
614
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
611
615
|
feature_id, feature_name)
|
|
612
616
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
613
|
-
`);for(let o of t)n.run(
|
|
617
|
+
`);for(let o of t)n.run(O(o.id)??`queue-${Date.now()}`,O(o.description)??"",O(o.type),O(o.priority),O(o.section),O(o.createdAt)??new Date().toISOString(),o.completed?1:0,O(o.completedAt),O(o.featureId),O(o.featureName))}function wb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
|
|
614
618
|
INSERT OR REPLACE INTO ideas
|
|
615
619
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
616
620
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
617
|
-
`);for(let o of t)n.run(
|
|
621
|
+
`);for(let o of t)n.run(O(o.id)??`idea-${Date.now()}`,O(o.text)??"",O(o.status)??"pending",O(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,O(o.addedAt)??new Date().toISOString(),O(o.convertedTo),O(o.details),JSON.stringify(o))}function kb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
|
|
618
622
|
INSERT OR REPLACE INTO shipped_features
|
|
619
623
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
620
624
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
621
|
-
`);for(let o of t)n.run(
|
|
625
|
+
`);for(let o of t)n.run(O(o.id)??`ship-${Date.now()}`,O(o.name)??"",O(o.shippedAt)??new Date().toISOString(),O(o.version)??"0.0.0",O(o.description),O(o.type),O(o.duration),JSON.stringify(o))}function Sb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
|
|
622
626
|
INSERT OR REPLACE INTO metrics_daily
|
|
623
627
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
624
628
|
VALUES (?, ?, ?, ?, ?)
|
|
625
|
-
`);for(let o of t)n.run(
|
|
629
|
+
`);for(let o of t)n.run(O(o.date)??new Date().toISOString().slice(0,10),Vs(o.tokensSaved)??0,Vs(o.syncs)??0,Vs(o.avgCompressionRate)??0,Vs(o.totalDuration)??0)}function bb(r,e){let s=x.getDb(r).prepare(`
|
|
626
630
|
INSERT OR REPLACE INTO analysis
|
|
627
631
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
628
632
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
629
|
-
`),n=l((o,i)=>{o&&s.run(i,
|
|
633
|
+
`),n=l((o,i)=>{o&&s.run(i,O(o.status)??"unknown",O(o.commitHash),O(o.signature),O(o.sealedAt),O(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function tg(r,e,t){e==="categories-cache"&&vb(r,t)}function vb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=x.getDb(r).prepare(`
|
|
630
634
|
INSERT OR REPLACE INTO index_files
|
|
631
635
|
(path, categories, domain, score, size, mtime, language)
|
|
632
636
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
633
|
-
`);for(let o of t){let i=
|
|
637
|
+
`);for(let o of t){let i=O(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,O(o.primaryDomain),i)}}async function Tb(r,e,t){let s=ee.join(e,"checksums.json"),n=await es(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=x.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Eb(r,e,t){let s=ee.join(e,"file-scores.json"),n=await es(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(r),a=i.prepare(`
|
|
634
638
|
INSERT OR REPLACE INTO index_files
|
|
635
639
|
(path, score, size, mtime, language, categories, domain)
|
|
636
640
|
VALUES (?, ?, ?, ?, NULL,
|
|
637
641
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
638
642
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
639
|
-
`);i.transaction(()=>{for(let c of o){let u=
|
|
640
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.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=
|
|
641
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.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:${
|
|
643
|
+
`);i.transaction(()=>{for(let c of o){let u=O(c.path);u&&a.run(u,Vs(c.score)??0,Vs(c.size),O(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Cb(r,e,t){let s=ee.join(e,"events.jsonl");try{let o=(await oe.readFile(s,"utf-8")).split(`
|
|
644
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.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=O(u.type??u.action)??"unknown",p=O(u.taskId??u.task_id),m=O(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Pb(r,e,t){let s=ee.join(e,"learnings.jsonl");try{let o=(await oe.readFile(s,"utf-8")).split(`
|
|
645
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.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:${O(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?O(p[0]):null;a.run(d,m,c,1,O(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){I(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function xb(r,e,t){let n=x.getDb(r).prepare(`
|
|
642
646
|
INSERT OR IGNORE INTO sessions
|
|
643
647
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
644
648
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
645
|
-
`),o=l(u=>{!u||!u.id||n.run(
|
|
646
|
-
`).filter($=>$.trim());if(P.length===0){await
|
|
649
|
+
`),o=l(u=>{!u||!u.id||n.run(O(u.id),O(u.projectId)??r,O(u.task)??"",O(u.status)??"completed",O(u.startedAt)??new Date().toISOString(),O(u.pausedAt),O(u.completedAt),Vs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=ee.join(e,"current.json"),a=await es(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await oe.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=ee.join(e,"archive");try{let u=await oe.readdir(c);for(let p of u){let m=ee.join(c,p);try{if(!(await oe.stat(m)).isDirectory())continue;let w=await oe.readdir(m);for(let h of w){if(!h.endsWith(".json"))continue;let P=ee.join(m,h),T=await es(P);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${p}/${h}`),await oe.unlink(P).catch(()=>{})}catch($){t.errors.push({file:`sessions/archive/${p}/${h}`,error:String($)})}}(await oe.readdir(m)).length===0&&await oe.rmdir(m).catch(()=>{})}catch{}}(await oe.readdir(c).catch(()=>[])).length===0&&await oe.rmdir(c).catch(()=>{})}catch{}try{(await oe.readdir(e)).length===0&&await oe.rmdir(e).catch(()=>{})}catch{}}async function Rb(r,e,t,s){let n=l(async(i,a)=>{try{await oe.unlink(i)}catch(c){I(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of gl)await n(ee.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(ee.join(e,i),`cleanup:index/${i}`);await n(ee.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(ee.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function O(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Vs(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function es(r){try{let e=await oe.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(I(e)||e instanceof SyntaxError)return null;throw e}}async function ji(r){let e=j.getGlobalProjectPath(r),t=ee.join(e,"storage"),s=0;x.getDb(r);for(let{filename:w,key:v}of gl){let h=ee.join(t,w),P=await es(h);if(P!==null){x.setDoc(r,v,P),eg(r,v,P);try{await oe.unlink(h)}catch{}s++}}let n=ee.join(e,"project.json"),o=await es(n);if(o!==null){x.setDoc(r,"project",o);try{await oe.unlink(n)}catch{}s++}let i=ee.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let v=ee.join(i,w);try{let P=(await oe.readFile(v,"utf-8")).split(`
|
|
650
|
+
`).filter($=>$.trim());if(P.length===0){await oe.unlink(v),s++;continue}let T=x.getDb(r);if(w==="events.jsonl"){let $=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let M of P)try{let y=JSON.parse(M);$.run(O(y.type??y.action)??"unknown",O(y.taskId??y.task_id),M,O(y.timestamp??y.ts)??new Date().toISOString())}catch{}})()}else{let $=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let M of P)try{let y=JSON.parse(M),R=`learning:${O(y.taskId??y.timestamp)??Date.now()}`,D=y.tags;$.run(R,O(D?.[0]),M,1,O(y.timestamp)??new Date().toISOString())}catch{}})()}await oe.unlink(v),s++}catch{}}let a=ee.join(e,"sessions"),c=l(w=>{if(!w||!w.id)return;x.getDb(r).prepare(`
|
|
647
651
|
INSERT OR IGNORE INTO sessions
|
|
648
652
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
649
653
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
650
|
-
`).run(
|
|
651
|
-
`)}},
|
|
652
|
-
`)}},
|
|
653
|
-
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function
|
|
654
|
+
`).run(O(w.id),O(w.projectId)??r,O(w.task)??"",O(w.status)??"completed",O(w.startedAt)??new Date().toISOString(),O(w.pausedAt),O(w.completedAt),Vs(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=ee.join(a,"current.json"),d=await es(u);d!==null&&(c(d),await oe.unlink(u).catch(()=>{}),s++);let p=ee.join(a,"archive");try{let w=await oe.readdir(p);for(let h of w){let P=ee.join(p,h);try{if(!(await oe.stat(P)).isDirectory())continue;let $=await oe.readdir(P);for(let y of $){if(!y.endsWith(".json"))continue;let R=await es(ee.join(P,y));R!==null&&(c(R),await oe.unlink(ee.join(P,y)).catch(()=>{}),s++)}(await oe.readdir(P)).length===0&&await oe.rmdir(P).catch(()=>{})}catch{}}(await oe.readdir(p).catch(()=>[])).length===0&&await oe.rmdir(p).catch(()=>{})}catch{}try{(await oe.readdir(a)).length===0&&await oe.rmdir(a).catch(()=>{})}catch{}let m=ee.join(e,"index"),g=[...pl.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let v=ee.join(m,w),h=await es(v);if(h===null)continue;let P=pl.find(T=>T.filename===w);P&&(x.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",P.key,JSON.stringify(h),new Date().toISOString()),tg(r,P.key,h));try{await oe.unlink(v)}catch{}s++}return s}var gl,pl,fl=S(()=>{"use strict";Te();H();se();gl=[{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"}],pl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ai,"migrateJsonToSqlite");l(fb,"createBackup");l(ml,"copyFiles");l(eg,"populateNormalized");l(hb,"populateTasksFromState");l(yb,"populateQueueTasks");l(wb,"populateIdeas");l(kb,"populateShippedFeatures");l(Sb,"populateMetricsDaily");l(bb,"populateAnalysis");l(tg,"populateIndexTables");l(vb,"populateCategoriesIndex");l(Tb,"migrateChecksums");l(Eb,"migrateFileScores");l(Cb,"migrateEventsJsonl");l(Pb,"migrateLearningsJsonl");l(xb,"migrateSessionFiles");l(Rb,"cleanupJsonFiles");l(O,"toStr");l(Vs,"toNum");l(es,"readJsonSafe");l(ji,"sweepLegacyJson")});import{z as he}from"zod";var Ab,jb,sg,KD,XD,YD,qs,ng,ro=S(()=>{"use strict";Ab=he.enum(["improving","stable","declining"]),jb=he.object({sprintNumber:he.number(),startDate:he.string(),endDate:he.string(),pointsCompleted:he.number(),tasksCompleted:he.number(),avgVariance:he.number(),estimationAccuracy:he.number()}),sg=he.object({category:he.string(),avgVariance:he.number(),taskCount:he.number()}),KD=he.object({totalPoints:he.number(),sprints:he.number(),estimatedDate:he.string()}),XD=he.object({sprints:he.array(jb),averageVelocity:he.number(),velocityTrend:Ab,estimationAccuracy:he.number(),overEstimated:he.array(sg),underEstimated:he.array(sg),lastUpdated:he.string()}),YD=he.object({sprintLengthDays:he.number().min(1).max(90).default(7),startDay:he.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:he.number().min(1).max(52).default(6),accuracyTolerance:he.number().min(0).max(100).default(20)}),qs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},ng={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var hl,Ii,yl=S(()=>{"use strict";ro();vs();hl=class extends it{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:ng,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}},Ii=new hl});var oo,wl,kl,rg=S(()=>{"use strict";Zr();K();oo=3,wl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=oo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${oo} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=oo){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${oo} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=oo&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[Ye.FILE_STRUCTURE,Ye.ARCHITECTURE],tech_stack:[Ye.TECH_STACK],architecture:[Ye.ARCHITECTURE,Ye.CODE_STYLE],estimation:[Ye.SHIP_WORKFLOW],workflow:[Ye.SHIP_WORKFLOW,Ye.CODE_STYLE],gotcha:[Ye.TEST_BEHAVIOR,Ye.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(`
|
|
655
|
+
`)}},kl=new wl});import{z as A}from"zod";var og,Ib,Db,ig,$b,Mb,_b,Ob,Nb,Lb,Fb,ag,Ub,Hb,l$,cg,lg,ug,dg,Wb,Di,mg=S(()=>{"use strict";og=A.number().min(1).max(5),Ib=A.enum(["exceeded","met","partial","failed"]),Db=A.enum(["definitely","probably","maybe","no"]),ig=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),$b=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:ig.optional(),explanation:A.string().optional()})}),Mb=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),_b=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),Ob=A.object({metrics:A.array(Mb),acceptanceCriteria:A.array(_b),overallSuccess:Ib,successScore:A.number().min(0).max(100)}),Nb=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),Lb=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(Nb)}),Fb=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:Db,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),ag=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:og,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),Ub=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:$b,success:Ob.optional(),learnings:Lb,roi:Fb,rating:og,taskOutcomes:A.array(ag).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),Hb=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:ig,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),l$=A.object({outcomes:A.array(Ub),taskOutcomes:A.array(ag).optional(),aggregates:Hb.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),cg={outcomes:[],taskOutcomes:[],lastUpdated:""},lg=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),ug=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),dg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Wb=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Di=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=>Wb(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Sl,pg,gg=S(()=>{"use strict";mg();vs();K();Sl=class extends it{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...cg,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Di([t,...s.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Di(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Di(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&_t(e.duration)||60,s=t/60,n=t/60,o=lg(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=ug(5,n);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:dg(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}}},pg=new Sl});import bl from"node:fs/promises";import $i from"node:path";var vl,Tl,fg,hg=S(()=>{"use strict";H();B();vl=".prjct/.prjct-state.md",Tl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=$i.join(e,vl);await bl.mkdir($i.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await bl.writeFile(s,n,"utf-8")}async remove(e){try{await bl.unlink($i.join(e,vl))}catch(t){if(!I(t))throw t}}async exists(e){let t=$i.join(e,vl);return E(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
656
|
+
`)}},fg=new Tl});var El,Lt,En=S(()=>{"use strict";Ee();mn();se();El=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await _.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await _.getProjectId(e);return s?N.query(s,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await _.getProjectId(e);return n?N.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await _.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=bs.MEMORY_MAX_ENTRIES)return 0;let n=s-bs.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Gt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Lt=new El});import Gb from"node:path";function Bb(r){return Sn(Gb.resolve(r))}function io(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Vb(r){return kc(r,e=>`${io(e.name)}::${io(e.source)}`)}function qb(r){return kc(r,e=>`${io(e.issue)}::${io(e.file)}::${io(e.source)}`)}var Cl,zb,yg,wg=S(()=>{"use strict";se();Xo();bn();l(Bb,"repoHash");l(io,"normalizeKey");l(Vb,"dedupePatterns");l(qb,"dedupeAntiPatterns");Cl=class{static{l(this,"PatternExtractor")}async extract(e){let t=Bb(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Vb([...s,...n]),a=qb([...o]),c=`analysis:derived-rules:${t}`;return x.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},zb=new Cl,yg=zb});import ao from"node:fs/promises";import Jb from"node:os";import co from"node:path";function Kb(r){return`# ${r.projectName}
|
|
657
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function Xb(r){return r.patterns.length===0?"":`
|
|
654
658
|
## Patterns
|
|
655
659
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
656
660
|
`)}
|
|
657
|
-
`}function
|
|
661
|
+
`}function Yb(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
658
662
|
## Anti-Patterns
|
|
659
663
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
660
664
|
`)}
|
|
661
|
-
`}function
|
|
665
|
+
`}function Qb(r){return r.knownGotchas.length===0?"":`
|
|
662
666
|
## Known Gotchas
|
|
663
667
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
664
668
|
`)}
|
|
665
|
-
`}function
|
|
669
|
+
`}function Zb(r){return r.recentShipped.length===0?"":`
|
|
666
670
|
## Recent Deliveries
|
|
667
671
|
${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
|
|
668
672
|
`)}
|
|
669
|
-
`}function
|
|
673
|
+
`}function ev(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
|
|
670
674
|
## Velocity
|
|
671
675
|
${e.join(" | ")}
|
|
672
|
-
`}function
|
|
676
|
+
`}function tv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
|
|
673
677
|
## Commands
|
|
674
678
|
| Action | Command |
|
|
675
679
|
|--------|---------|
|
|
676
680
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
677
681
|
`)}
|
|
678
|
-
`}function
|
|
682
|
+
`}function sv(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
|
|
679
683
|
## State
|
|
680
684
|
${e.join(`
|
|
681
685
|
`)}
|
|
682
|
-
`}function
|
|
686
|
+
`}function nv(r){return r.userPatterns.length===0?"":`
|
|
683
687
|
## User Patterns
|
|
684
688
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
685
689
|
`)}
|
|
686
|
-
`}function
|
|
690
|
+
`}function rv(r){return[Xb(r),Yb(r),Qb(r),Zb(r),ev(r),tv(r.commands),sv(r),nv(r)].filter(Boolean).join("")}function ov(r,e){let t=r.userInvocable!==!1;return`---
|
|
687
691
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
688
692
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
689
693
|
user-invocable: ${t}
|
|
690
|
-
---`}function
|
|
694
|
+
---`}function iv(r,e){return`${ov(r,e)}
|
|
691
695
|
|
|
692
|
-
${r.body(e)}`}var
|
|
693
|
-
${
|
|
696
|
+
${r.body(e)}`}var Pl,xl,kg,Sg=S(()=>{"use strict";ks();Ts();l(Kb,"formatProjectHeader");l(Xb,"formatPatterns");l(Yb,"formatAntiPatterns");l(Qb,"formatGotchas");l(Zb,"formatRecentShipped");l(ev,"formatVelocity");l(tv,"formatCommands");l(sv,"formatState");l(nv,"formatUserPatterns");l(rv,"formatRichContext");Pl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Kb(r)}
|
|
697
|
+
${rv(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
|
|
694
698
|
Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
|
|
695
699
|
`)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
|
|
696
700
|
|
|
@@ -773,29 +777,29 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
773
777
|
|
|
774
778
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
775
779
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
776
|
-
`,"body")}];l(
|
|
777
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await
|
|
778
|
-
`).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:de(t)})}return e}async function Zt(r,e){let t=await E(pl.join(r,e));return t||B.debug("File not found",{filename:e}),t}async function cg(r){let e={fileCount:0,version:"0.0.0",name:pl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:de(t)}),e.fileCount=0}try{let t=pl.join(r,"package.json"),s=await je(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Zt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:de(t)})}return await Zt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Zt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Zt(r,"requirements.txt")||await Zt(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 lg(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 Zt(r,"bun.lockb")||await Zt(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Zt(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 Zt(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 Zt(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 Zt(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ug(r){return new Pi(r).detect()}var dg=S(()=>{"use strict";ys();rg();ze();V();bs();ig();l(ag,"analyzeGit");l(Zt,"fileExistsInProject");l(cg,"gatherStats");l(lg,"detectCommands");l(ug,"detectStack")});import mg from"node:fs/promises";import xi from"node:path";var gl,fl,pg,gg=S(()=>{"use strict";xt();H();ze();V();gl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=xi.join(r,n);await E(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=xi.basename(r);try{await L.read(s)}catch(n){I(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=xi.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await mg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await mg.readFile(xi.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},fl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[gl.contextFilesExist(t),gl.jsonFilesValid(t),gl.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},pg=new fl});import fg from"node:fs/promises";import hl from"node:path";var yl,Ps,Ri=S(()=>{"use strict";bc();Ic();up();pp();kp();Gc();ys();st();Es();ve();ke();sr();Xn();ln();ee();_s();Qr();Si();el();is();un();xt();sl();K();V();bs();Hp();Yp();er();Zp();bn();tg();ng();dg();gg();yl=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await M.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=D.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await fg.rm(hl.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await an()).installed){let y=await tr({autoRepair:!0});y.verified||B.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await Yt.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:de(y)},error:`Context7 MCP is required but not ready: ${de(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await bi(this.projectId);try{let y=await vi(this.projectId);y>0&&B.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){B.debug("Legacy JSON sweep failed (non-critical)",{error:de(y)})}let[a,c,u,d]=await Promise.all([ag(this.projectPath),cg(this.projectPath),lg(this.projectPath),ug(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&mp(this.projectId))try{let{diff:y,currentHashes:R}=await Vc(this.projectPath,this.projectId),O=y.added.length+y.modified.length+y.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=cp(y,this.projectId);w=lp(G.allAffected);let oe=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(Ie=>{let Pt=Ie.substring(Ie.lastIndexOf("."));return oe.has(Pt)}),m={isIncremental:!0,filesChanged:O,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}Wc(this.projectId,R)}catch(y){B.debug("Incremental detection failed, falling back to full sync",{error:de(y)})}else try{let{currentHashes:y}=await Vc(this.projectPath,this.projectId);Wc(this.projectId,y)}catch(y){B.debug("Hash computation failed (non-critical)",{error:de(y)})}if(g)try{await Promise.all([zm(this.projectPath,this.projectId),ap(this.projectPath,this.projectId),wp(this.projectPath,this.projectId)])}catch(y){B.debug("File ranking index build failed (non-critical)",{error:de(y)})}let b;try{let[y,R,O,G,oe,gt,Ie,Pt,Or,va,Ta]=await Promise.all([Promise.resolve(Xt.getActive(this.projectId)).catch(()=>null),it.getActive(this.projectId).catch(()=>null),lt.getRecent(this.projectId,3).catch(()=>[]),Ti.getMetrics(this.projectId).catch(()=>null),Ee.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),qe.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),lt.getCount(this.projectId).catch(()=>0)]),Ea={backlogCount:oe.length,completedTaskCount:gt.length,pausedTaskCount:Ie.length,hasActiveTask:!!Or},Ca=y?y.patterns.map(ae=>({name:ae.name,description:ae.description,location:ae.locations?.[0]})):(R?.patterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({name:ae.name,description:ae.description,location:ae.location})),Be=y?y.antiPatterns.map(ae=>({issue:ae.issue,file:ae.files?.[0]??"multiple",suggestion:ae.suggestion,severity:ae.severity??"medium"})):(R?.antiPatterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({issue:ae.issue,file:ae.file,suggestion:ae.suggestion,severity:ae.severity??"medium"})),zt=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Nr={version:c.version,fileCount:c.fileCount,patterns:Ca,antiPatterns:Be,recentShipped:O.map(ae=>({name:ae.name,type:ae.type??"feature",duration:ae.duration,filesChanged:ae.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:oe.length,completedTaskCount:gt.length,pausedTaskCount:Ie.length,knownGotchas:Pt?.knownGotchas??[],userPatterns:Pt?.patternsDiscovered??[],hasActiveTask:!!Or,activeTaskDescription:Or?.description??"",pausedTasks:Ie.map(ae=>({description:ae.description,pausedAt:ae.pausedAt??""})),topBacklog:oe.slice(0,3).map(ae=>({description:ae.description,priority:ae.priority??"medium"})),ideasCount:va?.pending??0,shippedCount:Ta};b=await sg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:zt,stack:d},Ea,Nr)}catch(y){B.debug("Native skill generation failed (non-critical)",{error:de(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await it.getActive(this.projectId),P={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,$=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Me.installGlobalConfig(),await Me.syncCommands();let j;try{let y=await M.readConfig(this.projectPath);j=await pg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){B.debug("Verification failed (non-critical)",{error:de(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:P,syncMetrics:$,verification:j,incremental:m,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:de(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>fg.mkdir(hl.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Qp.generate(this.projectPath,n)}catch(o){B.debug("Local state generation failed (optional)",{error:de(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=di(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){B.debug("Could not load BM25 index for metrics",{error:de(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Hs.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){B.debug("Failed to record sync metrics",{error:de(a)})}let i={};try{let a=di(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=fi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=yp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){B.debug("Could not load index stats",{error:de(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await eg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await it.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:v(),status:"draft",commitHash:o??void 0})}catch(o){B.debug("Failed to save draft analysis (non-critical)",{error:de(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([lt.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),Ee.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),_t.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Ht.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:de(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,s=await rl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Xp.getFeatureOutcomes(this.projectId);n.length>0&&await rl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:de(e)})}}async getCliVersion(){try{let e=hl.join(__dirname,"..","..","package.json");return(await je(e))?.version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:de(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},Ps=new yl});function Gb(){return"---"}function Wb(){return`---
|
|
779
|
-
prjct v${
|
|
780
|
-
`)}function
|
|
780
|
+
`,"body")}];l(ov,"buildFrontmatter");l(iv,"buildSkillContent");xl=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=co.join(Jb.homedir(),".claude","skills");for(let c of Pl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await ao.rm(co.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=iv(c,o),d=co.join(i,c.name),p=co.join(d,"SKILL.md");await ao.mkdir(d,{recursive:!0}),await ao.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:pe(u)}),n.skipped.push({name:c.name,reason:pe(u)})}}let a=new Set(Pl.map(c=>c.name));try{let c=await ao.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await ao.rm(co.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&V.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return Pl}},kg=new xl});var bg=S(()=>{"use strict"});import av from"node:fs/promises";import vg from"node:path";var Mi,Tg=S(()=>{"use strict";B();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 s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=vg.join(this.projectPath,"package.json"),t=await av.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return E(vg.join(this.projectPath,e))}}});import Rl from"node:path";async function Eg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await L("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await L("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await L("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await L("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
781
|
+
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await L('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
782
|
+
`).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await L('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:pe(t)})}return e}async function ts(r,e){let t=await E(Rl.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Cg(r){let e={fileCount:0,version:"0.0.0",name:Rl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await L('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:pe(t)}),e.fileCount=0}try{let t=Rl.join(r,"package.json"),s=await De(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await ts(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:pe(t)})}return await ts(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await ts(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await ts(r,"requirements.txt")||await ts(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 Pg(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 ts(r,"bun.lockb")||await ts(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await ts(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 ts(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 ts(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 ts(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function xg(r){return new Mi(r).detect()}var Rg=S(()=>{"use strict";ks();bg();Ge();B();Ts();Tg();l(Eg,"analyzeGit");l(ts,"fileExistsInProject");l(Cg,"gatherStats");l(Pg,"detectCommands");l(xg,"detectStack")});import Ag from"node:fs/promises";import _i from"node:path";var Al,jl,jg,Ig=S(()=>{"use strict";Pt();H();Ge();B();Al={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=_i.join(r,n);await E(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=_i.basename(r);try{await F.read(s)}catch(n){I(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=_i.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Ag.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Ag.readFile(_i.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!I(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},jl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Al.contextFilesExist(t),Al.jsonFilesValid(t),Al.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(v=>v.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await L(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},jg=new jl});import Dg from"node:fs/promises";import Il from"node:path";var Dl,Rs,Oi=S(()=>{"use strict";Oc();zc();xp();jp();Op();nl();ks();rt();Ps();Ee();Te();ir();er();mn();se();Ls();no();Ri();fl();Kt();pn();Pt();yl();K();B();Ts();rg();gg();rr();hg();En();wg();Sg();Rg();Ig();Dl=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await _.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Dg.rm(Il.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await un()).installed){let y=await or({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await Zt.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:pe(y)},error:`Context7 MCP is required but not ready: ${pe(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Ai(this.projectId);try{let y=await ji(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:pe(y)})}let[a,c,u,d]=await Promise.all([Eg(this.projectPath),Cg(this.projectPath),Pg(this.projectPath),xg(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&Ap(this.projectId))try{let{diff:y,currentHashes:R}=await ol(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=Cp(y,this.projectId);w=Pp(G.allAffected);let Y=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(me=>{let Me=me.substring(me.lastIndexOf("."));return Y.has(Me)}),m={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}rl(this.projectId,R)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:pe(y)})}else try{let{currentHashes:y}=await ol(this.projectPath,this.projectId);rl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:pe(y)})}if(g)try{await Promise.all([lp(this.projectPath,this.projectId),Ep(this.projectPath,this.projectId),_p(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:pe(y)})}let v;try{let[y,R,D,G,Y,We,me,Me,$s,Ia,Da]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),ct.getActive(this.projectId).catch(()=>null),dt.getRecent(this.projectId,3).catch(()=>[]),Ii.getMetrics(this.projectId).catch(()=>null),ke.getBacklog(this.projectId).catch(()=>[]),F.getTaskHistory(this.projectId).catch(()=>[]),F.getAllPausedTasks(this.projectId).catch(()=>[]),F.getAggregatedFeedback(this.projectId).catch(()=>null),F.getCurrentTask(this.projectId).catch(()=>null),Xe.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),dt.getCount(this.projectId).catch(()=>0)]),$a={backlogCount:Y.length,completedTaskCount:We.length,pausedTaskCount:me.length,hasActiveTask:!!$s},Ma=y?y.patterns.map(ae=>({name:ae.name,description:ae.description,location:ae.locations?.[0]})):(R?.patterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({name:ae.name,description:ae.description,location:ae.location})),_a=y?y.antiPatterns.map(ae=>({issue:ae.issue,file:ae.files?.[0]??"multiple",suggestion:ae.suggestion,severity:ae.severity??"medium"})):(R?.antiPatterns??[]).filter(ae=>ae.source!=="repo").map(ae=>({issue:ae.issue,file:ae.file,suggestion:ae.suggestion,severity:ae.severity??"medium"})),Oa=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Na={version:c.version,fileCount:c.fileCount,patterns:Ma,antiPatterns:_a,recentShipped:D.map(ae=>({name:ae.name,type:ae.type??"feature",duration:ae.duration,filesChanged:ae.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Y.length,completedTaskCount:We.length,pausedTaskCount:me.length,knownGotchas:Me?.knownGotchas??[],userPatterns:Me?.patternsDiscovered??[],hasActiveTask:!!$s,activeTaskDescription:$s?.description??"",pausedTasks:me.map(ae=>({description:ae.description,pausedAt:ae.pausedAt??""})),topBacklog:Y.slice(0,3).map(ae=>({description:ae.description,priority:ae.priority??"medium"})),ideasCount:Ia?.pending??0,shippedCount:Da};v=await kg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Oa,stack:d},$a,Na)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:pe(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await ct.getActive(this.projectId),P={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,$=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Oe.installGlobalConfig(),await Oe.syncCommands();let M;try{let y=await _.readConfig(this.projectPath);M=await jg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:pe(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:P,syncMetrics:$,verification:M,incremental:m,generatedSkills:v}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:pe(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Dg.mkdir(Il.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await F.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,n);try{await fg.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:pe(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=ki(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:pe(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Bs.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:pe(a)})}let i={};try{let a=ki(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Ti(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Mp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:pe(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await F.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 yg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await ct.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){V.debug("Failed to save draft analysis (non-critical)",{error:pe(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([dt.archiveOldShipped(this.projectId).catch(()=>0),Xe.markDormantIdeas(this.projectId).catch(()=>0),ke.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),Lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Gt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:pe(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Yn,s=await kl.learnFromTaskHistory(this.projectId,e,t);try{let n=await pg.getFeatureOutcomes(this.projectId);n.length>0&&await kl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:pe(e)})}}async getCliVersion(){try{let e=Il.join(__dirname,"..","..","package.json");return(await De(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:pe(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:[]}}},Rs=new Dl});function cv(){return"---"}function lv(){return`---
|
|
783
|
+
prjct v${dn()}`}function U(...r){return Ml(cv(),...r.filter(Boolean),lv())}function lo(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
784
|
+
`)}function $g(r,e=""){return`\`\`\`${e}
|
|
781
785
|
${r}
|
|
782
|
-
\`\`\``}function
|
|
783
|
-
${e}`}function
|
|
784
|
-
`)}function
|
|
785
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
786
|
-
${
|
|
786
|
+
\`\`\``}function $l(r,e){return`**${r}**: \`${e}\``}function Ni(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function te(r,e,t=3){return`### ${r}
|
|
787
|
+
${e}`}function ze(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
788
|
+
`)}function uo(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
789
|
+
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Mg(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
|
|
790
|
+
${lo(t,s)}`}function _g(r){return r.length===0?"":`### Relevant Files
|
|
787
791
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
788
|
-
`)}`}function
|
|
789
|
-
${
|
|
790
|
-
> ${e}`:`## ${r}`}function
|
|
791
|
-
|
|
792
|
-
`)}function
|
|
793
|
-
`))}var
|
|
794
|
-
Next:`));for(let o of n){let i=
|
|
795
|
-
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return
|
|
796
|
-
`)}function
|
|
792
|
+
`)}`}function ye(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
793
|
+
${lo(e,t)}`}function kt(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return lo(t,s)}function Pe(r,e){return e?`## ${r}
|
|
794
|
+
> ${e}`:`## ${r}`}function Og(r){return`> **WARNING:** ${r}`}function Ml(...r){return r.filter(Boolean).join(`
|
|
795
|
+
|
|
796
|
+
`)}function At(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
|
|
797
|
+
`))}var Cn=S(()=>{"use strict";ot();l(cv,"mdHeader");l(lv,"mdFooter");l(U,"mdOutput");l(lo,"mdTable");l($g,"mdCodeBlock");l($l,"mdBadge");l(Ni,"mdCallout");l(te,"mdSection");l(ze,"mdList");l(uo,"mdTaskHeader");l(Mg,"mdSubtasks");l(_g,"mdRelevantFiles");l(ye,"mdNextSteps");l(kt,"mdStats");l(Pe,"mdDone");l(Og,"mdWarn");l(Ml,"mdJoin");l(At,"mdActionRequired")});import mo from"chalk";function Ft(r,e={}){if(e.quiet)return;let t=Lg[r]||"idle",s=gn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Ng[o]||o}));console.log(mo.dim(`
|
|
798
|
+
Next:`));for(let o of n){let i=mo.cyan(o.cmd.padEnd(12));console.log(mo.dim(` ${i} \u2192 ${o.desc}`))}}function Li(r,e=!1){let t=Lg[r]||"idle";return gn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Ng[n]||n}))}function po(r){let e=gn.getStateInfo(r);console.log(mo.dim(`\u{1F4CD} State: ${mo.white(r.toUpperCase())} - ${e.description}`))}var Ng,Lg,ar=S(()=>{"use strict";Tc();Ng={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"},Lg={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(Ft,"showNextSteps");l(Li,"getNextSteps");l(po,"showStateInfo")});import uv from"node:path";async function _l(r,e){let t=Date.now()-e;await Oe.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${cr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
|
|
799
|
+
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ft("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function Fg(r){try{let e=await Lt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=Et(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function cr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Ol(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Ug(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function Hg(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${cr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${yi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Ol(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${cr(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(`
|
|
800
|
+
`)}function Wg(r,e){let t=[];t.push(`# Repository Analysis
|
|
797
801
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
798
|
-
`);let s=
|
|
802
|
+
`);let s=uv.basename(e);if(t.push(`## Project: ${s}
|
|
799
803
|
`),t.push(`## Stack Detected
|
|
800
804
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
801
805
|
`),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}r.hasNextConfig&&t.push("- **Framework**: Next.js detected"),r.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),r.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}r.cargoToml&&(t.push(`### Rust
|
|
@@ -811,10 +815,10 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
|
|
|
811
815
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
812
816
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
813
817
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
814
|
-
`)}var
|
|
818
|
+
`)}var Gg=S(()=>{"use strict";Ps();wi();En();K();ar();Ve();l(_l,"showSyncResult");l(Fg,"getSessionActivity");l(cr,"formatTokens");l(Ol,"formatDuration");l(Ug,"generateSparkline");l(Hg,"generateStatsMarkdown");l(Wg,"generateAnalysisSummary")});var Bg,Vg,qg=S(()=>{"use strict";Bg=["task","done","ship","resume","bug","enrich"],Vg=["init","sync","pause","next","dash","history","undo","redo"]});import ls from"chalk";function dv(r){return zg[r.toLowerCase()]||zg.default}var zg,Nl,Jg,Kg=S(()=>{"use strict";zg={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(dv,"getIcon");Nl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ls.cyan(`
|
|
815
819
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
816
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
817
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
820
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=dv(t);console.log(ls.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ls.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ls.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ls.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?ls.green("\u2713"):ls.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ls.dim(`(${s})`)}
|
|
821
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ls.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ls.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Jg=new Nl});import Xg from"node:fs";import Fi from"node:path";function mv(r){if(rn()){let{Database:n}=Dt("bun:sqlite");return new n(r,{create:!0})}let e=Dt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ll,Ui,Yg=S(()=>{"use strict";Gr();l(mv,"openDatabase");Ll=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Fi.resolve(e):Fi.join(Dt("node:os").homedir(),".prjct-cli");this.dbPath=Fi.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Fi.dirname(this.dbPath);Xg.existsSync(e)||Xg.mkdirSync(e,{recursive:!0});let t=mv(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
|
|
818
822
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
819
823
|
version INTEGER PRIMARY KEY,
|
|
820
824
|
name TEXT NOT NULL,
|
|
@@ -835,14 +839,14 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
|
|
|
835
839
|
INSERT OR REPLACE INTO mcp_health
|
|
836
840
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
837
841
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
838
|
-
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},
|
|
839
|
-
`)}function Gg(r){console.log(Qb(r))}var Hg,Wg=S(()=>{"use strict";Hg=[dt.cyan,dt.magenta,dt.yellow,dt.blue,dt.green,dt.redBright,dt.magentaBright,dt.cyanBright];l(Xb,"getDomainColor");l(Yb,"formatSubtaskLine");l(Qb,"renderSubtaskProgress");l(Gg,"printSubtaskProgress")});function ev(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 tv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Zb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:ev(t)};return{detected:!1}}function sv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function nv(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 rv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function ov(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 Zb,Rl,iv,or,Vg=S(()=>{"use strict";Zb=[{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(ev,"getHallucinationSuggestion");l(tv,"detectHallucination");l(sv,"isSimilarError");l(nv,"analyzeErrorPattern");l(rv,"generateEscalationMessage");l(ov,"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="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>sv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=nv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:rv(e,o,this.maxAttempts),suggestion:ov(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return tv(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},iv=new Rl,or=iv});function Al(r,e){let t=mo(e),s=Hm[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function av(r,e){let t=mo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function cv(r,e,t){let s=mo(t),n=Al(r,t),o=Al(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Mi(r,e=Ws){let t=mo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=lv(r,e),n=uv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=pv(o),a=dv(o),c=mv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=gv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function zg(r,e,t=Ws){let s=mo(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function lv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=cv(i,n,e);if(!t.has(a)){let c=Al(i,e),u=av(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function uv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+fv(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>jl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function dv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function mv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=jl(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function pv(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function gv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=jl(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function jl(r){if(!r.variance)return 0;let e=$t(r.estimatedDuration),t=$t(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function qg(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(`
|
|
840
|
-
`)}function
|
|
842
|
+
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},Ui=new Ll});import ss from"node:fs/promises";import go from"node:os";import lt from"node:path";function pv(){try{let r=lt.dirname(Dt.resolve("prjct-cli/package.json"));return{command:"node",args:[lt.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function Qg(){return fo.split("@")[1]}function us(){return process.env.PRJCT_TEST_MODE==="1"?lt.join(go.tmpdir(),"prjct-context7-test","mcp.json"):lt.join(go.homedir(),".claude","mcp.json")}async function Zg(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:us(),mergeIntoExisting:!1}];let r=go.homedir(),e=[],t=lt.join(r,".claude");await zt(t)&&e.push({provider:"claude",configPath:lt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=lt.join(r,".gemini");return await zt(s)&&e.push({provider:"gemini",configPath:lt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function ef(r){let e=await Zg(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await zs(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function Hi(r){let e;try{e=await ss.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=lt.join(r,s);try{let o=await ss.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function gv(){let r=Qg(),e=lt.join(go.homedir(),".mcp-auth"),t=lt.join(e,`mcp-remote-${r}`);if((await Hi(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await ss.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=lt.join(e,i);if((await Hi(a)).valid){await ss.mkdir(t,{recursive:!0});let u=await ss.readdir(a);for(let d of u)await ss.copyFile(lt.join(a,d),lt.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function fv(r){if((await Hi(r)).valid)return!1;try{let t=await ss.readdir(r);for(let s of t)await ss.unlink(lt.join(r,s));return await ss.rmdir(r),!0}catch{return!1}}async function tf(r){let e=[],t=!1,s=await Zg();for(let n of s){let o=await Ul(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=Wi[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await nf(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function sf(r){let e=Qg(),t=lt.join(go.homedir(),".mcp-auth"),s=lt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await Hi(s);if(i.valid)return Ui.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await fv(s));let a=await gv();if(a.migrated)return n=!0,Ui.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${lt.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await ss.readdir(t)).filter(p=>p.startsWith("mcp-remote-")&&p!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${Fl[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${Fl[r]}`:`OAuth not completed. Run in a terminal: ${Fl[r]}`;return Ui.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function Ul(r=us()){try{let e=await ss.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function nf(r,e=us()){await le(e,r)}async function Hl(r,e,t=us()){let s=await Ul(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await nf(s,t),{path:t,changed:i}}async function zs(r,e=us()){return!!(await Ul(e)).mcpServers?.[r]}var fo,Wi,Fl,ho=S(()=>{"use strict";Yg();H();B();fo="mcp-remote@0.1.38";l(pv,"getPrjctMcpConfig");Wi={prjct:pv(),linear:{command:"npx",args:["-y",fo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",fo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},Fl={linear:`npx -y ${fo} https://mcp.linear.app/mcp`,jira:`npx -y ${fo} https://mcp.atlassian.com/v1/mcp`};l(Qg,"getMcpRemoteVersion");l(us,"getClaudeMcpConfigPath");l(Zg,"getActiveMcpConfigPaths");l(ef,"hasMcpServerAny");l(Hi,"validateTokenFiles");l(gv,"migrateOAuthTokens");l(fv,"cleanCorruptedTokens");l(tf,"validateMcpConfig");l(sf,"checkOAuthTokens");l(Ul,"readMcpConfig");l(nf,"writeMcpConfig");l(Hl,"upsertMcpServer");l(zs,"hasMcpServer")});import pt from"chalk";function hv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%rf.length;return rf[t]}function yv(r,e,t="\u25B6"){let s=pt.dim(String(r+1).padStart(2)),o=hv(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=pt.green("\u2713 Complete");break;case"in_progress":a=pt.yellow(`${t} Working...`);break;case"pending":a=pt.gray("\u25CB Pending");break;case"failed":a=pt.red("\u2717 Failed");break;case"blocked":a=pt.gray("\u2298 Blocked");break;default:a=pt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function wv(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${pt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${pt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(yv(t,r[t]));return e.push(""),e.join(`
|
|
843
|
+
`)}function of(r){console.log(wv(r))}var rf,af=S(()=>{"use strict";rf=[pt.cyan,pt.magenta,pt.yellow,pt.blue,pt.green,pt.redBright,pt.magentaBright,pt.cyanBright];l(hv,"getDomainColor");l(yv,"formatSubtaskLine");l(wv,"renderSubtaskProgress");l(of,"printSubtaskProgress")});function Sv(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function bv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of kv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Sv(t)};return{detected:!1}}function vv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Tv(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 Ev(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Cv(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 kv,Wl,Pv,lr,cf=S(()=>{"use strict";kv=[{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(Sv,"getHallucinationSuggestion");l(bv,"detectHallucination");l(vv,"isSimilarError");l(Tv,"analyzeErrorPattern");l(Ev,"generateEscalationMessage");l(Cv,"generateSuggestion");Wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>vv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Tv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Ev(e,o,this.maxAttempts),suggestion:Cv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return bv(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},Pv=new Wl,lr=Pv});function Gl(r,e){let t=yo(e),s=rp[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function xv(r,e){let t=yo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Rv(r,e,t){let s=yo(t),n=Gl(r,t),o=Gl(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Gi(r,e=qs){let t=yo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Av(r,e),n=jv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=$v(o),a=Iv(o),c=Dv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Mv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function uf(r,e,t=qs){let s=yo(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Av(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Rv(i,n,e);if(!t.has(a)){let c=Gl(i,e),u=xv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function jv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+_v(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Iv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Dv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Bl(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function $v(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function Mv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Bl(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function Bl(r){if(!r.variance)return 0;let e=_t(r.estimatedDuration),t=_t(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function df(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(`
|
|
844
|
+
`)}function _v(r){if(!r.estimatedDuration)return 0;let e=_t(r.estimatedDuration);if(e<=0)return 0;let t=lf[0],s=Number.POSITIVE_INFINITY;for(let n of lf){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function yo(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var lf,Vl=S(()=>{"use strict";so();ro();K();l(Gl,"getSprintStart");l(xv,"getSprintEnd");l(Rv,"getSprintNumber");l(Gi,"calculateVelocity");l(uf,"projectCompletion");l(Av,"bucketBySprint");l(jv,"buildSprintVelocities");l(Iv,"detectTrend");l(Dv,"calculateOverallAccuracy");l($v,"calculateAverageVelocity");l(Mv,"detectEstimationPatterns");l(Bl,"parseVariancePercent");l(df,"formatVelocityContext");lf=[{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(_v,"derivePoints");l(yo,"resolveConfig")});import Ov from"node:fs/promises";import Bi from"node:path";async function As(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=ql(r),c=await Uv(e),u=await Hv(e),d=[];for(let m of c){if(!i&&Gv(m))continue;let g=Wv(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function ql(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function Uv(r){let e=[];async function t(s,n=""){try{let o=await Ov.readdir(s,{withFileTypes:!0});for(let i of o){let a=Bi.join(s,i.name),c=Bi.join(n,i.name);if(i.isDirectory()){if(Fv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Bi.extname(i.name).toLowerCase();Lv.has(u)&&e.push(c)}}}catch(o){I(o)}}return l(t,"walk"),await t(r),e}async function Hv(r){let e=new Map;try{let{stdout:t}=await L(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
841
845
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
842
846
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
843
847
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
844
848
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
845
|
-
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function
|
|
849
|
+
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function Wv(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let P of p)if(P.includes(h)||h.includes(P)){o+=.15;break}}o=Math.min(1,o);for(let[h,P]of Object.entries(Nv))for(let T of P)if(d.includes(T)&&e.some(M=>P.includes(M)||M.includes(h)||h.includes(M))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=Bi.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let v=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,v),reasons:[...new Set(n)]}}function Gv(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var Nv,Lv,Fv,wo=S(()=>{"use strict";H();Ge();Nv={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Lv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Fv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(As,"findRelevantFiles");l(ql,"extractKeywords");l(Uv,"getAllCodeFiles");l(Hv,"getGitRecency");l(Wv,"scoreFile");l(Gv,"isTestFile")});async function ko(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await qv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Vv(r,t);return o=o.filter(c=>!zv(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function Vv(r,e){let{stdout:t}=await L(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
846
850
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
847
851
|
NF {
|
|
848
852
|
count[$0]++
|
|
@@ -852,8 +856,8 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
|
|
|
852
856
|
for (f in count) print count[f], lastmod[f], f
|
|
853
857
|
}
|
|
854
858
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
855
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),
|
|
856
|
-
`).filter(Boolean),{stdout:n}=await
|
|
859
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),v=Math.max(0,1-g/30),h=u/i,P=v*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,s.push({path:p,changes:u,heatScore:Math.round(P*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function qv(r){let e="main";try{await L("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await L(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
|
|
860
|
+
`).filter(Boolean),{stdout:n}=await L(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
857
861
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
858
862
|
NF {
|
|
859
863
|
count[$0]++
|
|
@@ -863,15 +867,15 @@ Next:`));for(let o of n){let i=io.cyan(o.cmd.padEnd(12));console.log(io.dim(` $
|
|
|
863
867
|
for (f in count) print count[f], lastmod[f], f
|
|
864
868
|
}
|
|
865
869
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
866
|
-
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,
|
|
867
|
-
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:
|
|
870
|
+
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,v=Math.floor(w/86400),h=Math.floor(w/3600),P=Math.max(0,1-v/14),T=p/c,$=P*.5+T*.5,M;h<1?M="just now":h<24?M=`${h}h ago`:M=`${v}d ago`,o.push({path:g,changes:p,heatScore:Math.round($*100)/100,lastChanged:M,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function zv(r){let e=r.split("/").pop()||"";for(let t of Bv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Bv,zl=S(()=>{"use strict";Ge();Bv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(ko,"getRecentFiles");l(Vv,"getHotFilesFromCommits");l(qv,"getBranchOnlyFiles");l(zv,"shouldIgnore")});function Jl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function mf(r,e){let t=Jv[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function pf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Vi(r,e){let t=Jl(r),s=Jl(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=mf(n,Kv),a=Kl.map(c=>({model:c,...mf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:pf(i.total),byModel:a}}}function Pn(r){let e=Jl(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Kl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Xl(r){if(r.length===0)return Pn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=Kl.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:pf(i),byModel:o}}}var Jv,Kv,Kl,qi=S(()=>{"use strict";bi();Jv={"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}},Kv="claude-sonnet-4.5";l(Jl,"countTokens");Kl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(mf,"calculateModelCost");l(pf,"formatCostSaved");l(Vi,"measureCompression");l(Pn,"noCompression");l(Xl,"combineMetrics")});import hf from"node:fs/promises";import ns from"node:path";async function Js(r,e=process.cwd()){let t=ns.isAbsolute(r)?r:ns.join(e,r),s=ns.resolve(e),n=ns.resolve(t);if(!n.startsWith(s+ns.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Pn("")};let o;try{o=await hf.readFile(t,"utf-8")}catch(p){if(I(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Pn("")};throw p}let i=ns.extname(r).toLowerCase(),a=yf[i]||"unknown",c=Zv[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Pn(o)};let u=eT(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
871
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:Vi(o,d)}}async function Yl(r,e=process.cwd(),t={}){let s=ns.isAbsolute(r)?r:ns.join(e,r),n=[];async function o(i){let a=await hf.readdir(i,{withFileTypes:!0});for(let c of a){let u=ns.join(i,c.name),d=ns.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ns.extname(c.name).toLowerCase();if(yf[p]){let m=await Js(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function eT(r,e){let t=[],s=r.split(`
|
|
868
872
|
`),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
869
|
-
`).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:
|
|
870
|
-
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await
|
|
871
|
-
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=
|
|
872
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,s]=await Promise.all([
|
|
873
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=
|
|
874
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},
|
|
873
|
+
`).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:tT(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function tT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var yf,gf,Xv,Yv,Qv,ff,Zv,zi=S(()=>{"use strict";H();qi();yf={".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"},gf=[{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}],Xv=[{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}],Yv=[{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}],Qv=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],ff=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],Zv={typescript:gf,javascript:gf,python:Xv,go:Yv,rust:Qv,java:ff,csharp:ff,php:[],ruby:[],unknown:[]};l(Js,"extractSignatures");l(Yl,"extractDirectorySignatures");l(eT,"extractFromContent");l(tT,"cleanSignature")});import Ql from"node:path";var sT,nT,Zl,rT,jt,ur=S(()=>{"use strict";Te();Nt();K();B();sT="outcomes",nT="outcomes.jsonl",Zl=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=j.getGlobalProjectPath(e);return Ql.join(t,sT)}getOutcomesPath(e){return Ql.join(this.getOutcomesDir(e),nT)}async record(e,t){let s={...t,id:Q()},n=this.getOutcomesPath(e);return await et(Ql.dirname(n)),await Ba(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await E(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await $e(t);if(!a.trim())return[];let c=a.trim().split(`
|
|
874
|
+
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await $e(t);return s.trim()?s.trim().split(`
|
|
875
|
+
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=Hn(n.variance),i=_t(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},rT=new Zl,jt=rT});import{z as Je}from"zod";var Ji,dr,oT,lO,eu,wf,Ki=S(()=>{"use strict";Ji=Je.string(),dr=Je.object({primaryDomain:Ji,secondaryDomains:Je.array(Ji),confidence:Je.number().min(0).max(1),filePatterns:Je.array(Je.string()),relevantAgents:Je.array(Je.string())}),oT=Je.object({classification:dr,classifiedAt:Je.string(),source:Je.enum(["cache","history","llm","heuristic"]),descriptionHash:Je.string(),projectId:Je.string()}),lO=Je.object({entries:Je.record(Je.string(),oT),confirmedPatterns:Je.array(Je.object({descriptionHash:Je.string(),classification:dr,confirmedAt:Je.string(),taskDescription:Je.string()}))}),eu={entries:{},confirmedPatterns:[]},wf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import aT from"node:fs/promises";import bf from"node:path";function kf(r){return Sn(r.toLowerCase().trim())}async function Sf(r){try{let e=bf.join(r,"storage","classification-cache.json"),t=await aT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e)?eu:(console.warn("[classifier] Failed to load cache:",k(e)),eu)}}async function cT(r,e){try{let t=bf.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function lT(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Ms(s.classifiedAt,36e5)?null:s.classification}function uT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var tu,dT,vf,Tf=S(()=>{"use strict";Vr();Ki();H();ln();B();bn();l(kf,"hashDescription");l(Sf,"loadCache");l(cT,"saveCache");l(lT,"lookupCache");l(uT,"lookupPatterns");tu=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=kf(e),o=await Sf(s),i=lT(o,n,t);if(i)return{classification:i,source:"cache"};let a=uT(o,n);return a?{classification:a,source:"history"}:{classification:wf,source:"heuristic"}}async confirmClassification(e,t,s){let n=kf(e),o=await Sf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cT(s,o))}},dT=new tu,vf=dT});import mT from"node:fs/promises";import pT from"node:path";var su,gT,Xi,nu=S(()=>{"use strict";Vl();Ee();Te();ro();er();no();Pt();wo();zl();zi();H();Ge();ur();Tf();su=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await _.getProjectId(s),o=j.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;p.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,v]=m,h={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},P=this.shouldFragment(a,t),T=null;P&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let $=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:P,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:v??null,contextDegradation:h,rpiContext:$}}resolveRpiPhase(e){try{let{prjctDb:t}=(se(),vt(zo)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),As(e,t,{maxFiles:10,minScore:.15}),ko(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Js(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
876
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,s]=await Promise.all([L("git branch --show-current",{cwd:e}),L("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
877
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Qt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await ct.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 jt.getAll(e);if(t.length===0)return null;let s=Gi(t,qs);return s.sprints.length===0?null:df(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=pT.join(e,"analysis","repo-analysis.json"),s=await mT.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return I(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=j.getGlobalProjectPath(t),{classification:o}=await vf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,p=i.get(c)||[],m=p.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:m?"in_progress":"pending",dependsOn:p,order:u+1}});return await F.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},gT=new su,Xi=gT});function fT(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var ru,hT,Qe,Ef=S(()=>{"use strict";Nt();K();hn();hn();l(fT,"generateApprovalPrompt");ru=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return xc.includes(e)}isDestructive(e){return Rc.includes(e)}isToolAllowedInPlanning(e){return ti.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>ti.includes(s)):t}startPlanning(e,t,s){let n={id:Q(),projectId:e,command:t,params:s,status:ue.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[ue.GATHERING,ue.ANALYZING,ue.PROPOSING,ue.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ue.APPROVED?s.approvedAt=b():t===ue.EXECUTING?s.executionStartedAt=b():(t===ue.COMPLETED||t===ue.ABORTED)&&(s.completedAt=b()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ue.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ue.PENDING_APPROVAL,this.formatPlanForApproval(s)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let s=this.getActivePlan(e);return!s||s.status!==ue.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ue.APPROVED,s.approvedAt=b(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=ue.REJECTED,s.userFeedback=t,s.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==ue.APPROVED?null:(t.status=ue.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ue.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==ue.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=b(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=ue.COMPLETED,t.completedAt=b();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=ue.ABORTED,s.completedAt=b(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return fT(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ue.GATHERING]:"\u{1F50D}",[ue.ANALYZING]:"\u{1F9E0}",[ue.PROPOSING]:"\u{1F4DD}",[ue.PENDING_APPROVAL]:"\u23F3",[ue.APPROVED]:"\u2705",[ue.EXECUTING]:"\u26A1",[ue.COMPLETED]:"\u{1F389}",[ue.REJECTED]:"\u274C",[ue.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ue.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
|
|
878
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},hT=new ru,Qe=hT});var ou,yT,Cf,Pf=S(()=>{"use strict";K();ur();ou=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await jt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await jt.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await jt.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(v=>v.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((v,h)=>v+h.qualityScore,0)/a,p=i.filter(v=>{if(!v.variance)return!1;let h=Hn(v.variance),P=_t(v.estimatedDuration);return P===0?!1:Math.abs(h)/P<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let v of i.filter(h=>h.completedAsPlanned))for(let h of v.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((v,h)=>h[1]-v[1]).slice(0,3).map(([v])=>v);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:w})}return n}async detectPatterns(e){let t=await jt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>Hn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>Hn(c.variance)<0);o.length/t.length>.6&&s.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await jt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+_t(c.actualDuration),0),i=Math.round(o/n.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},yT=new ou,Cf=yT});var If={};we(If,{AgentAssignmentSchema:()=>xf,OUTPUT_SCHEMAS:()=>Af,SubtaskBreakdownSchema:()=>Rf,TaskClassificationSchema:()=>dr,renderSchemaForPrompt:()=>wT});import{z as ut}from"zod";function wT(r){let e=Af[r];return e?`## OUTPUT FORMAT
|
|
875
879
|
|
|
876
880
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
877
881
|
|
|
@@ -880,10 +884,10 @@ ${e.example}
|
|
|
880
884
|
\`\`\`
|
|
881
885
|
|
|
882
886
|
Fields:
|
|
883
|
-
${
|
|
884
|
-
`)}return"(see example above)"}function
|
|
885
|
-
... (truncated to ~${e} tokens)`}function
|
|
886
|
-
`);return
|
|
887
|
+
${kT(e.schema)}`:null}function kT(r){if(r instanceof ut.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${jf(s)}`).join(`
|
|
888
|
+
`)}return"(see example above)"}function jf(r){return r instanceof ut.ZodString?"string":r instanceof ut.ZodNumber?"number":r instanceof ut.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ut.ZodArray?`array of ${jf(r.element)}`:r instanceof ut.ZodObject?"object":"any"}var xf,Rf,Af,Df=S(()=>{"use strict";Ki();Ki();xf=ut.object({agentName:ut.string(),reasoning:ut.string(),confidence:ut.number().min(0).max(1)}),Rf=ut.object({subtasks:ut.array(ut.object({description:ut.string(),domain:Ji,agent:ut.string(),dependsOn:ut.array(ut.number())})),effort:ut.enum(["low","medium","high"])}),Af={classification:{schema:dr,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:xf,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Rf,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(wT,"renderSchemaForPrompt");l(kT,"describeSchema");l(jf,"describeField")});import $f from"node:fs/promises";import mr from"node:path";function Yi(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
889
|
+
... (truncated to ~${e} tokens)`}function Mf(r){return Math.ceil(r.length/4)}var iu,au,cu,ST,_f,Of=S(()=>{"use strict";bi();Kt();Pt();H();B();ot();Pf();Ws();iu={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Yi,"truncateToTokenBudget");l(Mf,"estimateTokens");au=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...iu,...e}}addSection(e,t){let s=Yi(e,t),n=Mf(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Yi(s,o);return this.used+=Mf(i),i}return this.used+=n,s}},cu=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await E(e)){let n=await $f.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){I(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=wt(`global/modules/${e}`);if(t)return t;let s=mr.join(Ct,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=Hs("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=wt(n);if(o){let i=mr.basename(n,".md");t[i]=o}}}else{let n=mr.join(Ct,"templates","checklists");if(await E(n)){let o=(await $f.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=mr.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){I(s)||console.error(`Checklist loading warning: ${k(s)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[s,n]=await Promise.all([F.read(e),ke.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(I(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await Cf.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!I(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
|
|
890
|
+
`);return Yi(n,iu.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=mr.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",v={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&v.agents&&(g.push(`# AGENT: ${n.name}
|
|
887
891
|
`),n.role&&g.push(`Role: ${n.role}
|
|
888
892
|
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
889
893
|
`),g.push(`
|
|
@@ -892,7 +896,7 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
892
896
|
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
893
897
|
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
894
898
|
`);let h=t;(h.params?.task||h.params?.description)&&g.push(`INPUT: ${h.params.task||h.params.description}
|
|
895
|
-
`);let P=t.projectPath;if(P){let R=[`project: ${
|
|
899
|
+
`);let P=t.projectPath;if(P){let R=[`project: ${mr.basename(P)}`,`path: ${P}`,"git: true"];u?.realContext?.gitBranch&&R.push(`branch: ${u.realContext.gitBranch}`),R.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
|
|
896
900
|
<env>
|
|
897
901
|
${R.join(`
|
|
898
902
|
`)}
|
|
@@ -916,14 +920,14 @@ ${R.join(`
|
|
|
916
920
|
### Anti-Patterns (Avoid These)
|
|
917
921
|
`);for(let R of y.antiPatterns)g.push(`- **${R.issue}** in \`${R.file}\` \u2014 ${R.suggestion}
|
|
918
922
|
`)}}g.push(`
|
|
919
|
-
`)}if(!p){let y=s?.codePatterns||"";if(
|
|
920
|
-
`),g.push(
|
|
923
|
+
`)}if(!p){let y=s?.codePatterns||"";if(v.patterns&&y&&y.trim()){let D=this.extractPatternSummary(y);D&&(g.push(`## CODE PATTERNS
|
|
924
|
+
`),g.push(D),g.push(`
|
|
921
925
|
Full patterns: Read analysis/patterns.md
|
|
922
|
-
`))}let R=s?.analysis||"";if(
|
|
926
|
+
`))}let R=s?.analysis||"";if(v.patterns&&R&&R.trim()){let D=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),G=D?D[1].trim():"detected";g.push(`
|
|
923
927
|
## STACK
|
|
924
928
|
Stack: ${G}
|
|
925
929
|
`),y||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
926
|
-
`)}}if(
|
|
930
|
+
`)}}if(v.modules.length>0)for(let y of v.modules){let R=await this.loadModule(y);R&&(g.push(`
|
|
927
931
|
`),g.push(R))}if(c?.isPlanning&&(g.push(`
|
|
928
932
|
## PLAN MODE
|
|
929
933
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
@@ -959,7 +963,7 @@ SCOPE: Only files in \`${P}\` are accessible.
|
|
|
959
963
|
${R.content}
|
|
960
964
|
\`\`\`
|
|
961
965
|
`);g.push(`
|
|
962
|
-
`)}if(y.recentFiles.length>0){g.push("**Recently Changed**: ");let R=y.recentFiles.slice(0,5).map(
|
|
966
|
+
`)}if(y.recentFiles.length>0){g.push("**Recently Changed**: ");let R=y.recentFiles.slice(0,5).map(D=>`${D.path} (${D.lastChanged})`).join(", ");g.push(`${R}
|
|
963
967
|
|
|
964
968
|
`)}}let T=t.files||[];if(T.length>0){let y=T.slice(0,5).join(", ");g.push(`
|
|
965
969
|
## FILES: ${T.length} available. Top: ${y}
|
|
@@ -1015,7 +1019,7 @@ ${y.planDoc}
|
|
|
1015
1019
|
|
|
1016
1020
|
`),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
|
|
1017
1021
|
`),g.push(`|---|--------|-------------|--------|
|
|
1018
|
-
`);for(let R of u.subtasks){let
|
|
1022
|
+
`);for(let R of u.subtasks){let D=R.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":R.status==="completed"?"\u2705 Done":R.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${R.order} | ${R.domain} | ${R.description} | ${D} |
|
|
1019
1023
|
`)}let y=u.subtasks.find(R=>R.status==="in_progress");if(y&&(g.push(`
|
|
1020
1024
|
**FOCUS ON SUBTASK #${y.order}**: ${y.description}
|
|
1021
1025
|
`),g.push(`Agent: ${y.agent} | Domain: ${y.domain}
|
|
@@ -1026,17 +1030,17 @@ ${y.planDoc}
|
|
|
1026
1030
|
`),g.push(`**From:** ${R.fromSubtask}
|
|
1027
1031
|
|
|
1028
1032
|
`),g.push(`**What was done:**
|
|
1029
|
-
`);for(let
|
|
1033
|
+
`);for(let D of R.whatWasDone)g.push(`- ${D}
|
|
1030
1034
|
`);if(R.filesChanged.length>0){g.push(`
|
|
1031
1035
|
**Files changed:**
|
|
1032
|
-
`);for(let
|
|
1036
|
+
`);for(let D of R.filesChanged)g.push(`- \`${D.path}\` (${D.action})
|
|
1033
1037
|
`)}g.push(`
|
|
1034
1038
|
**Context for this subtask:**
|
|
1035
1039
|
${R.outputForNextAgent}
|
|
1036
1040
|
`)}g.push(`
|
|
1037
|
-
`)}let
|
|
1041
|
+
`)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(Df(),If)),R=y(M);R&&g.push(`
|
|
1038
1042
|
${R}
|
|
1039
|
-
`)}if(
|
|
1043
|
+
`)}if(v.checklist){let y=await this.loadChecklistRouting(),R=await this.loadChecklists();y&&Object.keys(R).length>0&&(g.push(`
|
|
1040
1044
|
## QUALITY CHECKLISTS
|
|
1041
1045
|
`),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1042
1046
|
`),g.push(`Available: ${Object.keys(R).join(", ")}
|
|
@@ -1047,7 +1051,7 @@ ${R}
|
|
|
1047
1051
|
`),g.push(`- Be concise. No preamble, no filler.
|
|
1048
1052
|
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1049
1053
|
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1050
|
-
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new
|
|
1054
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new au({totalPrompt:iu.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
|
|
1051
1055
|
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
1052
1056
|
|
|
1053
1057
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
@@ -1064,13 +1068,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
|
1064
1068
|
`);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
|
|
1065
1069
|
Avoid:
|
|
1066
1070
|
${a}`)}let o=t.join(`
|
|
1067
|
-
`);return
|
|
1068
|
-
`+
|
|
1069
|
-
`+
|
|
1070
|
-
`+
|
|
1071
|
-
`+
|
|
1072
|
-
`+
|
|
1073
|
-
`}},
|
|
1071
|
+
`);return Yi(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},ST=new cu,_f=ST});import lu from"node:fs/promises";import bT from"node:os";import uu from"node:path";function Nf(){let r=process.env.PRJCT_CLI_HOME?.trim()||uu.join(bT.homedir(),".prjct-cli");return uu.join(r,".running")}async function vT(r){try{let e=Nf(),t=uu.dirname(e);await E(t)||await lu.mkdir(t,{recursive:!0}),await lu.writeFile(e,`/p:${r}`)}catch{}}async function TT(){try{let r=Nf();await E(r)&&await lu.unlink(r)}catch{}}var du,ET,Qi,mu=S(()=>{"use strict";qg();H();Kg();B();ho();af();ai();cf();pi();nu();Ef();Of();Ws();l(Nf,"getRunningFilePath");l(vT,"signalStart");l(TT,"signalEnd");du=class{static{l(this,"CommandExecutor")}async signalStart(e){await vT(e)}async signalEnd(){await TT()}requiresOrchestration(e){return Bg.includes(e)?!0:!Vg.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(lr.shouldEscalate(e,n)){let o=lr.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Km.load(e),i=await kn.build(s,t),a=Qe.requiresPlanning(e),c=Qe.isDestructive(e),u=Qe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Qe.startPlanning(i.projectId,e,t):u&&(d=Qe.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await Xi.execute(e,p,s),m.detectedDomains.length>0&&Jg.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let D=m.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));of(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await kn.loadState(i),v=await zs("prjct"),h=null,P=null;i.projectId&&(h={commit_footer:await yt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await yt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await yt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await yt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},v||(P=await yt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Qe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(rt(),vt(Mt)).getActiveProvider()).name==="claude",R=await _f.build(o,g,w,null,h,null,P,T,m,{skipNativeContext:y,mcpActive:v});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),lr.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:R,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:P,orchestratorContext:m,memory:{create:l(D=>yt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Y)=>yt.autoRemember(i.projectId,D,G,Y),"autoRemember"),search:l(D=>yt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>yt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>yt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(D=>Qe.recordGatheredInfo(i.projectId,D),"recordInfo"),setAnalysis:l(D=>Qe.setAnalysis(i.projectId,D),"setAnalysis"),propose:l(D=>Qe.proposePlan(i.projectId,D),"propose"),approve:l(D=>Qe.approvePlan(i.projectId,D),"approve"),reject:l(D=>Qe.rejectPlan(i.projectId,D),"reject"),getApprovalPrompt:l(()=>Qe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Qe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Qe.getNextStep(i.projectId),"getNextStep"),completeStep:l(D=>Qe.completeStep(i.projectId,D),"completeStep"),failStep:l(D=>Qe.failStep(i.projectId,D),"failStep"),abort:l(D=>Qe.abortPlan(i.projectId,D),"abort"),getStatus:l(()=>Qe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Qe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=lr.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=lr.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},ET=new du,Qi=ET});import CT from"node:https";import PT from"node:os";import pu from"node:path";import rs from"chalk";var gu,Zi,fu=S(()=>{"use strict";H();B();gu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=pu.join(PT.homedir(),".prjct-cli","config"),this.cacheFile=pu.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=pu.join(__dirname,"..","..","package.json");return(await De(e))?.version??null}catch(e){return console.error("Error reading package version:",k(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=CT.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await E(this.cacheFile))return await De(this.cacheFile)}catch{}return null}async writeCache(e){try{await le(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1072
|
+
`+rs.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")+`
|
|
1073
|
+
`+rs.yellow("\u2502")+" "+rs.bold("Update available!")+" "+rs.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+rs.yellow("\u2502")+`
|
|
1074
|
+
`+rs.yellow("\u2502")+" "+rs.yellow("\u2502")+`
|
|
1075
|
+
`+rs.yellow("\u2502")+" Run: "+rs.cyan("npm update -g prjct-cli")+" "+rs.yellow("\u2502")+`
|
|
1076
|
+
`+rs.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")+`
|
|
1077
|
+
`}},Zi=gu});import Lf from"node:path";async function AT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await E(Lf.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await E(Lf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function jT(){return{...xT}}function IT(){return{...RT}}async function Ff(){return ea||(ea=await AT()?jT():IT(),ea)}var ea,xT,RT,Uf=S(()=>{"use strict";B();ea=null,xT={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},RT={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(AT,"isClaudeEnvironment");l(jT,"getClaudeAgent");l(IT,"getTerminalAgent");l(Ff,"detect")});import ta from"node:fs/promises";var hu,Hf,Wf=S(()=>{"use strict";H();B();hu=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${k(t)}`)}return await ta.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${k(s)}`)}await ta.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${k(t)}`)}return await ta.readdir(e)}async fileExists(e){return E(e)}async createDirectory(e){await ta.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1074
1078
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
1075
1079
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1076
1080
|
|
|
@@ -1115,10 +1119,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
1115
1119
|
|
|
1116
1120
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
1117
1121
|
|
|
1118
|
-
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}}},
|
|
1119
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=N.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return N.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),N.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},
|
|
1120
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),x.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=x.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?
|
|
1121
|
-
`);
|
|
1122
|
+
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}}},Hf=hu});function Gf(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&$T.has(e.code))return!0;if(e.code&&Vf.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 MT(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Vf.has(e.code))}function Bf(r,e,t){let s=Ks.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Ks.delete(r),!1):!0:!1}function yu(r,e){let t=Ks.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Ks.set(r,t)}function _T(r){Ks.delete(r)}var $T,Vf,Ks,sa,qf,VN,zf=S(()=>{"use strict";$T=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Vf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Gf,"isTransientError");l(MT,"isPermanentError");Ks=new Map;l(Bf,"isCircuitOpen");l(yu,"recordFailure");l(_T,"recordSuccess");sa=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(Bf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return _T(t),o}catch(o){if(s=o,n++,MT(o))throw yu(t,this.options.circuitBreakerThreshold),o;if(!(Gf(o)&&n<this.options.maxAttempts))throw yu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw yu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Gf(e)}isCircuitOpen(e){return Bf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Ks.get(e)}resetCircuit(e){Ks.delete(e)}resetAllCircuits(){Ks.clear()}},qf=new sa({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),VN=new sa({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var OT,wu,na,Jf=S(()=>{"use strict";ks();Uf();Wf();zf();OT=["claude"],wu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await qf.execute(async()=>{if(this.agentInfo=await Ff(),!this.agentInfo?.isSupported)throw qr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!OT.includes(e))throw qr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Hf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},na=new wu});var ku,pr,Su=S(()=>{"use strict";ku=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},pr=new ku});var bu,gt,vu=S(()=>{"use strict";se();bu=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1123
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=N.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return N.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),N.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},gt=new bu});function Tu(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 Eu,Ne,ra=S(()=>{"use strict";vu();se();l(Tu,"rowToRule");Eu=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=x.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return x.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
1124
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),x.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=x.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Tu(s):null}getRulesForCommand(e,t){let s=gt.getWorkflow(e,t);return!s||!s.enabled?[]:x.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Tu)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Tu)}resetRules(e){let t=x.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return x.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Ne=new Eu});import St from"node:path";async function NT(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 E(St.join(r,"pnpm-lock.yaml"))?"pnpm":await E(St.join(r,"yarn.lock"))?"yarn":await E(St.join(r,"bun.lockb"))||await E(St.join(r,"bun.lock"))?"bun":(await E(St.join(r,"package-lock.json")),"npm")}function Kf(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function LT(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function gr(r,e){for(let n of FT)if(await E(St.join(r,n)))return n;let s=(e??await ys(r)).find(n=>n.endsWith(UT));if(s)return s}async function js(r){for(let e of HT)if(await E(St.join(r,e)))return e}async function oa(r){let e=St.join(r,"package.json"),t=await De(e,null);if(t){let a=await NT(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Kf(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Kf(a,"typecheck")}),c.test&&(u.test={tool:a,command:LT(a)}),u.versionFile=await gr(r),u.changelogFile=await js(r),u}if(await E(St.join(r,"pytest.ini"))){let a=await gr(r),c=await js(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await $e(St.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await gr(r),c=await js(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await E(St.join(r,"Cargo.toml"))){let a=await js(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await E(St.join(r,"go.mod"))){let a=await gr(r),c=await js(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ys(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await gr(r,n),c=await js(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await E(St.join(r,"pom.xml"))){let a=await js(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await E(St.join(r,"gradlew"))&&(await E(St.join(r,"build.gradle"))||await E(St.join(r,"build.gradle.kts")))){let a=await js(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await gr(r),i=await js(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var FT,UT,HT,Cu=S(()=>{"use strict";B();l(NT,"detectPackageManager");l(Kf,"pmRun");l(LT,"pmTest");FT=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],UT=".csproj",HT=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(gr,"detectVersionFile");l(js,"detectChangelogFile");l(oa,"detectProjectCommands")});import*as fe from"@clack/prompts";import xn from"chalk";var ia,Xf,So,Yf=S(()=>{"use strict";B();Ve();ia=[{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."}],Xf=[{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"}],So=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(){fe.intro(xn.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 fe.outro(xn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=ia.findIndex(s=>s.value===this.detectedType),t=await fe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ia.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?ia[e].value:void 0});return fe.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await fe.multiselect({message:"Which AI agents do you use?",options:Xf.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return fe.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);fe.note(e,"Detected stack");let t=await fe.confirm({message:"Is this stack correct?",initialValue:!0});if(fe.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await fe.group({language:l(()=>fe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>fe.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await fe.group({verbosity:l(()=>fe.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(()=>fe.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=[`${xn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${xn.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${xn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${xn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${xn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1125
|
+
`);fe.note(e,"Configuration Summary");let t=await fe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return fe.isCancel(t)||!t?(fe.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await zt(e.join(t.homedir(),".claude"))&&s.push("claude"),await E(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await E(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await E(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await zt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Ge(),Dd));await n("which codex"),s.push("codex")}catch{await zt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,fe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ia.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Xf.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var Qf={};we(Qf,{PlanningCommands:()=>An});import aa from"node:fs/promises";import Rn from"node:path";async function WT(){if(!Pu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(la(),Zf));Pu=new r}return Pu}var Pu,An,ca=S(()=>{"use strict";Wo();Ps();Ee();Te();Nt();Ls();Kt();ra();H();K();B();Cn();ar();Ve();Cu();Yf();Ut();Pu=null;l(WT,"getAnalysisCommands");An=class extends xe{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await _.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new So(t).runNonInteractive());else if(a=await new So(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Gn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await _.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await j.ensureProjectStructure(p);let m=j.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
|
|
1122
1126
|
|
|
1123
1127
|
No current task. Use \`/p:now\` to set focus.
|
|
1124
1128
|
`,"core/next.md":`# NEXT
|
|
@@ -1138,7 +1142,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1138
1142
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1139
1143
|
|
|
1140
1144
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1141
|
-
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[P,T]of Object.entries(g))await
|
|
1145
|
+
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[P,T]of Object.entries(g))await aa.writeFile(Rn.join(m,P),T);let w=await this._detectEmptyDirectory(t),v=await this._detectExistingCode(t);if(v||!w){f.step(3,4,"Analyzing project...");let P=await WT();if((await P.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await P.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let h=s.idea;if(w&&!v){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let P=Rn.join(m,"planning","architect-session.md"),T=`# Architect Session
|
|
1142
1146
|
|
|
1143
1147
|
## Idea
|
|
1144
1148
|
${h}
|
|
@@ -1147,8 +1151,8 @@ ${h}
|
|
|
1147
1151
|
Initialized - awaiting stack recommendation
|
|
1148
1152
|
|
|
1149
1153
|
Generated: ${new Date().toLocaleString()}
|
|
1150
|
-
`;return await
|
|
1151
|
-
`);let n=await this.getGlobalProjectPath(t),o=
|
|
1154
|
+
`;return await aa.writeFile(P,T),await Oe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:h,wizard:a}}return await Oe.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Q();return await ke.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:b()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await _.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await ke.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:b()}),s.md?console.log(U(te("Bug Reported",e),kt({Severity:i,Priority:c}),ye([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Ft("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
1155
|
+
`);let n=await this.getGlobalProjectPath(t),o=Rn.join(n,"planning","architect-session.md"),i;try{i=await $e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1152
1156
|
|
|
1153
1157
|
Create a plan first:
|
|
1154
1158
|
1. Run /p:init in an empty directory
|
|
@@ -1169,7 +1173,7 @@ The architect plan is ready. Claude will now:
|
|
|
1169
1173
|
4. Create starter files with boilerplate
|
|
1170
1174
|
`),console.log(`
|
|
1171
1175
|
\u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
|
|
1172
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
1176
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:b(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await _.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=j.getGlobalProjectPath(o),u=Rn.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1173
1177
|
|
|
1174
1178
|
## Idea
|
|
1175
1179
|
${e}
|
|
@@ -1184,14 +1188,14 @@ Initialized - awaiting architecture design
|
|
|
1184
1188
|
4. Generate roadmap
|
|
1185
1189
|
|
|
1186
1190
|
Generated: ${new Date().toLocaleString()}
|
|
1187
|
-
`;return await
|
|
1191
|
+
`;return await aa.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:b()}),s.md?console.log(U(te("Idea Captured",e),kt({Mode:"architecture"}),ye([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
|
|
1188
1192
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1189
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await
|
|
1193
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Xe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:b()}),s.md?console.log(U(te("Idea Captured",e),kt({Mode:"capture"}),ye([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Ft("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=j.getGlobalProjectPath(n),p=Rn.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(p)).filter(v=>v.endsWith(".md")&&v!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
|
|
1190
1194
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1191
1195
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1192
1196
|
\u{1F4CB} SPECIFICATIONS
|
|
1193
|
-
`),console.log("\u2550".repeat(50)),w.forEach((
|
|
1194
|
-
`),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=
|
|
1197
|
+
`),console.log("\u2550".repeat(50)),w.forEach((v,h)=>{let P=v.replace(".md","").replace(/-/g," ");console.log(` ${h+1}. ${P}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1198
|
+
`),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=j.getGlobalProjectPath(n),i=Rn.join(o,"planning","specs");await et(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Rn.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1195
1199
|
|
|
1196
1200
|
## Overview
|
|
1197
1201
|
[Brief description of the feature]
|
|
@@ -1221,38 +1225,38 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1221
1225
|
---
|
|
1222
1226
|
Created: ${new Date().toLocaleString()}
|
|
1223
1227
|
Status: Draft
|
|
1224
|
-
`;return await
|
|
1228
|
+
`;return await aa.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:b()}),f.done(`spec created: ${a}.md`),console.log(`
|
|
1225
1229
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
1226
|
-
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await
|
|
1227
|
-
`),
|
|
1228
|
-
`),console.log(`\u{1F4C4} Full report: ${
|
|
1229
|
-
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await
|
|
1230
|
-
${
|
|
1231
|
-
`)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let P=Ai("sync",!0),T=d.syncMetrics?.indexes,$={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let y=T.bm25Files*(T.bm25AvgTokens||0);$["Tokens indexed"]=`${Math.round(y/1e3)}K`,$["Import edges"]=T.importEdges||0,$["Co-change commits"]=T.cochangeCommits||0}let j=U(Te("Sync Complete"),yt($),g,d.git.hasChanges?kg("Uncommitted changes detected"):null,h,fe(P.map(y=>({label:y.desc,command:y.cmd}))));return console.log(j),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return bl(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ps.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Xt.isCurrent(n,i))return t.md?console.log(U(Te("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 Lc(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Xt.save(o,i),s.md?console.log(U(Te("LLM Analysis Saved"),yt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Xt.getActive(n);if(!o)return t.md?console.log(U("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[Te(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Z("Architecture Insights",Ge(o.architecture.insights))),o.patterns.length>0&&i.push(Z("Patterns",Ge(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Z("Anti-Patterns",Ge(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Z("Tech Debt",Ge(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Z("Conventions",Ge(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Hs.getSummary(n),i=await Hs.getDailyStats(n,30),a=await vg(n),c=await ft.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=x.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Hs.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${rr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${li(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Tg(i);if(console.log(` ${m} ${rr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=Eg(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=gi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await it.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=Lf.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,yt({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?Z("Analysis",Ge(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(Rc(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Um(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await it.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(Te("Analysis Rolled Back"),yt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await it.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(n,"project")?.repoPath||e}catch{}let i=await it.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var gu,Ff,Uf=S(()=>{"use strict";ee();gu=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){x.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1230
|
+
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await oa(t),n=0;Ne.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&Ne.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&Ne.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var xu,jn,eh=S(()=>{"use strict";ks();Wo();Ee();Te();H();B();Ve();xu=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await _.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ca(),Qf)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await _.getProjectId(e);if(!t)throw No.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Gn();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 ys(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return I(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ys(e)).some(n=>t.includes(n))}catch(t){return I(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await _.isConfigured(e)}async needsMigration(e){return await _.needsMigration(e)}},jn=new xu});var xe,Ut=S(()=>{"use strict";mu();fu();Jf();Su();En();eh();xe=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Zi,this.updateNotificationShown=!1,this.commandExecutor=Qi}get agent(){return na.getAgent()}get agentInfo(){return na.getInfo()}get currentAuthor(){return jn.getCurrentAuthor()}async initializeAgent(){return na.initialize()}async ensureProjectInit(e){return jn.ensureInit(e)}async ensureAuthor(){return jn.ensureAuthor()}async getGlobalProjectPath(e){return jn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Lt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return jn.isEmptyDirectory(e)}async _detectExistingCode(e){return jn.hasExistingCode(e)}_breakdownFeatureTasks(e){return pr.breakdownFeature(e)}_detectBugSeverity(e){return pr.detectBugSeverity(e)}}});var Zf={};we(Zf,{AnalysisCommands:()=>Dn});import ua from"node:fs/promises";import th from"node:path";import*as In from"@clack/prompts";var Dn,la=S(()=>{"use strict";ai();pi();Vm();Ps();Ee();Te();wi();Bc();fp();bp();sl();Oi();er();se();no();Ri();H();K();Cn();ar();Ve();Gg();Ut();Dn=class extends xe{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1231
|
+
`),at.init(t);let s=await kn.build(t,e),n={packageJson:await at.readPackageJson(),cargoToml:await at.readCargoToml(),goMod:await at.readGoMod(),requirements:await at.readRequirements(),directories:await at.listDirectories(),fileCount:await at.countFiles(),gitStats:await at.getGitStats(),gitLog:await at.getGitLog(20),hasDockerfile:await at.fileExists("Dockerfile"),hasDockerCompose:await at.fileExists("docker-compose.yml"),hasReadme:await at.fileExists("README.md"),hasTsconfig:await at.fileExists("tsconfig.json"),hasViteConfig:await at.fileExists("vite.config.ts")||await at.fileExists("vite.config.js"),hasNextConfig:await at.fileExists("next.config.js")||await at.fileExists("next.config.mjs")},o=Wg(n,t),i=await _.getProjectId(t),a=s.paths.analysis||j.getFilePath(i,"analysis","repo-summary.md");await ua.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(rt(),vt(Mt)).getActiveProvider(),d=await Oe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${j.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1232
|
+
`),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1233
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=j.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await j.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!m){let w=p.packages.map(v=>v.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Rs.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(U(Pe(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=th.join(o,"context","CLAUDE.md"),c=null;try{c=await ua.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Rs.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(U("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await ua.readFile(a,"utf-8")}catch{m=""}let g=wp(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(Pe("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await ua.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let P=U("## Sync Preview",h.length>0?te("Changes",ze(h)):"No section changes.",kt({"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(P),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(P=>({name:P.name,lineCount:P.lineCount})),modified:g.modified.map(P=>({name:P.name,lineCount:P.lineCount})),removed:g.removed.map(P=>({name:P.name,lineCount:P.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:h,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(kp(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let v=await In.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(In.isCancel(v)||v==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(v==="diff"){console.log(`
|
|
1234
|
+
${Sp(g)}`);let h=await In.confirm({message:"Apply these changes?",initialValue:!0});if(In.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),_l(p,i)}t.md||f.spin("Syncing project...");let d=await Rs.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let y=await ct.diff(n);y?.hasChanges&&(g=Gc(y))}catch{}let w=d.git.recentCommits[0]?.hash??null,v=w&&Qt.isCurrent(n,w),h=null;if(!v)try{let y=await Zc(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(y,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
1235
|
+
`)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let P=Li("sync",!0),T=d.syncMetrics?.indexes,$={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let y=T.bm25Files*(T.bm25AvgTokens||0);$["Tokens indexed"]=`${Math.round(y/1e3)}K`,$["Import edges"]=T.importEdges||0,$["Co-change commits"]=T.cochangeCommits||0}let M=U(Pe("Sync Complete"),kt($),g,d.git.hasChanges?Og("Uncommitted changes detected"):null,h,ye(P.map(y=>({label:y.desc,command:y.cmd}))));return console.log(M),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return _l(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Rs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(Pe("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 Zc(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Qt.save(o,i),s.md?console.log(U(Pe("LLM Analysis Saved"),kt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[Pe(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(te("Architecture Insights",ze(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",ze(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",ze(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",ze(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",ze(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Bs.getSummary(n),i=await Bs.getDailyStats(n,30),a=await Fg(n),c=await yt.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=x.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Bs.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${cr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${yi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Ol(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Ug(i);if(console.log(` ${m} ${cr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=Hg(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=vi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await ct.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=th.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,kt({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?te("Analysis",ze(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(Gc(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(np(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await ct.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(Pe("Analysis Rolled Back"),kt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await ct.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(n,"project")?.repoPath||e}catch{}let i=await ct.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var Ru,sh,nh=S(()=>{"use strict";se();Ru=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){x.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1232
1236
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){x.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
|
|
1233
1237
|
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return x.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=x.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
|
|
1234
1238
|
WHERE project_id = ? AND timestamp >= ?
|
|
1235
1239
|
GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=x.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
|
|
1236
|
-
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},
|
|
1240
|
+
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},sh=new Ru});var Au,W,bo=S(()=>{"use strict";Ee();Te();H();K();Au=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await _.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new Au});import GT from"node:fs/promises";import BT from"node:path";var fr,ju=S(()=>{"use strict";ai();Ee();sl();nh();se();Ls();Kt();pn();Pt();H();K();Cn();Ve();Ut();bo();fr=class extends xe{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=BT.basename(t),a=await F.getCurrentTask(o),c=await ke.getActiveTasks(o),u=await dt.getRecent(o,5),d=await Xe.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=Os(p),g=[];try{let h=m.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1237
1241
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1238
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let
|
|
1239
|
-
Activity: ${
|
|
1240
|
-
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await
|
|
1242
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let v=this._generateSparkline(g,p);return console.log(`
|
|
1243
|
+
Activity: ${v}
|
|
1244
|
+
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await kn.build(t),m=null;try{m=await GT.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
|
|
1241
1245
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1242
1246
|
`),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1243
|
-
`);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,
|
|
1244
|
-
`)[0].trim();console.log(` ${
|
|
1245
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${
|
|
1246
|
-
`+
|
|
1247
|
+
`);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,v)=>{let h=w.split(`
|
|
1248
|
+
`)[0].trim();console.log(` ${v+1}. ${h}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1249
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${Ss(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(h=>{let P=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${P}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let P=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${P?` (${P})`:""}`}):["Nothing shipped yet"],w=null;try{let h=sh.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
|
|
1250
|
+
`+lo(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let v=U(`## Dashboard: ${i}`,te("Current Focus",p),te(`Queue (${c.length})`,ze(m,!0)),te("Recent Ships",ze(g)),te("Ideas",`${d.length} pending`),w,ye([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(v)}else{console.log(`
|
|
1247
1251
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1248
|
-
`),console.log("\u2550".repeat(50));let p=
|
|
1252
|
+
`),console.log("\u2550".repeat(50));let p=vi(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
|
|
1249
1253
|
${g}`),console.log(`
|
|
1250
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=
|
|
1251
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,
|
|
1252
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let
|
|
1254
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=Ss(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1255
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,v)=>{let h=w.priority?`[${w.priority}]`:"";console.log(` ${v+1}. ${w.description.slice(0,40)} ${h}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1256
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let v=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${w.name} ${v?`(${v})`:""}`)}),console.log(`
|
|
1253
1257
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1254
1258
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1255
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1259
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:b()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1256
1260
|
PRJCT COMMANDS
|
|
1257
1261
|
`),console.log("=".repeat(50));let i=W.getAllCategories(),a=W.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let p=i.get(u);console.log(`
|
|
1258
1262
|
${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
|
|
@@ -1267,9 +1271,9 @@ ${"\u2550".repeat(50)}
|
|
|
1267
1271
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1268
1272
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1269
1273
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1270
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var
|
|
1271
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(
|
|
1272
|
-
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var
|
|
1274
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var oh={};we(oh,{ContextCommands:()=>Xs,contextCommands:()=>rh,default:()=>zT});import VT from"node:fs/promises";import qT from"node:path";var Xs,rh,zT,da=S(()=>{"use strict";nu();Ee();Te();Pt();H();Cn();Xs=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await _.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=j.getGlobalProjectPath(c),d=await F.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(v=>({id:v.id,description:v.description,status:v.status,domain:v.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await Xi.execute(o,i,t)}catch(v){console.error(`Warning: Orchestrator failed: ${k(v)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(v=>({id:v.id,description:v.description,domain:v.domain,agent:v.agent,status:v.status,order:v.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(te("Project",Ml($l("ID",e.projectId),$l("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(uo({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
|
|
1275
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",kt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=qT.join(e,"analysis","repo-analysis.json"),s=await VT.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return I(t),null}}},rh=new Xs,zT=rh});import Iu from"node:fs";import ih from"node:path";async function ma(r){let e=await _.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function pa(r){let e=await _.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function Du(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await ma(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await _.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=N.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await Xe.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await ke.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await pa(e),await Lt.log(e,"cleanup_performed",{items:n.length,timestamp:b()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function ah(r){let e=j.getGlobalBasePath(),t=ih.join(e,"projects");if(!Iu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Iu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=ih.join(t,a);if(!JT.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),Iu.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
|
|
1276
|
+
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var JT,$u=S(()=>{"use strict";Ee();Te();En();se();Ls();Kt();H();K();Ve();l(ma,"cleanupMemory");l(pa,"cleanupMemoryInternal");l(Du,"cleanup");JT=[/^qa-/,/^nonexistent-/,/^test-/];l(ah,"cleanupProjects")});import ch from"node:path";async function Mu(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await _.getProjectId(t),a=ch.join(j.getGlobalProjectPath(i),"planning","designs");await et(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1273
1277
|
|
|
1274
1278
|
*Use templates/design/architecture.md for full design*
|
|
1275
1279
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1284,14 +1288,14 @@ ${"\u2550".repeat(50)}
|
|
|
1284
1288
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1285
1289
|
|
|
1286
1290
|
*Use templates/design/flow.md for full design*
|
|
1287
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1291
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=ch.join(a,u);return await Tt(d,c),await Lt.log(t,"design_created",{type:s,target:o,timestamp:b()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var _u=S(()=>{"use strict";Ee();Te();En();H();K();B();Ve();l(Mu,"design")});var st,lh=S(()=>{"use strict";st={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 Ou,bt,vo,uh=S(()=>{"use strict";ks();se();lh();hn();Ts();Ou=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Mm.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&V.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(st.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(st.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw V.error("Event callback error:",s),s}}async logEvent(e){try{x.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",pe(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},bt=new Ou,vo={sessionStarted:l(r=>bt.emit(st.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>bt.emit(st.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>bt.emit(st.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>bt.emit(st.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>bt.emit(st.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>bt.emit(st.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>bt.emit(st.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>bt.emit(st.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>bt.emit(st.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>bt.emit(st.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>bt.emit(st.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>bt.emit(st.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>bt.emit(st.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>bt.emit(st.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>bt.emit(st.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>bt.emit(st.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function ga(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function mh(r){return Et(r*1e3)}var dh,ph=S(()=>{"use strict";Nt();K();dh=Q;l(ga,"calculateDuration");l(mh,"formatDuration")});function gh(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var fa,fh=S(()=>{"use strict";uh();Ee();se();H();Ge();ph();l(gh,"rowToSession");fa=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await _.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");x.getDb(this.projectId),this.initialized=!0}generateId(){return dh()}async getCurrent(){this.initialized||await this.initialize();let e=x.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?gh(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await vo.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await vo.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=ga(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await vo.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=ga(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await vo.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return ga(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await L(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await L(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1288
1292
|
`),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){I(s)||console.error(`Metrics calculation warning: ${k(s)}`)}return t}saveSession(e){x.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
1289
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(
|
|
1293
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(gh)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return mh(e)}}});import hr from"node:path";async function Nu(r=process.cwd()){try{if(!await _.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new fa(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1290
1294
|
Found abandoned session:
|
|
1291
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let o=
|
|
1295
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let o=Ss(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1292
1296
|
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
|
|
1293
|
-
`),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function
|
|
1294
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await
|
|
1297
|
+
`),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Lu(r=process.cwd()){try{f.spin("creating undo point...");let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots");await et(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=hr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await $e(c);u=JSON.parse(d)}catch(d){if(!I(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Tt(c,JSON.stringify(u,null,2)),await Lt.log(r,"undo_performed",{snapshotId:a,timestamp:b()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Fu(r=process.cwd()){try{f.spin("restoring changes...");let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots"),s=hr.join(t,"history.json"),n;try{let i=await $e(s);n=JSON.parse(i)}catch(i){if(I(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1298
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Tt(s,JSON.stringify(n,null,2)),await Lt.log(r,"redo_performed",{timestamp:b()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Uu(r=process.cwd()){try{let e=await _.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=hr.join(j.getGlobalProjectPath(e),"snapshots"),s=hr.join(t,"history.json"),n;try{let o=await $e(s);n=JSON.parse(o)}catch(o){if(I(o)||o instanceof SyntaxError)return console.log(`
|
|
1295
1299
|
SNAPSHOT HISTORY
|
|
1296
1300
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1297
1301
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1299,35 +1303,40 @@ ${"\u2550".repeat(50)}
|
|
|
1299
1303
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1300
1304
|
`)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1301
1305
|
`)),console.log(`${"=".repeat(50)}
|
|
1302
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var
|
|
1303
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});
|
|
1304
|
-
|
|
1306
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var Hu=S(()=>{"use strict";Ee();Te();En();fh();H();K();B();Ve();l(Nu,"recover");l(Lu,"undo");l(Fu,"redo");l(Uu,"history")});var yr,Wu=S(()=>{"use strict";wo();Ut();$u();_u();Hu();$u();_u();Hu();yr=class extends xe{static{l(this,"MaintenanceCommands")}_cleanupMemory=ma;_cleanupMemoryInternal=pa;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Du(e,t):s}async cleanupProjects(e={}){return ah(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Mu(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Lu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Fu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Uu(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await As(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c,null,2)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
|
|
1307
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});var Gu,KT,wr,hh=S(()=>{"use strict";Kt();Xo();Gu=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await ke.getActiveTasks(e),o=t.includeBacklog?await ke.getBacklog(e):[],i=[...n,...o],c=Ko(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1308
|
+
`)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1309
|
+
`)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,p=a[u.priority?.toLowerCase()||"none"]??4;return d-p})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
|
|
1310
|
+
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},KT=new Gu,wr=KT});var kr,$n,wU,Bu=S(()=>{"use strict";Ee();Nt();hh();Jr();Pt();H();Ve();Ut();kr=null,$n=class extends xe{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:k(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t),i=this.slugify(e),a=await Jt.create(t,i,{branch:s.branch});await Jt.setup(a.path,t);let c=Q();return await F.startTaskInWorkspace(o,{id:Q(),description:e,sessionId:Q(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:k(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Jt.create(t,a);await Jt.setup(c.path,t);let u=Q();await F.startTaskInWorkspace(n,{id:Q(),description:i,sessionId:Q(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${k(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:k(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=wr.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=wr.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await wr.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(kr=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(wr.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!kr||kr.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of kr.items){let i=wr.slugify(o);try{let a=await Jt.create(t,i);await Jt.setup(a.path,t);let c=Q();await F.startTaskInWorkspace(e,{id:Q(),description:o.title,sessionId:Q(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:kr.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${k(a)}`)}}kr=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([F.getActiveTasks(e),Jt.list(t)]),o=await F.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
|
|
1311
|
+
Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(m=>m.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",p=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${p}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
|
|
1312
|
+
Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await F.getActiveTasks(e),n=await Jt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Jt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},wU=new $n});import Le from"chalk";function ha(r,e,t){return t==="below"?r<=e?Le.green("\u2713"):Le.yellow("\u26A0"):r>=e?Le.green("\u2713"):Le.yellow("\u26A0")}var Ys,Sr,Vu=S(()=>{"use strict";Ee();oi();H();Ve();Ut();Ys={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ha,"statusIcon");Sr=class extends xe{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await wn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1313
|
+
${Le.dim("No performance data yet.")}`),console.log(`${Le.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1305
1314
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1306
|
-
${
|
|
1307
|
-
${
|
|
1315
|
+
${Le.cyan("Performance Report")} ${Le.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ha(i.startup.avg,Ys.startup.max,"below");console.log(` Startup: avg ${Le.bold(`${i.startup.avg}ms`)} ${Le.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Le.dim(`target: <${Ys.startup.max}ms`)}`)}if(i.memory){let c=ha(i.memory.peakHeapMB,Ys.heapMB.max,"below");console.log(` Memory: avg ${Le.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Le.dim(`target: <${Ys.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ha(i.contextCorrectness.rate,Ys.contextRate.min,"above");console.log(` Context: ${Le.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Le.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Le.dim(`target: ${Ys.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ha(i.subtaskHandoff.rate,Ys.handoffRate.min,"above");console.log(` Handoff: ${Le.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Le.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Le.dim(`target: ${Ys.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1316
|
+
${Le.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Le.bold(`${u.avg}ms`)} ${Le.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import XT from"node:fs/promises";import YT from"node:path";var wh,yh,qu,QT,Rt,ya=S(()=>{"use strict";Te();B();wh="https://api.prjct.app",yh={apiKey:null,apiUrl:wh,userId:null,email:null,lastAuth:null},qu=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await De(this.configPath);return this.cachedConfig=e??{...yh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await et(YT.dirname(this.configPath)),await le(this.configPath,s),await XT.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||wh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...yh},await le(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},QT=new qu,Rt=QT});function eE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function tE(r){let e={};for(let[t,s]of Object.entries(r))e[eE(t)]=s;return e}function sE(r,e){let[t,s]=e.type.split("."),n=ZT[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=tE(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function kh(r,e){return e.map(t=>sE(r,t)).filter(t=>t!==null)}var ZT,Sh=S(()=>{"use strict";ZT={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(eE,"camelToSnake");l(tE,"snakeCaseKeys");l(sE,"mapCliEventToWebFormat");l(kh,"mapCliEventsToWebFormat")});var zu,br,Ju=S(()=>{"use strict";hn();ya();Sh();zu=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=kh(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),zn("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Rt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Rt.getApiUrl(),Rt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),zn("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${zn("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},br=new zu});var Ku,nE,bh,vh=S(()=>{"use strict";gc();Ls();Kt();pn();Pt();ya();Ju();Ku=class{static{l(this,"SyncManager")}async hasAuth(){return await Rt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await br.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Ns.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await br.pushEvents(e,n);if(o.success)return await Ns.clearPending(e),await Ns.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Ns.getLastSync(e))?.timestamp,n=await br.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Ns.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await F.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await F.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await ke.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Xe.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Xe.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await dt.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await ke.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},nE=new Ku,bh=nE});import rE from"node:fs/promises";import oE from"node:http";import iE from"node:path";import ie from"chalk";var vr,Xu=S(()=>{"use strict";Ps();Ee();Te();rr();ya();Ju();vh();H();Ge();B();ho();Ve();ot();Ut();vr=class extends xe{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Rt.write({apiKey:o,...i?{apiUrl:i}:{}}),await br.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ie.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1308
1317
|
- **Status**: Connected
|
|
1309
1318
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1310
|
-
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(
|
|
1319
|
+
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ie.dim(`Key: ${o.substring(0,12)}...`)),f.info(ie.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
1311
1320
|
- **Status**: Key saved (server unreachable)
|
|
1312
|
-
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await
|
|
1313
|
-
- **Status**: Logged out`:""};default:{let o=await
|
|
1321
|
+
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await Rt.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
|
|
1322
|
+
- **Status**: Logged out`:""};default:{let o=await Rt.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
|
|
1314
1323
|
- **Authenticated**: Yes
|
|
1315
1324
|
- **Email**: ${o.email||"N/A"}
|
|
1316
1325
|
- **Key**: \`${o.apiKeyPrefix}\`
|
|
1317
1326
|
- **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?f.box("Auth Status",`Email: ${o.email||"N/A"}
|
|
1318
1327
|
Key: ${o.apiKeyPrefix}
|
|
1319
|
-
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${
|
|
1320
|
-
Key: ${t.apiKeyPrefix}`),f.info(`Run ${
|
|
1328
|
+
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${ie.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await Rt.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
|
|
1329
|
+
Key: ${t.apiKeyPrefix}`),f.info(`Run ${ie.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
|
|
1321
1330
|
- **Email**: ${t.email}
|
|
1322
1331
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1323
1332
|
|
|
1324
|
-
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=
|
|
1333
|
+
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=oE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await Rt.saveAuth(u,p||"",d||"");let m=`${s}/api`;await Rt.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
|
|
1325
1334
|
Key: ${u.substring(0,12)}...
|
|
1326
1335
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1327
1336
|
- **Email**: ${d}
|
|
1328
1337
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1329
1338
|
Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
|
|
1330
|
-
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(
|
|
1339
|
+
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ie.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await L(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ie.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await Rt.getStatus()).authenticated?(await Rt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await _.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await bh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
|
|
1331
1340
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1332
1341
|
<title>prjct CLI Connected</title>
|
|
1333
1342
|
<style>
|
|
@@ -1382,31 +1391,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1382
1391
|
<h1>Authentication Failed</h1>
|
|
1383
1392
|
<div class="msg">${e}</div>
|
|
1384
1393
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1385
|
-
</div></body></html>`}async start(){let e=await
|
|
1394
|
+
</div></body></html>`}async start(){let e=await Oe.checkInstallation(),t=(rt(),vt(Mt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1386
1395
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1387
1396
|
|
|
1388
1397
|
Please install one first:
|
|
1389
1398
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1390
1399
|
- Gemini CLI: https://geminicli.com/docs
|
|
1391
|
-
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await
|
|
1400
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Oe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1392
1401
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1393
|
-
${
|
|
1394
|
-
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(
|
|
1402
|
+
${j.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1403
|
+
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(ir(),xi));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
|
|
1395
1404
|
\u{1F389} Setup complete!`),console.log(`
|
|
1396
1405
|
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...
|
|
1397
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1406
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Oe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Oe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1398
1407
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1399
1408
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1400
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1401
|
-
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(
|
|
1409
|
+
\u{1F4DD} Installing global configuration...`);let s=await Oe.installGlobalConfig(),n=s.path?j.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(rt(),vt(Mt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1410
|
+
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(ir(),xi));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
|
|
1402
1411
|
\u{1F389} Setup complete!
|
|
1403
1412
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1404
|
-
\u{1F50C} Configuring MCP servers...`);try{await
|
|
1413
|
+
\u{1F50C} Configuring MCP servers...`);try{await Zt.install();let e=await Zt.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=us();await zs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Hl("linear",Wi.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=us();await zs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Hl("jira",Wi.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=j.getClaudeDir(),t=j.getClaudeSettingsPath(),s=iE.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
|
|
1405
1414
|
# prjct Status Line for Claude Code
|
|
1406
1415
|
# Shows version update notifications and current task
|
|
1407
1416
|
|
|
1408
1417
|
# Current CLI version (embedded at install time)
|
|
1409
|
-
CLI_VERSION="${
|
|
1418
|
+
CLI_VERSION="${ge}"
|
|
1410
1419
|
|
|
1411
1420
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1412
1421
|
read -r json
|
|
@@ -1457,14 +1466,14 @@ fi
|
|
|
1457
1466
|
|
|
1458
1467
|
# Default: show prjct branding
|
|
1459
1468
|
echo "\u26A1 prjct"
|
|
1460
|
-
`;await
|
|
1469
|
+
`;await rE.writeFile(s,n,{mode:493});let o={};if(await E(t))try{o=await De(t)??{}}catch{}return o.statusLine={type:"command",command:s},await le(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(ie.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(ie.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(ie.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(ie.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(ie.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(ie.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(ie.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(` ${ie.bold.cyan("prjct")}${ie.magenta("/")}${ie.green("cli")} ${ie.dim.white(`v${ge} installed`)}`),console.log(""),console.log(` ${ie.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ie.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ie.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ie.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(ie.bold.cyan("\u{1F680} Quick Start")),console.log(ie.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(` ${ie.bold("1.")} Initialize your project:`),console.log(` ${ie.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ie.bold("2.")} Start your first task:`),console.log(` ${ie.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ie.bold("3.")} Ship & celebrate:`),console.log(` ${ie.green('prjct ship "user login"')}`),console.log(""),console.log(ie.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(` ${ie.dim("Documentation:")} ${ie.cyan("https://prjct.app")}`),console.log(` ${ie.dim("Report issues:")} ${ie.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ie.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import Th from"node:path";var aE,cE,wa,Eh=S(()=>{"use strict";K();B();aE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],cE=`# Changelog
|
|
1461
1470
|
|
|
1462
1471
|
All notable changes to this project will be documented in this file.
|
|
1463
1472
|
|
|
1464
1473
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1465
1474
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1466
|
-
`,
|
|
1467
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await
|
|
1475
|
+
`,wa=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of aE){let n=Th.join(this.projectPath,s);if(await E(n)){let o=await $e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Th.join(this.projectPath,e);return await Tt(t,`${cE}
|
|
1476
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await $e(t.filePath),n=e.date||Yd(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Tt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
|
|
1468
1477
|
${a}`}return`${e.trimEnd()}
|
|
1469
1478
|
|
|
1470
1479
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1474,31 +1483,31 @@ ${a}`}return`${n}
|
|
|
1474
1483
|
|
|
1475
1484
|
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1476
1485
|
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1477
|
-
`)}}});import
|
|
1478
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(
|
|
1479
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1480
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
1481
|
-
${
|
|
1486
|
+
`)}}});import Tr from"node:path";function Ch(r){return/^\d+\.\d+\.\d+/.test(r)}function Er(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function lE(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function uE(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function dE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var ka,Ph=S(()=>{"use strict";Ge();B();ka=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Tr.join(this.projectPath,"package.json"),t=await De(e,null);return t?.version?{current:t.version,next:Er(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Tr.join(this.projectPath,"Cargo.toml"),t=await $e(e,"");if(!t)return null;let s=lE(t);return s?{current:s,next:Er(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Tr.join(this.projectPath,"pyproject.toml"),t=await $e(e,"");if(!t)return null;let s=uE(t);return s?{current:s,next:Er(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ys(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Tr.join(this.projectPath,e[0]),s=await $e(t,"");if(!s)return null;let n=dE(s);return n?{current:n,next:Er(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Tr.join(this.projectPath,e),s=await $e(t,"");if(!s)return null;let n=s.trim();return Ch(n)?{current:n,next:Er(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await L("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1487
|
+
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(Ch(n))return{current:n,next:Er(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Tr.join(this.projectPath,"VERSION");return await Tt(e,`0.1.0
|
|
1488
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await on("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Tt(e.file,`${e.next}
|
|
1489
|
+
`);break}}async writeJsonVersion(e,t){let s=await De(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Tt(e,n)}async writeXmlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Tt(e,n)}};l(Ch,"isSemver");l(Er,"bumpPatch");l(lE,"parseTomlVersion");l(uE,"parsePyprojectVersion");l(dE,"parseCsprojVersion")});import Ht from"chalk";async function os(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ne.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
|
|
1490
|
+
${Ht.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,v=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`gate passed (${v})`)}`)}catch(g){return console.log(`${Ht.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
|
|
1482
1491
|
${k(g)}
|
|
1483
1492
|
`,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
|
|
1484
|
-
${
|
|
1485
|
-
${
|
|
1493
|
+
${Ht.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
|
|
1494
|
+
${Ht.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`(${w})`)}`)}catch(m){console.log(`${Ht.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
|
|
1486
1495
|
${k(m)}
|
|
1487
1496
|
`}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
|
|
1488
|
-
${
|
|
1497
|
+
${Ht.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await L(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Ht.green("\u2713")} ${Ht.dim(`step passed (${w})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Ht.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
|
|
1489
1498
|
${k(m)}
|
|
1490
|
-
`,n}}return n}var
|
|
1499
|
+
`,n}}return n}var Yu=S(()=>{"use strict";ra();H();Ge();l(os,"executeWorkflowRules")});var Cr,Qu=S(()=>{"use strict";pi();Ee();Eh();Oi();Ph();pn();Pt();H();K();Ge();Cn();ar();Ve();Yu();Ut();Cr=class extends xe{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let c=await os(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new ka(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new wa(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await dt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:b()}),await yt.learnDecision(o,"commit_footer","prjct","ship"),await yt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await os(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),v=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Rs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=Li("ship",!0),P=U(Pe(`Shipped: ${i}`,`Version: ${d}`),te("Results",ze([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),v.length>0?te("Agent Instructions",ze(v)):null,ye(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(P)}else f.done(`v${d} shipped`),Ft("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await L("git add .");let s=`feat: ${e}
|
|
1491
1500
|
|
|
1492
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1501
|
+
Generated with [p/](https://www.prjct.app/)`;return await on("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return I(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await L("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return I(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as Eo}from"node:child_process";import Sa from"node:fs/promises";import To from"node:path";import Pr from"chalk";function xh(){try{return!!Eo("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function Rh(){try{let e=Eo("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}var xr,Zu=S(()=>{"use strict";Ps();Vo();Te();fu();fl();H();Ve();ot();Ut();l(xh,"isHomebrewInstall");l(Rh,"getCurrentVersion");xr=class extends xe{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await Kr.updateVersion(ge)}catch{}try{await new Zi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Rh();if(e)return xh()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(xh()){try{Eo("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Eo("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Eo("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Rh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(k(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await Ai(i),c=await ji(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Cs().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Cs().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Cs().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(rt(),Mt)),o=await n(),i=To.join(Dt("node:os").homedir());if(o.gemini.installed){let a=To.join(i,".gemini","GEMINI.md");try{let c=await Sa.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=To.join(To.dirname(Dt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await Sa.readFile(p,"utf-8"),g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),v=c.substring(c.indexOf(d)+d.length),h=w+g+v,P="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(P)&&h.includes(T)){let $=h.substring(0,h.indexOf(P)),M=h.substring(h.indexOf(T)+T.length);h=`${($+M).replace(/\n{3,}/g,`
|
|
1493
1502
|
|
|
1494
1503
|
`).trim()}
|
|
1495
|
-
`}await
|
|
1496
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1497
|
-
${
|
|
1498
|
-
`),{success:!0,message:"No data"};let a=
|
|
1499
|
-
${
|
|
1500
|
-
${
|
|
1501
|
-
${
|
|
1504
|
+
`}await Sa.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(fs(),gs));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Pr.green("\u2713"):c?Pr.red("\u2717"):Pr.yellow("\u26A0");console.log(` ${u} ${Pr.bold(i)}`);for(let d of a.details)console.log(` ${Pr.dim(d)}`);for(let d of a.errors)console.log(` ${Pr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
|
|
1505
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=To.join(j.getGlobalBasePath(),"projects");try{return(await Sa.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Fe from"chalk";var Rr,ed=S(()=>{"use strict";Vl();Ee();ro();yl();H();Ve();ur();Ut();Rr=class extends xe{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await _.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await jt.getAll(n);if(i.length===0)return console.log(`
|
|
1506
|
+
${Fe.dim("No velocity data yet.")}`),console.log(`${Fe.dim("Complete tasks with estimates to build velocity history.")}
|
|
1507
|
+
`),{success:!0,message:"No data"};let a=Gi(i,o);await Ii.saveMetrics(n,a),console.log(`
|
|
1508
|
+
${Fe.cyan("Sprint Velocity")} ${Fe.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Fe.green:p.estimationAccuracy>=60?Fe.yellow:Fe.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Fe.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Fe.green("\u2191"):a.velocityTrend==="declining"?Fe.red("\u2193"):Fe.dim("\u2192");if(console.log(` Average: ${Fe.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Fe.bold(`${a.estimationAccuracy}%`)} ${Fe.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1509
|
+
${Fe.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Fe.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Fe.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Fe.green("\u2713")} ${p.category} tasks estimated within ${Fe.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=uf(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1510
|
+
${Fe.dim("Projection:")}`),console.log(` Backlog: ${Fe.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Fe.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await _.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...qs,...s.velocity}}catch{}return qs}}});var jh,Mn,Ah,Ih,Dh,mE,td=S(()=>{"use strict";so();K();ur();jh=l(r=>Vc.includes(r),"isValidPoint"),Mn=l(r=>qc[r],"pointsToMinutes"),Ah=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"),Ih=l(r=>{let e=Mn(r);return`${Ah(e.min)}\u2013${Ah(e.max)}`},"pointsToTimeRange"),Dh=l(async(r,e)=>{let s=(await jt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+_t(c.actualDuration),0)/s.length;return{points:mE(o),basedOn:s.length}},"suggestFromHistory"),mE=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Vc){let n=Math.abs(qc[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import sd from"node:fs/promises";import pE from"node:os";import ba from"node:path";var nd,rd,$h=S(()=>{"use strict";H();B();nd=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=ba.join(pE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await sd.mkdir(this.commandsPath,{recursive:!0});let s=ba.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await sd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=ba.join(this.commandsPath,`${e}.md`);return await sd.unlink(t),{success:!0}}catch(t){return I(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=ba.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
|
|
1502
1511
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1503
1512
|
---
|
|
1504
1513
|
|
|
@@ -1534,61 +1543,61 @@ Suggest relevant actions based on the workflow results:
|
|
|
1534
1543
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1535
1544
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1536
1545
|
- Run again: \`p. ${e}\`
|
|
1537
|
-
`}},
|
|
1538
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var
|
|
1539
|
-
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${
|
|
1546
|
+
`}},rd=new nd});function gE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function fE(r,e){let t=pr.detectTaskType(e),s=await Dh(r,t);if(s){let a=Mn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=pr.estimateComplexity(e),o=gE(n.level),i=Mn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var od,Mh=S(()=>{"use strict";td();Su();l(gE,"complexityToPoints");l(fE,"estimateTaskForStart");od=fE});async function va(r){try{let{stdout:e}=await L("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function _h(r,e=20){try{let{stdout:t}=await L("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
|
|
1547
|
+
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var id=S(()=>{"use strict";Ge();l(va,"getGitBranch");l(_h,"getModifiedFiles")});var Ar,hE,ad,Qs,Oh=S(()=>{"use strict";Te();se();K();id();Ar="session-snapshot",hE=30,ad=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await va(t),o=await _h(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return x.setDoc(e,Ar,u),u}getSnapshot(e){try{return x.getDoc(e,Ar)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,Ar)}catch{}}async listAllSnapshots(){let e=await j.listProjects(),t=[];for(let s of e)try{if(!x.exists(s))continue;let n=x.getDoc(s,Ar);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=hE){let t=await j.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,Ar);i&&new Date(i.timestamp).getTime()<s&&(x.deleteDoc(o,Ar),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${Et(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${Et(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
1548
|
+
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${Et(t*1e3)} of work`),s.join(" ")}},Qs=new ad});var cd,Co,Nh=S(()=>{"use strict";se();cd=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1540
1549
|
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=x.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;x.run(e,`UPDATE context_feedback
|
|
1541
1550
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1542
1551
|
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=x.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let n=x.query(e,`SELECT * FROM context_feedback
|
|
1543
1552
|
WHERE actual_files IS NOT NULL
|
|
1544
|
-
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),
|
|
1553
|
+
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),v=new Set(JSON.parse(c.actual_files));for(let h of v){let P=i.get(h)??0;i.set(h,P+g)}for(let h of w)if(!v.has(h)){let P=i.get(h)??0;i.set(h,P-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Co=new cd});import Ta from"node:fs/promises";import Lh from"node:path";function yE(){return{version:jr,lastUpdated:"",checksums:{}}}var jr,ld,Fh,Uh=S(()=>{"use strict";Te();H();K();bn();se();jr="1.0.0";l(yE,"getDefaultChecksums");ld=class{static{l(this,"IndexStorage")}getIndexPath(e){return Lh.join(j.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Ta.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==jr?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 yE()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Ta.readFile(e);return Bm(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:jr,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{x.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await Ta.readdir(t);await Promise.all(s.map(n=>Ta.unlink(Lh.join(t,n))))}catch(s){if(!I(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==jr?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===jr)return t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==jr?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=x.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Fh=new ld});function Hh(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(p=>p.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}function Wh(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=Fh.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}function ud(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Hh(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1545
1554
|
|
|
1546
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let
|
|
1555
|
+
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let v=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(p.some(h=>v.includes(h))){m=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
|
|
1547
1556
|
`)}).join(`
|
|
1548
1557
|
|
|
1549
|
-
`)}`}function
|
|
1550
|
-
`)}var
|
|
1551
|
-
`)}function
|
|
1552
|
-
`)}catch{return null}}function
|
|
1553
|
-
`)}async function
|
|
1558
|
+
`)}`}function dd(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
|
|
1559
|
+
`)}var md=S(()=>{"use strict";Uh();l(Hh,"rankPatterns");l(Wh,"detectDomainsFromTask");l(ud,"buildPatternBriefing");l(dd,"buildContextContract")});import wE from"node:fs/promises";import kE from"node:path";function bE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
|
|
1560
|
+
`)}function vE(r){try{let{prjctDb:e}=(se(),vt(zo)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
|
|
1561
|
+
`)}catch{return null}}function Gh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function TE(r){try{let e=kE.join(r,"analysis","repo-analysis.json"),t=await wE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return I(e),null}}function EE(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,w)=>{let v=g.map($=>` ${$.enabled?w:"o"} #${$.id} ${$.action}`),h=[m,...v],T=Math.max(...h.map($=>$.length))+2;u.push(`+${"-".repeat(T)}+`);for(let $ of h)u.push(`| ${$.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
|
|
1562
|
+
`)}async function CE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
|
|
1554
1563
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
|
|
1555
1564
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
|
|
1556
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function
|
|
1557
|
-
${
|
|
1558
|
-
${
|
|
1565
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function PE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var SE,Ir,pd=S(()=>{"use strict";mu();td();Ee();Te();$h();Nt();rr();Mh();id();Oh();er();Nh();vu();Kt();Pt();ra();wo();H();K();ho();Cn();ar();Ve();Cu();Yu();ur();Ut();md();md();SE=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Ir=class extends xe{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await os(o,"task","before",{projectPath:t,skipRules:s.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e)&&(a=e),s.md){try{await Zt.ensureReady()}catch(ve){return At("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(ve)}),{success:!1,error:k(ve)}}let m=await od(o,c),g=await F.getCurrentTask(o),w=await F.getActiveTasks(o),{worktreeService:v}=await Promise.resolve().then(()=>(Jr(),Go)),h=await v.detect(t);if(h){let ve=w.find(ht=>ht.worktreePath===h.path);if(ve)return At("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:ve.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:ve}}let P;if(g&&!h){let ve=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let ht=await v.create(t,ve);await v.setup(ht.path,t),P=ht.path,Ni("info",`Parallel session created: \`${ht.branch}\` at \`${ht.path}\``)}catch{return At("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(P||h){let ve=Q();await F.startTaskInWorkspace(o,{id:Q(),description:c,sessionId:Q(),workspaceId:ve,worktreePath:P||h.path,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes},ve)}else await F.startTask(o,{id:Q(),description:c,sessionId:Q(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let $=j.getGlobalProjectPath(o),M=ql(c),y;try{y=Co.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[G,Y,,We]=await Promise.all([va(t),ct.getActive(o).catch(()=>null),TE($),As(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=null;try{let ve=Qs.getSnapshot(o);ve&&(me=Qs.formatContinuityContext(ve),Qs.clearSnapshot(o))}catch{}let Me=null;if(Y?.analyzedAt){let ve=new Date(Y.analyzedAt),ht=Math.floor((Date.now()-ve.getTime())/(1e3*60*60*24));ht>7&&(Me=Ni("warn",`Analysis is ${ht} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Y||(Me=Ni("info","No project analysis found. Run `p. sync` for better context targeting."));let $s=null;if(y&&y.size>0){let ve=[...y.entries()].filter(([,ht])=>ht>.3).sort((ht,La)=>La[1]-ht[1]).slice(0,5);ve.length>0&&($s=`### Previously Useful Files
|
|
1566
|
+
${ve.map(([La])=>`\`${La}\``).join(", ")}`)}let Ia=Wh(c,o),Da=uo({description:c,branch:G,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:Ia}),$a=_g(We.files.map(ve=>({path:ve.path,description:ve.reasons.join(", ")}))),Ma=We.files.map(ve=>ve.path),_a=ud(Y,Ma),Oa=dd(We.files,Y),Na=ye([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ae=bE(),My=vE(o);console.log(U(me,Me,Da,Oa,$a,$s,_a,My,ae,Na));try{let ve=await F.getCurrentTask(o);ve&&Co.recordSuggestions(o,ve.id,M,We.files.map(ht=>ht.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:b()}),await os(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Qi.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await od(o,c);return await F.startTask(o,{id:Q(),description:c,sessionId:Q(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),po("working"),Ft("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:b()}),await os(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:jh,pointsToMinutes:Mn,pointsToTimeRange:Ih,storeEstimate:l(async m=>{let g=Mn(m);return await F.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?Ss(new Date(i.startedAt)):void 0,c=uo({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?Mg(u,d):"",m=ye([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?At("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(Jr(),Go)),i=await o.detect(e),a=await F.getCurrentTask(n),c;if(i){let G=(await F.getActiveTasks(n)).find(Y=>Y.worktreePath===i.path);G&&(a=G,c=G.workspaceId)}if(!a)return t.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await os(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,p="",m=0;if(a.startedAt){let D=new Date(a.startedAt);p=Ss(D),m=Math.round((Date.now()-D.getTime())/6e4)}let g=a.estimatedMinutes,w=a.estimatedPoints,v=a.type||"feature",h=a.linearId;try{await jt.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:b(),estimatedDuration:g?Gh(g):"0m",actualDuration:p||"0m",variance:g?PE(m-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[v,h].filter(Boolean)})}catch{}let P="";if(w&&g){let D=m-g,G=g>0?Math.round((m-g)/g*100):0,Y=D>=0?"+":"";P=` | est: ${w}pt (${Gh(g)}) \u2192 ${Y}${G}%`}let T=[],$=null,M=null;try{if(T=await CE(e,a.startedAt),T.length>0){Co.completeFeedback(n,a.id,T);let D=Co.getFeedback(n,a.id);D&&($=D.precision,M=D.recall)}}catch{}c?await F.completeTaskInWorkspace(n,c,t.feedback):await F.completeTask(n,t.feedback);try{Qs.clearSnapshot(n)}catch{}let y=a.linearId,R=y!=null?await zs("linear",us()).catch(()=>!1):!1;if(t.md){let D=p?` (${p})`:"",G=null;if(T.length>0){let me=T.slice(0,20).map(Me=>`\`${Me}\``);G=`### Files Modified (${T.length})
|
|
1567
|
+
${me.join(", ")}`}let Y=null;if($!==null&&M!==null){let me=Math.round($*100),Me=Math.round(M*100);Y=`### Context Accuracy
|
|
1559
1568
|
| Metric | Value |
|
|
1560
1569
|
|--------|-------|
|
|
1561
|
-
| Precision | ${
|
|
1562
|
-
| Recall | ${
|
|
1563
|
-
Research is available. Create your implementation plan next.`):O="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(Te("Completed",`${a}${j}`),yt({Duration:c||"unknown",...w?{Variance:w.replace(" | ","")}:{}}),y,R,O,fe([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let j=c?` (${c}${w})`:"";T&&$?f.done(`${a}${j} \u2192 Linear linked (update via MCP)`):f.done(`${a}${j}`),ao("completed"),Nt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:p,estimatedMinutes:d,actualMinutes:u,timestamp:v()}),await ns(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Ee.getActiveTasks(n);if(o.length===0)return t.md?Ot("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(U(Z("Queue",`${o.length} task${o.length!==1?"s":""}`),Ge(i,!0),fe([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Nt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?Ot("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=ws(new Date(i.startedAt))),await L.pauseTask(o,e);try{await Ks.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(U(Te("Task Paused",`**Paused:** ${i.description}`),yt({Reason:e||void 0,"Duration worked":a||void 0}),fe([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),ao("paused"),Nt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?Ot("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(Te("Task Resumed",`**Resumed:** ${a.description}`),fe([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),ao("working"),Nt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?Ot("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of ZT){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=mt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=mt.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=_e.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Te("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=mt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=mt.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=_e.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Te("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=mt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=mt.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=_e.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Te("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!_e.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(Te("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=_e.resetRules(e);return t.md?console.log(U(Te("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=_e.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return _e.updateRule(t,o,{enabled:!1}),s.md?console.log(U(Te("Rule Disabled",`#${o} [${c.type}] ${c.action}`),fe([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=_e.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return _e.updateRule(t,c.id,{enabled:!1}),s.md?console.log(U(Te("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(U(Z("Multiple matches",`${a.length} rules match "${n}"`),Ge(c),fe(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(U(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",Ge(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Z("Natural Language (EN/ES)",Ge(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=_e.getRulesForCommand(t,e):o=_e.getAllRules(t),o.length===0)return s.md?console.log(U(Z("Workflow Rules","No rules configured"),fe([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(nE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(Z(c,u),a.length>0?hg(a.join(`
|
|
1564
|
-
|
|
1565
|
-
`),""):null,
|
|
1566
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=
|
|
1567
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1568
|
-
`)))}console.log(U(...i,
|
|
1570
|
+
| Precision | ${me}% of suggested files were used |
|
|
1571
|
+
| Recall | ${Me}% of modified files were suggested |`}let We=null;try{let{prjctDb:me}=(se(),vt(zo)),Me=me.getDoc(n,"rpi:current:research"),$s=me.getDoc(n,"rpi:current:plan");Me?$s||(We=`### RPI Phase: Plan Ready
|
|
1572
|
+
Research is available. Create your implementation plan next.`):We="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(Pe("Completed",`${d}${D}`),kt({Duration:p||"unknown",...P?{Variance:P.replace(" | ","")}:{}}),G,Y,We,ye([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=p?` (${p}${P})`:"";y&&R?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),po("completed"),Ft("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:p,estimatedPoints:w,estimatedMinutes:g,actualMinutes:m,timestamp:b()}),await os(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:p}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await _.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ke.getActiveTasks(n);if(o.length===0)return t.md?At("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),ze(i,!0),ye([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Ft("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=Ss(new Date(i.startedAt))),await F.pauseTask(o,e);try{await Qs.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(U(Pe("Task Paused",`**Paused:** ${i.description}`),kt({Reason:e||void 0,"Duration worked":a||void 0}),ye([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),po("paused"),Ft("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:b()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return s.md?At("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(s.md?console.log(U(Pe("Task Resumed",`**Resumed:** ${a.description}`),ye([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),po("working"),Ft("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?At("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of SE){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=gt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=gt.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ne.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Pe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=gt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=gt.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=Ne.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Pe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=gt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=gt.getAllWorkflows(t).map(h=>h.name).join(", "),v=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${v}`):f.warn(v),{success:!1,error:v}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=Ne.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(Pe("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ne.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(Pe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ne.resetRules(e);return t.md?console.log(U(Pe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=Ne.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return Ne.updateRule(t,o,{enabled:!1}),s.md?console.log(U(Pe("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ye([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ne.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Ne.updateRule(t,c.id,{enabled:!1}),s.md?console.log(U(Pe("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(U(te("Multiple matches",`${a.length} rules match "${n}"`),ze(c),ye(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",ze(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),te("Natural Language (EN/ES)",ze(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=Ne.getRulesForCommand(t,e):o=Ne.getAllRules(t),o.length===0)return s.md?console.log(U(te("Workflow Rules","No rules configured"),ye([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(EE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?$g(a.join(`
|
|
1573
|
+
|
|
1574
|
+
`),""):null,ye([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let n=Ne.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await oa(t),i=0,a=[],c=Ne.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=Ne.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=Ne.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(U(Pe("Workflow Initialized",`Added ${a.length} default ship rules`),ze(a),ye([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!gt.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(gt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(gt.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=gt.createWorkflow(t,{name:i,description:a}),d=await rd.generateWorkflowTemplate(i,a);if(!d.success){gt.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(U(Pe("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),ye([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1575
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=gt.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
|
|
1576
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
|
|
1577
|
+
`)))}console.log(U(...i,ye([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
|
|
1569
1578
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1570
|
-
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!mt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Gu.deleteWorkflowTemplate(n),s.md?console.log(U(Te("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=mt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ns(o,i,"before",{projectPath:t});if(!c.success){if(s.md)Ot("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await ns(o,i,"after",{projectPath:t}),s.md?console.log(U(Te(`Workflow: ${i}`,a.description||""),fe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await Ks.cleanup();return t.md?console.log(Te("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Ks.listAllSnapshots();if(s.length===0)return t.md?Ot("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=vt(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(U(Z("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Ge(n),fe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=vt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?Ot("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(Z("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(Z("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),yt({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(eE,"buildEfficiencySection");l(tE,"buildRpiSection");l(Ch,"formatMinutesToDuration");l(sE,"loadRepoAnalysis");l(nE,"buildFlowDiagram");l(rE,"getFilesModifiedSinceTaskStart");l(oE,"formatVariance")});var Xs,iW,Qu=S(()=>{"use strict";ea();hu();sa();Ru();Au();Zi();Mu();Ou();Nu();Lu();Yu();Xs=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Cr,this.planning=new Pn,this.shipping=new kr,this.analytics=new dr,this.performanceCmds=new gr,this.maintenance=new pr,this.analysis=new An,this.setupCmds=new hr,this.updateCmds=new br,this.velocityCmds=new vr,this.contextCmds=new qs,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},iW=new Xs});var bo,Pr,Zu=S(()=>{"use strict";bo={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}},Pr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var jh={};we(jh,{UninstallCommands:()=>To,uninstall:()=>Ah});import{execSync as fa}from"node:child_process";import At from"node:fs/promises";import iE from"node:os";import As from"node:path";import aE from"node:readline";import Re from"chalk";async function xh(r){let e=0;try{let t=await At.readdir(r,{withFileTypes:!0});for(let s of t){let n=As.join(r,s.name);if(s.isDirectory())e+=await xh(n);else try{let o=await At.stat(n);e+=o.size}catch{}}}catch{}return e}function Ph(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function cE(r){try{return(await At.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function lE(){let r={homebrew:!1,npm:!1};try{fa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function uE(){let r=[],e=Mm(),t=D.getGlobalBasePath(),s=await E(t),n=s?await cE(As.join(t,"projects")):0,o=s?await xh(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=As.join(e.claude.config,"CLAUDE.md"),a=await E(i),c=!1;if(a)try{let T=await At.readFile(i,"utf-8");c=T.includes(ha)&&T.includes(vo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await E(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=As.join(e.claude.config,"prjct-statusline.sh"),m=await E(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await E(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=As.join(e.gemini.config,"GEMINI.md"),h=await E(b),P=!1;if(h)try{let T=await At.readFile(b,"utf-8");P=T.includes(ha)&&T.includes(vo)}catch{}return h&&P&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function dE(r){try{let e=await At.readFile(r,"utf-8");if(!e.includes(ha)||!e.includes(vo))return!1;let t=e.indexOf(ha),s=e.indexOf(vo)+vo.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1571
|
-
|
|
1572
|
-
`).trim(),!n||n.trim().length===0?await
|
|
1573
|
-
`,"utf-8"),!0}catch{return!1}}async function
|
|
1574
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(
|
|
1575
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1576
|
-
${a.length} errors:`));for(let c of a)console.log(
|
|
1577
|
-
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await
|
|
1579
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!gt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await rd.deleteWorkflowTemplate(n),s.md?console.log(U(Pe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=gt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await os(o,i,"before",{projectPath:t});if(!c.success){if(s.md)At("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await os(o,i,"after",{projectPath:t}),s.md?console.log(U(Pe(`Workflow: ${i}`,a.description||""),ye([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await Qs.cleanup();return t.md?console.log(Pe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Qs.listAllSnapshots();if(s.length===0)return t.md?At("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=Et(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(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),ze(n),ye([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=Et(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await _.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?At("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await F.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),kt({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(bE,"buildEfficiencySection");l(vE,"buildRpiSection");l(Gh,"formatMinutesToDuration");l(TE,"loadRepoAnalysis");l(EE,"buildFlowDiagram");l(CE,"getFilesModifiedSinceTaskStart");l(PE,"formatVariance")});var Zs,JG,gd=S(()=>{"use strict";la();ju();da();Wu();Bu();Vu();ca();Xu();Qu();Zu();ed();pd();Zs=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ir,this.planning=new An,this.shipping=new Cr,this.analytics=new fr,this.performanceCmds=new Sr,this.maintenance=new yr,this.analysis=new Dn,this.setupCmds=new vr,this.updateCmds=new xr,this.velocityCmds=new Rr,this.contextCmds=new Xs,this.parallelCmds=new $n,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},JG=new Zs});var Po,Dr,fd=S(()=>{"use strict";Po={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}},Dr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Jh={};we(Jh,{UninstallCommands:()=>Ro,uninstall:()=>zh});import{execSync as Ea}from"node:child_process";import It from"node:fs/promises";import xE from"node:os";import Is from"node:path";import RE from"node:readline";import je from"chalk";async function Vh(r){let e=0;try{let t=await It.readdir(r,{withFileTypes:!0});for(let s of t){let n=Is.join(r,s.name);if(s.isDirectory())e+=await Vh(n);else try{let o=await It.stat(n);e+=o.size}catch{}}}catch{}return e}function Bh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function AE(r){try{return(await It.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function jE(){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}async function IE(){let r=[],e=Ym(),t=j.getGlobalBasePath(),s=await E(t),n=s?await AE(Is.join(t,"projects")):0,o=s?await Vh(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Is.join(e.claude.config,"CLAUDE.md"),a=await E(i),c=!1;if(a)try{let T=await It.readFile(i,"utf-8");c=T.includes(Ca)&&T.includes(xo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await E(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=Is.join(e.claude.config,"prjct-statusline.sh"),m=await E(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await E(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let v=Is.join(e.gemini.config,"GEMINI.md"),h=await E(v),P=!1;if(h)try{let T=await It.readFile(v,"utf-8");P=T.includes(Ca)&&T.includes(xo)}catch{}return h&&P&&r.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function DE(r){try{let e=await It.readFile(r,"utf-8");if(!e.includes(Ca)||!e.includes(xo))return!1;let t=e.indexOf(Ca),s=e.indexOf(xo)+xo.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1580
|
+
|
|
1581
|
+
`).trim(),!n||n.trim().length===0?await It.unlink(r):await It.writeFile(r,`${n}
|
|
1582
|
+
`,"utf-8"),!0}catch{return!1}}async function $E(){let r=xE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Is.join(r,`.prjct-backup-${e}`);try{await It.mkdir(t,{recursive:!0});let s=j.getGlobalBasePath();return await E(s)&&await qh(s,Is.join(t,".prjct-cli")),t}catch{return null}}async function qh(r,e){await It.mkdir(e,{recursive:!0});let t=await It.readdir(r,{withFileTypes:!0});for(let s of t){let n=Is.join(r,s.name),o=Is.join(e,s.name);s.isDirectory()?await qh(n,o):await It.copyFile(n,o)}}async function ME(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await DE(o.path)&&s.push(o.path):o.type==="directory"?(await It.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await It.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Cs().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ea(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||Ea("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function _E(r){let e=RE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function zh(r={},e=process.cwd()){let t=await IE(),s=jE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(je.yellow(`
|
|
1583
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(je.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(je.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=j.getDisplayPath(c.path),d="";c.type==="section"?d=je.dim("(section only)"):c.size&&(d=je.dim(`(${Bh(c.size)})`)),console.log(` ${je.cyan(u.padEnd(35))} ${d}`),console.log(` ${je.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${je.cyan("Homebrew".padEnd(35))} ${je.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${je.cyan("npm global".padEnd(35))} ${je.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(je.dim(` Total size: ${Bh(o)}`)),console.log("")),r.dryRun)return console.log(je.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(je.blue("Creating backup..."));let c=await $E();c?(console.log(je.green(`Backup created: ${j.getDisplayPath(c)}`)),console.log("")):console.log(je.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(je.yellow('Type "uninstall" to confirm:')),!await _E("> ")))return console.log(je.yellow(`
|
|
1584
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(je.blue("Removing prjct..."));let{deleted:i,errors:a}=await ME(t,s,r);if(console.log(""),i.length>0&&console.log(je.green(`Removed ${i.length} items`)),a.length>0){console.log(je.yellow(`
|
|
1585
|
+
${a.length} errors:`));for(let c of a)console.log(je.red(` - ${c}`))}return console.log(""),console.log(je.green("prjct has been uninstalled.")),console.log(je.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Ca,xo,Ro,hd=S(()=>{"use strict";Ps();Te();H();B();Ut();Ca="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",xo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(Vh,"getDirectorySize");l(Bh,"formatSize");l(AE,"countDirectoryItems");l(jE,"detectInstallation");l(IE,"gatherUninstallItems");l(DE,"removePrjctSection");l($E,"createBackup");l(qh,"copyDirectory");l(ME,"performUninstall");l(_E,"promptConfirmation");l(zh,"uninstall");Ro=class extends xe{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return zh(e,t)}}});function WE(){for(let[r,e]of Object.entries(Po))W.registerCategory(r,e)}function GE(){if(W.has("work"))return;WE();let r=l(e=>Dr.find(t=>t.name===e),"getMeta");W.registerMethod("task",en,"now",r("task")),W.registerMethod("done",en,"done",r("done")),W.registerMethod("next",en,"next",r("next")),W.registerMethod("pause",en,"pause",r("pause")),W.registerMethod("resume",en,"resume",r("resume")),W.registerMethod("workflow",en,"workflow",r("workflow")),W.registerMethod("tokens",en,"tokens",r("tokens")),W.registerMethod("sessions",en,"sessions",r("sessions")),W.registerMethod("init",Pa,"init",r("init")),W.registerMethod("bug",Pa,"bug",r("bug")),W.registerMethod("idea",Pa,"idea",r("idea")),W.registerMethod("spec",Pa,"spec",r("spec")),W.registerMethod("ship",OE,"ship",r("ship")),W.registerMethod("dash",Kh,"dash",r("dash")),W.registerMethod("help",Kh,"help",r("help")),W.registerMethod("perf",NE,"perf",r("perf")),W.registerMethod("velocity",FE,"velocity",r("velocity")),W.registerMethod("cleanup",tn,"cleanup",r("cleanup")),W.registerMethod("cleanup-projects",tn,"cleanupProjects",r("cleanup-projects")),W.registerMethod("design",tn,"design",r("design")),W.registerMethod("recover",tn,"recover",r("recover")),W.registerMethod("undo",tn,"undo",r("undo")),W.registerMethod("redo",tn,"redo",r("redo")),W.registerMethod("history",tn,"history",r("history")),W.registerMethod("enrich",tn,"enrich",r("enrich")),W.registerMethod("analyze",$r,"analyze",r("analyze")),W.registerMethod("sync",$r,"sync",r("sync")),W.registerMethod("stats",$r,"stats",r("stats")),W.registerMethod("status",$r,"status",r("status")),W.registerMethod("seal",$r,"seal",r("seal")),W.registerMethod("verify",$r,"verify",r("verify")),W.registerMethod("start",Ao,"start",r("start")),W.registerMethod("setup",Ao,"setup",r("setup")),W.registerMethod("login",Ao,"login",r("login")),W.registerMethod("logout",Ao,"logout",r("logout")),W.registerMethod("auth",Ao,"auth",r("auth")),W.registerMethod("uninstall",UE,"uninstall",r("uninstall")),W.registerMethod("update",HE,"update",r("update")),W.registerMethod("context",LE,"context",r("context")),W.registerMethod("parallel",yd,"parallel",r("parallel")),W.registerMethod("worktree",yd,"parallel",r("worktree")),W.registerMethod("conductor",yd,"parallel",r("conductor"))}var en,Pa,OE,Kh,NE,tn,$r,Ao,LE,FE,yd,UE,HE,wd=S(()=>{"use strict";la();ju();fd();da();Wu();Bu();Vu();ca();bo();Xu();Qu();hd();Zu();ed();pd();en=new Ir,Pa=new An,OE=new Cr,Kh=new fr,NE=new Sr,tn=new yr,$r=new Dn,Ao=new vr,LE=new Xs,FE=new Rr,yd=new $n,UE=new Ro,HE=new xr;l(WE,"registerCategories");l(GE,"registerAllCommands");GE()});var Qh={};we(Qh,{shutdown:()=>_n,startDaemon:()=>qE});import Ke from"node:fs";import{createServer as BE}from"node:net";async function qE(r){let e=_e.socket(),t=_e.pid(),s=_e.runDir();if(Ke.mkdirSync(s,{recursive:!0}),Ke.existsSync(t)){let i=parseInt(Ke.readFileSync(t,"utf-8").trim(),10);YE(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ke.unlinkSync(t)}Ke.existsSync(e)&&Ke.unlinkSync(e),eC();let n=QE(),o=null;if(n)try{o=Ke.statSync(n).mtimeMs}catch{}if(Ie={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Fa,idleTimer:null,entryPath:n,entryMtime:o},be=new Zs,Mr=BE(i=>zE(i)),Mr.listen(e,()=>{Ke.chmodSync(e,384),Ke.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Xh()}),Mr.on("error",i=>{console.error("Daemon socket error:",i.message),_n(1)}),!r.noHttp)try{let i=process.cwd(),a=await _.getProjectId(i);if(a){let c=r.port||ei;jo=Zo({port:c,projectId:a,projectPath:i,enableLogging:!1}),await jo.start()}}catch{}if(process.on("SIGTERM",()=>_n(0)),process.on("SIGINT",()=>_n(0)),process.on("SIGHUP",()=>{be=new Zs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function zE(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Ua){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(nn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1586
|
+
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await JE(o);r.write(nn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(nn(i))}}}),r.on("error",()=>{})}async function JE(r){if(!Ie||!be)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Xh(),Ie.commandsServed++,Ie.lastActivity=Date.now(),Ie.commandsServed%VE===0&&N.checkpointAll(),Yh()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),_n(0)},200)),r.command==="daemon")return XE(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await KE(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1578
1587
|
`)||o.message||void 0,stderr:t.join(`
|
|
1579
|
-
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function
|
|
1588
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function KE(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return be.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return be.status(r.cwd,{json:t.json===!0,md:s});case"stats":return be.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return be.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return be.seal(r.cwd,{json:t.json===!0});case"rollback":return be.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return be.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return be.task(e,r.cwd,{md:s});case"done":return be.done(r.cwd,{md:s});case"next":return be.next(r.cwd,{md:s});case"pause":return be.pause(e||"",r.cwd,{md:s});case"resume":return be.resume(e,r.cwd,{md:s});case"bug":return be.bug(e||"",r.cwd,{md:s});case"idea":return be.idea(e||"",r.cwd,{md:s});case"ship":return be.ship(e,r.cwd,{md:s});case"dash":return be.dash(e||"default",r.cwd,{md:s});case"workflow":return be.workflowPrefs(e,r.cwd,{md:s});case"sessions":return be.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return be.design(e||"",t,r.cwd);case"analysis-payload":return be.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return be.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return be.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return be.analyze(t,r.cwd);case"cleanup":return be.cleanup(t,r.cwd);case"cleanup-projects":return be.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return W.execute(r.command,e,r.cwd)}}function XE(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:_e.socket(),uptime:Ie?Date.now()-Ie.startedAt:0,commandsServed:Ie?.commandsServed??0,lastActivity:Ie?new Date(Ie.lastActivity).toISOString():null,registeredCommands:W.list().length,stale:Yh()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>_n(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Xh(){Ie&&(Ie.idleTimer&&clearTimeout(Ie.idleTimer),Ie.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ie.idleTimeoutMs/1e3/60} minutes, shutting down`),_n(0)},Ie.idleTimeoutMs),Ie.idleTimer.unref&&Ie.idleTimer.unref())}function _n(r){console.log("Daemon shutting down..."),Ie?.idleTimer&&clearTimeout(Ie.idleTimer),jo&&(jo.stop(),jo=null),Mr&&(Mr.close(),Mr=null),N.close();let e=_e.socket(),t=_e.pid();try{Ke.existsSync(e)&&Ke.unlinkSync(e)}catch{}try{Ke.existsSync(t)&&Ke.unlinkSync(t)}catch{}process.exit(r)}function YE(r){try{return process.kill(r,0),!0}catch{return!1}}function QE(){let r=Dt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ke.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ke.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ke.existsSync(n))return n;let s=process.argv[1];return s&&Ke.existsSync(s)?s:null}function eC(){let r=_e.log();try{if(Ke.statSync(r).size>ZE){let t=`${r}.1`;try{Ke.unlinkSync(t)}catch{}Ke.renameSync(r,t)}}catch{}}function Yh(){if(!Ie?.entryPath||Ie.entryMtime===null)return!1;try{return Ke.statSync(Ie.entryPath).mtimeMs!==Ie.entryMtime}catch{return!1}}var VE,Mr,jo,be,Ie,ZE,Zh=S(()=>{"use strict";gd();bo();wd();Ee();Pc();se();Io();VE=50,Mr=null,jo=null,be=null,Ie=null;l(qE,"startDaemon");l(zE,"handleConnection");l(JE,"handleRequest");l(KE,"executeCommand");l(XE,"handleDaemonCommand");l(Xh,"resetIdleTimer");l(_n,"shutdown");l(YE,"isProcessRunning");l(QE,"resolveEntryPath");ZE=1024*1024;l(eC,"rotateLog");l(Yh,"isCodeStale")});var sy={};we(sy,{runStart:()=>uC});import ds from"node:fs/promises";import ey from"node:os";import ms from"node:path";import J from"chalk";function nC(){console.clear(),console.log(tC),console.log(sC)}function ty(r,e){console.log(`
|
|
1580
1589
|
${J.bold(" Select AI providers to configure:")}
|
|
1581
1590
|
`),console.log(` ${J.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1582
|
-
`),r.forEach((t,s)=>{let n=s===e?J.cyan("\u276F"):" ",o=t.selected?J.green("[\u2713]"):J.dim("[ ]"),i=t.installed?J.green("(installed)"):J.yellow("(will install)"),a=s===e?J.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function
|
|
1591
|
+
`),r.forEach((t,s)=>{let n=s===e?J.cyan("\u276F"):" ",o=t.selected?J.green("[\u2713]"):J.dim("[ ]"),i=t.installed?J.green("(installed)"):J.yellow("(will install)"),a=s===e?J.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function rC(){let r=await ws(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),ty(e,s)},"render");ty(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
|
|
1583
1592
|
Cancelled.
|
|
1584
1593
|
`),process.exit(0)),a==="\r"||a===`
|
|
1585
1594
|
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(s=Math.max(0,s-1),n()),a==="\x1B[B"&&(s=Math.min(e.length-1,s+1),n()),a===" "&&(e[s].selected=!e[s].selected,n())},"handleKey");process.stdin.on("data",i)}):(console.log(`
|
|
1586
1595
|
${J.bold(" Detected providers:")}
|
|
1587
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function
|
|
1596
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function oC(r){let e=Be[r];if(!e.configDir)return!1;try{let t=ms.join(e.configDir,"commands");await ds.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ot(),Wn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=ms.join(n,"templates","commands",o),a=ms.join(t,o);return await E(i)?(await ds.copyFile(i,a),!0):!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function iC(r){let e=Be[r];if(!e.configDir)return!1;try{let t=r==="gemini"?ms.join(e.configDir,"commands"):ms.join(e.configDir,"commands","p");await ds.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=Hs("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=wt(`commands/${i}`);a&&await ds.writeFile(ms.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function aC(r){let e=Be[r];if(!e.configDir)return!1;try{await ds.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ot(),Wn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=ms.join(s,"templates","global",n),i=ms.join(e.configDir,n);if(await E(o)){let a=await ds.readFile(o,"utf-8");if(await E(i)){let c=await ds.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=c.substring(0,c.indexOf(u)),m=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ds.writeFile(i,p+g+m)}else await ds.writeFile(i,`${c}
|
|
1588
1597
|
|
|
1589
|
-
${a}`)}else await
|
|
1598
|
+
${a}`)}else await ds.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${J.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function cC(r){let e=ms.join(ey.homedir(),".prjct-cli","config","installed-editors.json"),t={version:ge,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:ms.join(ey.homedir(),`.${r[0]}`,"commands")};await le(e,t)}function lC(r){console.log(`
|
|
1590
1599
|
${J.green.bold(" \u2713 Setup complete!")}
|
|
1591
|
-
`),console.log(` ${J.dim("Configured providers:")}`),r.forEach(e=>{let t=
|
|
1600
|
+
`),console.log(` ${J.dim("Configured providers:")}`),r.forEach(e=>{let t=Be[e];console.log(` ${J.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1592
1601
|
${J.bold("Next steps:")}
|
|
1593
1602
|
|
|
1594
1603
|
${J.cyan("1.")} Navigate to your project directory
|
|
@@ -1601,30 +1610,30 @@ ${J.green.bold(" \u2713 Setup complete!")}
|
|
|
1601
1610
|
${J.dim("\u2022")} Use ${J.bold("p. ship")} to create PRs
|
|
1602
1611
|
|
|
1603
1612
|
${J.dim("Learn more: https://prjct.app/docs")}
|
|
1604
|
-
`)}async function
|
|
1613
|
+
`)}async function uC(){nC();let r=await rC();console.log(`
|
|
1605
1614
|
${J.cyan("Setting up...")}
|
|
1606
|
-
`);for(let e of r){let t=
|
|
1615
|
+
`);for(let e of r){let t=Be[e];process.stdout.write(` ${J.dim("\u2022")} ${t.displayName}... `);let s=await oC(e),n=await iC(e),o=await aC(e);console.log(s&&n&&o?J.green("\u2713"):s||o?J.yellow("partial"):J.yellow("skipped"))}await cC(r),lC(r)}var _r,Or,Nr,Lr,Fr,tC,sC,ny=S(()=>{"use strict";Ws();rt();H();B();ot();_r=J.rgb(180,180,175),Or=J.rgb(200,200,195),Nr=J.rgb(220,220,215),Lr=J.rgb(235,235,230),Fr=J.rgb(250,250,245),tC=`
|
|
1607
1616
|
|
|
1608
|
-
${
|
|
1609
|
-
${
|
|
1610
|
-
${
|
|
1611
|
-
${
|
|
1612
|
-
${
|
|
1613
|
-
${
|
|
1617
|
+
${_r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Or(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Nr(" \u2588\u2588\u2557")}${Lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Fr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1618
|
+
${_r(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Or(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Nr(" \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${Fr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1619
|
+
${_r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Or(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Nr(" \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2551 ")}${Fr(" \u2588\u2588\u2551 ")}
|
|
1620
|
+
${_r(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${Or(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Nr("\u2588\u2588 \u2588\u2588\u2551")}${Lr("\u2588\u2588\u2551 ")}${Fr(" \u2588\u2588\u2551 ")}
|
|
1621
|
+
${_r(" \u2588\u2588\u2551 ")}${Or(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Nr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Lr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Fr(" \u2588\u2588\u2551 ")}
|
|
1622
|
+
${_r(" \u255A\u2550\u255D ")}${Or(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Nr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Lr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${Fr(" \u255A\u2550\u255D ")}
|
|
1614
1623
|
|
|
1615
|
-
`,
|
|
1624
|
+
`,sC=` ${J.white("Context Layer for AI Agents")} ${J.dim(`v${ge}`)}
|
|
1616
1625
|
|
|
1617
1626
|
${J.dim(`Project context layer for AI coding agents.
|
|
1618
1627
|
Works with Claude Code, Gemini CLI, Codex, and more.`)}
|
|
1619
1628
|
${J.cyan("https://prjct.app")}
|
|
1620
|
-
`;l(
|
|
1621
|
-
`).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function
|
|
1629
|
+
`;l(nC,"showBanner");l(ty,"showProviderSelection");l(rC,"selectProviders");l(oC,"installRouter");l(iC,"installSubcommands");l(aC,"installGlobalConfig");l(cC,"saveSetupConfig");l(lC,"showCompletion");l(uC,"runStart")});import iy from"node:fs/promises";import Ds from"node:path";async function Ur(r,e=process.cwd(),t={}){let s=Ds.isAbsolute(r)?r:Ds.join(e,r),n;try{n=await iy.readFile(s,"utf-8")}catch(g){if(I(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=Ds.extname(r).toLowerCase(),i=gC[o]||"unknown",a=pC[i]||[],c=await fC(n,a,s,e),u=[];t.reverse&&(u=await yC(r,e));let d;t.depth&&t.depth>0&&(d=await ay(r,e,t.depth));let p=c.filter(g=>g.isExternal).length,m=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:p,internalImports:m,importedByCount:u.length}}}async function fC(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let m=a[i.namesIndex];m&&(u=m.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),p=null;d||(p=await hC(c,t,s)),n.push({source:c,resolved:p,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function hC(r,e,t){let s=Ds.dirname(e);if(r.startsWith("@/")){let o=Ds.join(t,"src",r.slice(2));return oy(o,t)}let n=Ds.resolve(s,r);return oy(n,t)}async function oy(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await iy.stat(n)).isFile())return Ds.relative(e,n)}catch{}}return null}async function yC(r,e){let t=[],s=Ds.basename(r,Ds.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await L(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
|
|
1630
|
+
`).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function ay(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await Ur(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await ay(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var ry,dC,mC,pC,gC,kd=S(()=>{"use strict";H();Ge();ry=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],dC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],mC=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],pC={typescript:ry,javascript:ry,python:dC,go:mC},gC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Ur,"analyzeImports");l(fC,"extractImports");l(hC,"resolveImport");l(oy,"tryResolve");l(yC,"findImportedBy");l(ay,"buildDependencyTree")});import cy from"node:fs/promises";import ps from"node:path";async function xa(r,e=process.cwd()){let t=ps.isAbsolute(r)?r:ps.join(e,r),s;try{s=await cy.readFile(t,"utf-8")}catch(m){if(I(m))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Pn("")};throw m}let n=ps.extname(r).toLowerCase(),o=ly[n]||"unknown",i=await Js(r,e),a=await Ur(r,e),c=kC(s,o),u=i.signatures.filter(m=>m.exported).map(m=>({name:m.name,type:m.type,signature:m.signature,description:m.docstring?SC(m.docstring):void 0})),d=a.imports.filter(m=>!m.isExternal&&m.resolved).map(m=>m.resolved).slice(0,10),p=bC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Vi(s,p)}}async function Sd(r,e=process.cwd(),t={}){let s=ps.isAbsolute(r)?r:ps.join(e,r),n=[];async function o(i){let a=await cy.readdir(i,{withFileTypes:!0});for(let c of a){let u=ps.join(i,c.name),d=ps.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=ps.extname(c.name).toLowerCase();if(ly[p]){let m=await xa(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function kC(r,e){let t=wC[e]||[],s=r.split(`
|
|
1622
1631
|
`);for(let o=0;o<Math.min(30,s.length);o++){let i=s[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<s.length&&a.start.test(s[u].trim());)c.push(s[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<s.length&&(c+=`${s[u]}
|
|
1623
1632
|
`,!a.end.test(s[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1624
1633
|
`).map(p=>p.replace(/^\s*\*\s?/,"").trim()).filter(p=>p.length>0&&!p.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let n=r.split(`
|
|
1625
|
-
`)[0]||"";return`Module: ${
|
|
1626
|
-
`)[0].trim()}function
|
|
1627
|
-
`)}var
|
|
1634
|
+
`)[0]||"";return`Module: ${ps.basename(n,ps.extname(n))}`}function SC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1635
|
+
`)[0].trim()}function bC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
|
|
1636
|
+
`)}var wC,ly,uy=S(()=>{"use strict";H();kd();zi();qi();wC={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},ly={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(xa,"summarizeFile");l(Sd,"summarizeDirectory");l(kC,"extractFilePurpose");l(SC,"extractDescriptionFromDocstring");l(bC,"buildSummaryText")});var dy={};we(dy,{analyzeImports:()=>Ur,extractDirectorySignatures:()=>Yl,extractSignatures:()=>Js,findRelevantFiles:()=>As,getRecentFiles:()=>ko,runContextTool:()=>vC,summarizeDirectory:()=>Sd,summarizeFile:()=>xa});async function vC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await TC(o,t);break;case"signatures":i=await EC(o,t);break;case"imports":i=await CC(o,t);break;case"recent":i=await PC(o,t);break;case"summary":i=await xC(o,t);break;case"help":return{tool:"error",result:{error:IC(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=RC(i),u=AC(i);return await jC(e,{tool:n,timestamp:b(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function TC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await As(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function EC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Yl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Xl(c.map(p=>p.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(p=>p.signatures.map(m=>({...m,file:p.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await Js(t,e)}}async function CC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await Ur(t,e,s)}}async function PC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await ko(e,t)}}async function xC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Sd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(p=>({...p,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Xl(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await xa(t,e)}}function RC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function AC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function jC(r,e){try{await Bs.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function IC(){return`
|
|
1628
1637
|
Context Tools - Smart context filtering for AI agents
|
|
1629
1638
|
|
|
1630
1639
|
USAGE:
|
|
@@ -1685,7 +1694,7 @@ TOOLS:
|
|
|
1685
1694
|
OUTPUT:
|
|
1686
1695
|
All tools output JSON for easy parsing by AI agents.
|
|
1687
1696
|
Each output includes metrics showing token savings.
|
|
1688
|
-
`.trim()}var
|
|
1697
|
+
`.trim()}var my=S(()=>{"use strict";Ri();H();K();wo();kd();zl();zi();uy();qi();l(vC,"runContextTool");l(TC,"runFilesTool");l(EC,"runSignaturesTool");l(CC,"runImportsTool");l(PC,"runRecentTool");l(xC,"runSummaryTool");l(RC,"getTokensSaved");l(AC,"getCompressionRate");l(jC,"recordToolUsage");l(IC,"getHelpText")});var hy={};we(hy,{hooksService:()=>LC});import Ze from"node:fs/promises";import Ue from"node:path";import Wt from"chalk";function gy(){return`#!/bin/sh
|
|
1689
1698
|
# prjct auto-sync hook (post-commit)
|
|
1690
1699
|
# Syncs project context after each commit
|
|
1691
1700
|
# Installed by: prjct hooks install
|
|
@@ -1706,7 +1715,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1706
1715
|
fi
|
|
1707
1716
|
|
|
1708
1717
|
exit 0
|
|
1709
|
-
`}function
|
|
1718
|
+
`}function fy(){return`#!/bin/sh
|
|
1710
1719
|
# prjct auto-sync hook (post-checkout)
|
|
1711
1720
|
# Syncs project context after branch switch
|
|
1712
1721
|
# Installed by: prjct hooks install
|
|
@@ -1738,7 +1747,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1738
1747
|
fi
|
|
1739
1748
|
|
|
1740
1749
|
exit 0
|
|
1741
|
-
`}async function
|
|
1750
|
+
`}async function bd(r){let e=[];return(await E(Ue.join(r,"lefthook.yml"))||await E(Ue.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await E(Ue.join(r,".husky"))||await E(Ue.join(r,".husky","_")))&&e.push("husky"),await E(Ue.join(r,".git"))&&e.push("direct"),e}function py(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function DC(r,e){let t=await E(Ue.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=Ue.join(r,t),n=await Ze.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
|
|
1742
1751
|
${i}:
|
|
1743
1752
|
commands:
|
|
1744
1753
|
${a}:
|
|
@@ -1749,37 +1758,37 @@ ${i}:
|
|
|
1749
1758
|
${a}:
|
|
1750
1759
|
run: prjct sync --quiet --yes
|
|
1751
1760
|
fail_text: "prjct sync failed (non-blocking)"`):n=`${n.trimEnd()}
|
|
1752
|
-
${c}`}return await
|
|
1761
|
+
${c}`}return await Ze.writeFile(s,n,"utf-8"),!0}async function $C(r,e){let t=Ue.join(r,".husky");for(let s of e){let n=Ue.join(t,s),o=s==="post-commit"?gy():fy();if(await E(n)){if((await Ze.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ze.appendFile(n,`
|
|
1753
1762
|
# prjct auto-sync
|
|
1754
1763
|
prjct sync --quiet --yes &
|
|
1755
|
-
`)}else await
|
|
1764
|
+
`)}else await Ze.writeFile(n,o,{mode:493})}return!0}async function MC(r,e){let t=Ue.join(r,".git","hooks");await E(t)||await Ze.mkdir(t,{recursive:!0});for(let s of e){let n=Ue.join(t,s),o=s==="post-commit"?gy():fy();if(await E(n)){if((await Ze.readFile(n,"utf-8")).includes("prjct sync"))continue;await Ze.appendFile(n,`
|
|
1756
1765
|
# prjct auto-sync
|
|
1757
1766
|
${o.split(`
|
|
1758
1767
|
`).slice(1).join(`
|
|
1759
|
-
`)}`)}else await
|
|
1760
|
-
`,"utf-8"),!0}async function
|
|
1768
|
+
`)}`)}else await Ze.writeFile(n,o,{mode:493})}return!0}async function _C(r){let e=await E(Ue.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Ue.join(r,e);if(!await E(t))return!1;let s=await Ze.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ze.writeFile(t,`${s.trimEnd()}
|
|
1769
|
+
`,"utf-8"),!0}async function OC(r){let e=Ue.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=Ue.join(e,t);if(!await E(s))continue;let n=await Ze.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
|
|
1761
1770
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1762
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await
|
|
1771
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ze.unlink(s):await Ze.writeFile(s,o,{mode:493})}return!0}async function NC(r){let e=Ue.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=Ue.join(e,t);if(!await E(s))continue;let n=await Ze.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await Ze.unlink(s);else{let o=n.split(`
|
|
1763
1772
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1764
|
-
`);await
|
|
1765
|
-
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await
|
|
1766
|
-
\u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(
|
|
1767
|
-
${
|
|
1768
|
-
`)}function
|
|
1769
|
-
`)}function
|
|
1770
|
-
`)}function
|
|
1773
|
+
`);await Ze.writeFile(s,o,{mode:493})}}return!0}var vd,LC,yy=S(()=>{"use strict";Ee();se();H();B();Ve();l(gy,"getPostCommitScript");l(fy,"getPostCheckoutScript");l(bd,"detectHookManagers");l(py,"selectStrategy");l(DC,"installLefthook");l($C,"installHusky");l(MC,"installDirect");l(_C,"uninstallLefthook");l(OC,"uninstallHusky");l(NC,"uninstallDirect");vd=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await bd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||py(n);try{let i=!1;switch(o){case"lefthook":i=await DC(e,s);break;case"husky":i=await $C(e,s);break;case"direct":i=await MC(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await _C(e);break;case"husky":n=await OC(e);break;case"direct":n=await NC(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await bd(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await _.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await bd(e),s=py(t);console.log(` Strategy: ${Wt.cyan(s)}`),console.log(` Hooks: ${Wt.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${Wt.green("\u2713")} ${o}`);console.log(""),console.log(Wt.dim(" Context will auto-sync on commit and branch switch.")),console.log(Wt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Wt.green("Active")}`),console.log(` Strategy: ${Wt.cyan(t.strategy)}`)):console.log(` Status: ${Wt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?Wt.green("\u2713"):Wt.dim("\u25CB"),o=s.installed?s.name:Wt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Wt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Wt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await E(Ue.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Ue.join(e,o);return await E(i)?(await Ze.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=Ue.join(e,".husky",t);return await E(o)?(await Ze.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=Ue.join(e,".git","hooks",t);return await E(n)?(await Ze.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await E(Ue.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await _.getProjectId(e);if(!t)return null;try{let s=x.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await _.getProjectId(e);if(s)try{let n=x.getDoc(s,"project")||{};n.hooks=t,x.setDoc(s,"project",n)}catch{}}},LC=new vd});var ky={};we(ky,{DoctorService:()=>Ra,doctorService:()=>UC});import{execSync as Td}from"node:child_process";import FC from"node:fs/promises";import wy from"node:path";import sn from"chalk";var Ra,UC,Sy=S(()=>{"use strict";Ee();Te();ir();Pt();B();ho();Ve();ot();rr();Ra=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await _.getProjectId(e),this.projectId&&(this.globalPath=j.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=Td(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=wy.join(this.projectPath,".prjct","prjct.config.json");return await E(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=wy.join(this.globalPath,"context","CLAUDE.md");try{let t=await FC.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{Td("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Td("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
|
|
1774
|
+
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await F.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await Zt.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await or({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await ef(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await tf(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await sf(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(m=>m.name==="gh"&&m.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(m=>m.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(m=>m.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(m=>m.name==="CLAUDE.md"&&m.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(m=>m.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(m=>m.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(m=>m.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let p=t.find(m=>m.name==="linear mcp");return p&&p.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${ge}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?sn.dim(" (optional)"):"";return`${o} ${i} ${sn.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:sn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(sn.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return sn.green("\u2713");case"warn":return sn.yellow("\u26A0");case"error":return t?sn.dim("\u25CB"):sn.red("\u2717")}}},UC=new Ra});var by={};we(by,{WatchService:()=>Aa,watchService:()=>VC});import HC from"node:path";import ft from"chalk";import WC from"chokidar";var GC,BC,Aa,VC,vy=S(()=>{"use strict";Ee();H();K();Oi();GC=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],BC=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Aa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await _.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=WC.watch(GC,{cwd:this.projectPath,ignored:BC,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(ft.dim(`
|
|
1775
|
+
\u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(ft.dim(` ${s} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let s=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(ft.dim(` \u23F3 Rate limited, waiting ${Math.round(s/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),s);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=b().split("T")[1].split(".")[0];if(!this.options.quiet){let s=e.length===1?e[0]:`${e.length} files`;console.log(`
|
|
1776
|
+
${ft.dim(`[${t}]`)} ${ft.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Rs.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${ft.dim(`[${t}]`)} ${ft.green("\u2713")} Synced`):console.error(`${ft.dim(`[${t}]`)} ${ft.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${ft.dim(`[${t}]`)} ${ft.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(ft.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(ft.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(ft.dim(` Project: ${HC.basename(this.projectPath)}`)),console.log(ft.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(ft.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(ft.dim(" Press Ctrl+C to stop")),console.log("")}},VC=new Aa});var Ay={};we(Ay,{formatAgentCommandHelp:()=>Py,formatCommandHelp:()=>xy,formatCommandList:()=>Ry,formatMainHelp:()=>Ey,formatTerminalCommandHelp:()=>Cy,getHelp:()=>zC});import X from"chalk";function Ey(){let r=[];r.push(""),r.push(`${X.cyan.bold("prjct")} v${ge} - Context layer for AI coding agents`),r.push(X.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(X.bold("QUICK START")),r.push(X.dim("\u2500".repeat(60))),r.push(` ${X.green("1.")} prjct start ${X.dim("# Configure AI providers")}`),r.push(` ${X.green("2.")} cd my-project && prjct init`),r.push(` ${X.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${X.green("4.")} p. sync ${X.dim("# Analyze project")}`),r.push(""),r.push(X.bold("TERMINAL COMMANDS")),r.push(X.dim("\u2500".repeat(60)));for(let t of Ty){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${X.bold("AI AGENT COMMANDS")} ${X.dim("(inside Claude/Gemini/Cursor)")}`),r.push(X.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${X.dim("\u2500".repeat(56))}`);let e=Dr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${X.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(X.bold("FLAGS")),r.push(X.dim("\u2500".repeat(60)));for(let t of qC)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(X.bold("MORE INFO")),r.push(X.dim("\u2500".repeat(60))),r.push(` Documentation: ${X.cyan("https://prjct.app")}`),r.push(` GitHub: ${X.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1777
|
+
`)}function Cy(r){let e=Ty.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(X.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(X.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
|
|
1778
|
+
`)}function Py(r){let e=Dr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${X.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(X.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(X.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(X.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(X.bold("REQUIREMENTS")),t.push(` ${X.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=Po[e.group];return s&&(t.push(X.dim(`Category: ${s.title}`)),e.isOptional&&t.push(X.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1779
|
+
`)}function xy(r){let e=Cy(r);if(e)return e;let t=Py(r);return t||`
|
|
1771
1780
|
${X.yellow(`Command '${r}' not found.`)}
|
|
1772
1781
|
|
|
1773
1782
|
Run 'prjct help' to see all available commands.
|
|
1774
|
-
`}function
|
|
1775
|
-
`)}function PC(r){return r?r==="commands"||r==="all"?uy():ly(r):iy()}var oy,CC,my=S(()=>{"use strict";Zu();nt();oy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],CC=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(iy,"formatMainHelp");l(ay,"formatTerminalCommandHelp");l(cy,"formatAgentCommandHelp");l(ly,"formatCommandHelp");l(uy,"formatCommandList");l(PC,"getHelp")});var py=by((cB,xC)=>{xC.exports={name:"prjct-cli",version:"1.52.3",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.27.1","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var _C={};import gy from"node:os";import ba from"node:path";import Fe from"chalk";async function RC(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>vy(py()));await $C(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(MC(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=W.getByName(r);if(!s){let m=jC(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(gn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=IC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=AC(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await M.getProjectId(process.cwd()),c&&(await Ns.expireIfStale(c),await Ns.touch(c))}catch{}let d=new Xs,p;if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Ns.trackCommand(c,r,m)}catch{}try{await fn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await fn.recordTiming(c,"startup_time",w)}await fn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(ja(s)),t||f.end(),process.exit(1)}}function AC(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return gn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function jC(r){let e=W.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=DC(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function DC(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function IC(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function $C(r){let e=await hs(),t=ba.join(gy.homedir(),".claude","commands","p.md"),s=ba.join(gy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([E(t),E(s),E(ba.join(process.cwd(),".cursor","commands","sync.md")),E(ba.join(process.cwd(),".cursor"))]),c=await Mn();if(console.log(`
|
|
1776
|
-
${
|
|
1777
|
-
${
|
|
1778
|
-
|
|
1779
|
-
${
|
|
1780
|
-
${
|
|
1781
|
-
${
|
|
1782
|
-
`)}function
|
|
1783
|
+
`}function Ry(){let r=[];r.push(""),r.push(X.cyan.bold("All Commands")),r.push("");let e=Object.entries(Po).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Dr.filter(o=>o.group===t);if(n.length!==0){r.push(`${X.bold(s.title)} ${X.dim(`(${n.length} commands)`)}`),r.push(X.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(X.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1784
|
+
`)}function zC(r){return r?r==="commands"||r==="all"?Ry():xy(r):Ey()}var Ty,qC,jy=S(()=>{"use strict";fd();ot();Ty=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],qC=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(Ey,"formatMainHelp");l(Cy,"formatTerminalCommandHelp");l(Py,"formatAgentCommandHelp");l(xy,"formatCommandHelp");l(Ry,"formatCommandList");l(zC,"getHelp")});var Iy=Uy((YV,JC)=>{JC.exports={name:"prjct-cli",version:"1.53.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.28.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var sP={};import Dy from"node:os";import ja from"node:path";import He from"chalk";async function KC(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>Hy(Iy()));await eP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(tP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=W.getByName(r);if(!s){let m=YC(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(yn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=ZC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=XC(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await _.getProjectId(process.cwd()),c&&(await Us.expireIfStale(c),await Us.touch(c))}catch{}let d=new Zs,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,v={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor")}[r];if(v)p=await v(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Us.trackCommand(c,r,m)}catch{}try{await wn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await wn.recordTiming(c,"startup_time",w)}await wn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(Ga(s)),t||f.end(),process.exit(1)}}function XC(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return yn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function YC(r){let e=W.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=QC(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function QC(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function ZC(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function eP(r){let e=await ws(),t=ja.join(Dy.homedir(),".claude","commands","p.md"),s=ja.join(Dy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([E(t),E(s),E(ja.join(process.cwd(),".cursor","commands","sync.md")),E(ja.join(process.cwd(),".cursor"))]),c=await Ln();if(console.log(`
|
|
1785
|
+
${He.cyan("p/")} prjct v${r}
|
|
1786
|
+
${He.dim("Context layer for AI coding agents")}
|
|
1787
|
+
|
|
1788
|
+
${He.dim("Providers:")}`),e.claude.installed){let u=n?He.green("\u2713 ready"):He.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${He.dim(d)}`)}else console.log(` Claude Code ${He.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?He.green("\u2713 ready"):He.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${He.dim(d)}`)}else console.log(` Gemini CLI ${He.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?He.green("\u2713 ready"):He.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${He.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${He.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${He.green("\u2713 ready")} ${He.dim("(use /sync, /task)")}`:a?` Cursor IDE ${He.yellow("\u25CF detected")} ${He.dim("(run prjct init)")}`:` Cursor IDE ${He.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1789
|
+
${He.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1790
|
+
${He.cyan("https://prjct.app")}
|
|
1791
|
+
`)}function tP(){console.log(`
|
|
1783
1792
|
prjct - Context layer for AI coding agents
|
|
1784
1793
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1785
1794
|
|
|
@@ -1838,11 +1847,11 @@ MORE INFO
|
|
|
1838
1847
|
---------
|
|
1839
1848
|
Documentation: https://prjct.app
|
|
1840
1849
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1841
|
-
`)}var
|
|
1850
|
+
`)}var $y=S(()=>{"use strict";gd();bo();wd();rt();Ee();oi();ri();H();Qr();B();Ve();l(KC,"main");l(XC,"validateCommandParams");l(YC,"findClosestCommand");l(QC,"editDistance");l(ZC,"parseCommandArgs");l(eP,"displayVersion");l(tP,"displayHelp");KC().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(Ga(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var Hr=process.argv.slice(2),Ed=Hr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),nP=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(Ed&&!nP.has(Ed)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Io(),Pd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(fs(),gs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<Hr.length;a++){let c=Hr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<Hr.length&&!Hr[a+1].startsWith("--")?i[u]=Hr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:Ed,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function rP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(rt(),Mt)),n=(await Promise.resolve().then(()=>(Ee(),nm))).default,o=(await Promise.resolve().then(()=>(Vo(),om))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Pc(),Im)),{fileExists:c}=await Promise.resolve().then(()=>(B(),$t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ja(),Gd)),{VERSION:d}=await Promise.resolve().then(()=>(ot(),Wn));async function p(){let T=r.homedir(),$=await s();if($.claude.installed){let M=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if($.gemini.installed){let M=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(R=>R.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!$.claude.installed&&!$.gemini.installed,!0}l(p,"checkRoutersInstalled");let m=process.argv.slice(2),g=m.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){m.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Ve(),Om));T(!0)}let v=m.indexOf("--refresh"),h=v!==-1;h&&(m.splice(v,1),await u());async function P(T){let $=Date.now();try{let M=await n.getProjectId(process.cwd());if(M){let{sessionTracker:y}=await Promise.resolve().then(()=>(ri(),Fm));return await y.expireIfStale(M),await y.touch(M),()=>{let R=Date.now()-$;y.trackCommand(M,T,R).catch(()=>{}),Promise.resolve().then(()=>(oi(),Hm)).then(({performanceTracker:D})=>{D.recordTiming(M,"command_duration",R,{command:T}).catch(()=>{}),D.recordMemory(M,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(P,"trackSession"),m[0]==="daemon"){let T=m[1]||"status";if(T==="start"){let{isDaemonRunning:$,spawnDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(await $())console.log("Daemon is already running."),process.exitCode=0;else if(m.includes("--foreground")||m.includes("-f")){let{startDaemon:R}=await Promise.resolve().then(()=>(Zh(),Qh)),D=parseInt(m.find(Y=>Y.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=m.includes("--no-http");await R({port:D,noHttp:G,foreground:!0})}else await M()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:$,stopDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(await $()){let y=await M();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:$}=await Promise.resolve().then(()=>(fs(),gs)),M=await $();if(M.running){let y=M.uptime?Math.round(M.uptime/1e3):0,R=M.stale;console.log(`Daemon running (PID ${M.pid})${R?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${M.commandsServed??0}`),M.lastActivity&&console.log(` Last activity: ${M.lastActivity}`),R&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(m[0]==="stop"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:M}=await Promise.resolve().then(()=>(fs(),gs));if(m.includes("--force")||m.includes("-f")){let R=M();console.log(R?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await $()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),M(),console.log("Daemon force-killed."),process.exitCode=0):(M(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(m[0]==="restart"){let{isDaemonRunning:T,stopDaemon:$,forceKillDaemon:M,spawnDaemon:y}=await Promise.resolve().then(()=>(fs(),gs));await T()?(await $()||M(),await new Promise(G=>setTimeout(G,300))):M(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(m[0]==="start"||m[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(ny(),sy));await T()}else if(m[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(m[0]==="web"||m[0]==="serve")try{let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=parseInt(m[1],10)||i;await a($,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(m[0]==="context"){let T=process.cwd(),$=await n.getProjectId(T);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=await P("context"),y=m.slice(1).filter(D=>D!=="--md"&&D!=="--json"),R=m.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(da(),oh)),Y=await new D().context(null,T,{md:R});process.exitCode=Y.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(my(),dy)),G=await D(y,$,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(m[0]==="hooks"){let T=await P("hooks"),{hooksService:$}=await Promise.resolve().then(()=>(yy(),hy)),M=m[1]||"status",y=await $.run(process.cwd(),M);process.exitCode=y,T()}else if(m[0]==="doctor"){let T=await P("doctor"),{doctorService:$}=await Promise.resolve().then(()=>(Sy(),ky)),M=await $.run(process.cwd());process.exitCode=M,T()}else if(m[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(hd(),Jh)),$=m.includes("--force")||m.includes("-f"),M=m.includes("--backup")||m.includes("-b"),y=m.includes("--dry-run")||m.includes("-n"),R=m.includes("--keep-package"),D=await T({force:$,backup:M,dryRun:y,keepPackage:R});process.exitCode=D.success?0:1}else if(m[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:M}=await Promise.resolve().then(()=>(vy(),by)),y=m.includes("--verbose")||m.includes("-v"),R=m.find(me=>me.startsWith("--debounce=")),D=R?parseInt(R.split("=")[1],10):void 0,G=m.find(me=>me.startsWith("--interval=")),Y=G?parseInt(G.split("=")[1],10)*1e3:void 0,We=await M.start(T,{verbose:y,quiet:w,debounceMs:D,minIntervalMs:Y});We.success||(console.error(We.error),process.exitCode=1)}}else if(m[0]==="linear"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),R=e.join(__dirname,"..","dist","cli","linear.mjs"),D=e.join(__dirname,"..","cli","linear.mjs"),G,Y;if($.existsSync(y)?(G=y,Y="bun"):$.existsSync(D)?(G=D,Y="node"):$.existsSync(R)?(G=R,Y="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Y=""),G){let We=[...m.slice(1)];T(Y,[G,...We],{stdio:"inherit",cwd:M}).on("close",Me=>{process.exitCode=Me||0})}}else if(m[0]==="jira"){let{spawn:T}=await import("node:child_process"),$=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),R=e.join(__dirname,"..","dist","cli","jira.mjs"),D=e.join(__dirname,"..","cli","jira.mjs"),G,Y;if($.existsSync(y)?(G=y,Y="bun"):$.existsSync(D)?(G=D,Y="node"):$.existsSync(R)?(G=R,Y="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Y=""),G){let We=[...m.slice(1)];T(Y,[G,...We],{stdio:"inherit",cwd:M}).on("close",Me=>{process.exitCode=Me||0})}}else if(m[0]==="help"||m[0]==="-h"||m[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(jy(),Ay)),$=m[1];console.log(T($)),process.exitCode=0}else if(m[0]==="version"||m[0]==="-v"||m[0]==="--version"){let T=await s(h),$=r.homedir(),M=process.cwd(),[y,R,D,G,Y,We]=await Promise.all([c(e.join($,".claude","commands","p.md")),c(e.join($,".gemini","commands","p.toml")),c(e.join(M,".cursor")),c(e.join(M,".cursor","rules","prjct.mdc")),c(e.join(M,".windsurf")),c(e.join(M,".windsurf","rules","prjct.md"))]);if(console.log(`
|
|
1842
1851
|
${t.cyan("p/")} prjct v${d}
|
|
1843
1852
|
${t.dim("Context layer for AI coding agents")}
|
|
1844
1853
|
|
|
1845
|
-
${t.dim("Providers:")}`),T.claude.installed){let
|
|
1854
|
+
${t.dim("Providers:")}`),T.claude.installed){let me=y?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Me=T.claude.version?` (v${T.claude.version})`:"";console.log(` Claude Code ${me}${t.dim(Me)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(T.gemini.installed){let me=R?t.green("\u2713 ready"):t.yellow("\u25CF installed"),Me=T.gemini.version?` (v${T.gemini.version})`:"";console.log(` Gemini CLI ${me}${t.dim(Me)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(D){let me=G?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${me}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(Y){let me=We?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${me}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
|
|
1846
1855
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1847
1856
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1848
1857
|
${t.cyan("https://prjct.app")}
|
|
@@ -1855,4 +1864,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
|
|
|
1855
1864
|
Claude Code, Gemini CLI, or both.`)}
|
|
1856
1865
|
`),process.exitCode=0;else{try{let y=await o.getLastVersion();if(y&&y!==d){console.log(`
|
|
1857
1866
|
${t.yellow("\u2139")} Updating prjct v${y} \u2192 v${d}...
|
|
1858
|
-
`);try{let{default:R}=await Promise.resolve().then(()=>(
|
|
1867
|
+
`);try{let{default:R}=await Promise.resolve().then(()=>(ir(),xi));await R.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}m.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(fs(),gs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>($y(),sP))}}}l(rP,"main");rP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|