prjct-cli 1.30.1 → 1.32.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 +19 -1
- package/dist/bin/prjct-core.mjs +387 -342
- package/dist/daemon/entry.mjs +300 -255
- package/dist/templates.json +1 -1
- package/package.json +3 -5
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -4,15 +4,15 @@ 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 m=JSON.parse(d);i=!0,clearTimeout(a),
|
|
10
|
-
`,"utf-8")}async function
|
|
11
|
-
`)}async function
|
|
12
|
-
`);await Td(s,t)}function rw(s){return ys.extname(s)}function ow(s){return ys.basename(s,ys.extname(s))}var ve=y(()=>{"use strict";xd();N();l(Un,"readJson");l(br,"writeJson");l(ws,"readFile");l(Td,"writeFile");l(Jy,"atomicWrite");l(qy,"appendToFile");l(Oa,"appendLine");l(Ky,"prependToFile");l(x,"fileExists");l(Po,"dirExists");l(Nt,"ensureDir");l(Yy,"deleteFile");l(Xy,"deleteDir");l(ks,"listFiles");l(Qy,"getFileSize");l(Zy,"getFileModifiedTime");l(ew,"copyFile");l(tw,"moveFile");l(nw,"readLines");l(sw,"writeLines");l(rw,"getFileExtension");l(ow,"getFileNameWithoutExtension")});var Ad={};he(Ad,{invalidateProviderCache:()=>cw,readProviderCache:()=>_a,writeProviderCache:()=>Na});import vo from"node:fs/promises";import iw from"node:os";import Ed from"node:path";async function _a(){try{let s=await vo.readFile(Fa,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>aw?null:e.detection}catch{return null}}async function Na(s){let e={timestamp:new Date().toISOString(),detection:s};await vo.mkdir(Id,{recursive:!0}),await vo.writeFile(Fa,JSON.stringify(e,null,2))}async function cw(){try{await vo.unlink(Fa)}catch{}}var Id,Fa,aw,La=y(()=>{"use strict";Id=Ed.join(iw.homedir(),".prjct-cli","cache"),Fa=Ed.join(Id,"providers.json"),aw=600*1e3;l(_a,"readProviderCache");l(Na,"writeProviderCache");l(cw,"invalidateProviderCache")});var ut={};he(ut,{AntigravityProvider:()=>Ha,ClaudeProvider:()=>xo,CodexProvider:()=>Ga,CursorProvider:()=>Rd,GeminiProvider:()=>Ua,Providers:()=>Me,WindsurfProvider:()=>$d,detectAllProviders:()=>cn,detectAntigravity:()=>Ss,detectCodex:()=>za,detectCursorProject:()=>Fd,detectProvider:()=>To,detectWindsurfProject:()=>_d,getActiveProvider:()=>pw,getCommandsDir:()=>kw,getGlobalContextPath:()=>hw,getGlobalSettingsPath:()=>yw,getProjectCommandsPath:()=>Sw,getProviderBranding:()=>Eo,getSkillsPath:()=>ww,hasProviderConfig:()=>mw,needsCursorRouterRegeneration:()=>gw,needsWindsurfRouterRegeneration:()=>fw,selectProvider:()=>Wa,validateCliVersion:()=>Od});import{exec as lw}from"node:child_process";import kn from"node:os";import Ge from"node:path";import{promisify as uw}from"node:util";async function Md(s){try{let{stdout:e}=await jd(`which ${s}`,{timeout:Dd});return e.trim()}catch{return null}}async function dw(s){try{let{stdout:e}=await jd(`${s} --version`,{timeout:Dd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function To(s){let e=Me[s];if(!e.cliCommand)return{installed:!1};let t=await Md(e.cliCommand);if(!t)return{installed:!1};let n=await dw(e.cliCommand),r=Od(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function Od(s,e){let t=Me[s];return!t.minCliVersion||!e?null:kd(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 cn(s=!1){if(!s){let r=await _a();if(r)return r}let[e,t]=await Promise.all([To("claude"),To("gemini")]),n={claude:e,gemini:t};return await Na(n).catch(()=>{}),n}async function pw(s){if(s&&Me[s])return Me[s];let e=await cn();return e.claude.installed&&!e.gemini.installed?xo:e.gemini.installed&&!e.claude.installed?Ua:xo}async function mw(s){let e=Me[s];return e.configDir?x(e.configDir):!1}function Eo(s){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"}[s]||"\u26A1 prjct"}}async function Fd(s){let e=Ge.join(s,".cursor"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function gw(s){let e=await Fd(s);return e.detected&&!e.routerInstalled}async function _d(s){let e=Ge.join(s,".windsurf"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function fw(s){let e=await _d(s);return e.detected&&!e.routerInstalled}async function Ss(){let s=Ha.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=Ge.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([x(s),x(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function za(){let s=Ga.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Md("codex"),t=Ge.join(s,"skills","prjct","SKILL.md"),[n,r]=await Promise.all([x(s),x(t)]),o=!!e||n;return{installed:o,skillInstalled:r,configPath:o?s:void 0}}function hw(s){let e=Me[s];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function yw(s){let e=Me[s];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function ww(s){return Me[s].skillsDir}function kw(s){return Me[s].commandsDir}function Sw(s,e){let t=Me[s];return Ge.join(e,t.commandsDir)}async function Wa(){let s=await cn(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var jd,Dd,xo,Ua,Ha,Rd,$d,Ga,Me,Je=y(()=>{"use strict";Sr();ve();La();jd=uw(lw),Dd=2e3,xo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(kn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(kn.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"},Ua={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(kn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(kn.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"},Ha={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(kn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(kn.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},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},$d={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},Ga={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(kn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(kn.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},Me={claude:xo,gemini:Ua,cursor:Rd,antigravity:Ha,windsurf:$d,codex:Ga};l(Md,"whichCommand");l(dw,"getCliVersion");l(To,"detectProvider");l(Od,"validateCliVersion");l(cn,"detectAllProviders");l(pw,"getActiveProvider");l(mw,"hasProviderConfig");l(Eo,"getProviderBranding");l(Fd,"detectCursorProject");l(gw,"needsCursorRouterRegeneration");l(_d,"detectWindsurfProject");l(fw,"needsWindsurfRouterRegeneration");l(Ss,"detectAntigravity");l(za,"detectCodex");l(hw,"getGlobalContextPath");l(yw,"getGlobalSettingsPath");l(ww,"getSkillsPath");l(kw,"getCommandsDir");l(Sw,"getProjectCommandsPath");l(Wa,"selectProvider")});import{z as ke}from"zod";function bw(s){return s instanceof bs}function re(s){return bw(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var Cs,HI,GI,zI,WI,BI,VI,bs,Io,Ao,Cr,ln=y(()=>{"use strict";Cs={create(s,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${s}: ${JSON.stringify(o)}`),this.name=s,this.errorName=s,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===s}static create(r){return new t(r)}}return t}},HI=Cs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),GI=Cs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),zI=Cs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),WI=Cs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),BI=Cs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),VI=Cs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),bs=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 s extends bs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ao=class s extends bs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Cr=class s extends bs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(bw,"isPrjctError");l(re,"getErrorMessage")});var B={};he(B,{calculateDuration:()=>jw,formatDate:()=>jo,formatDuration:()=>Pr,formatMonth:()=>Pw,getDateKey:()=>vw,getDateRange:()=>Ew,getDaysAgo:()=>Sn,getDaysFromNow:()=>Tw,getEndOfDay:()=>Rw,getStartOfDay:()=>Dw,getTimestamp:()=>C,getTodayKey:()=>Nd,getYearMonthDay:()=>Ba,isToday:()=>Iw,isWithinLastDays:()=>Aw,parseDate:()=>xw,toRelative:()=>$w});import{formatDistanceToNowStrict as Cw}from"date-fns";function jo(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Pw(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Nd(){return jo(new Date)}function vw(s){return jo(s)}function Ba(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function xw(s){return new Date(s)}function C(){return new Date().toISOString()}function Sn(s){let e=new Date;return e.setDate(e.getDate()-s),e}function Tw(s){let e=new Date;return e.setDate(e.getDate()+s),e}function Ew(s,e){let t=[],n=new Date(s);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Iw(s){return jo(s)===Nd()}function Aw(s,e){let t=Sn(e);return s>=t}function Pr(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function jw(s,e=new Date){let t=e.getTime()-s.getTime();return Pr(t)}function Dw(s){let e=new Date(s);return e.setHours(0,0,0,0),e}function Rw(s){let e=new Date(s);return e.setHours(23,59,59,999),e}function $w(s){let e=typeof s=="string"?new Date(s):s;return Cw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(jo,"formatDate");l(Pw,"formatMonth");l(Nd,"getTodayKey");l(vw,"getDateKey");l(Ba,"getYearMonthDay");l(xw,"parseDate");l(C,"getTimestamp");l(Sn,"getDaysAgo");l(Tw,"getDaysFromNow");l(Ew,"getDateRange");l(Iw,"isToday");l(Aw,"isWithinLastDays");l(Pr,"formatDuration");l(jw,"calculateDuration");l(Dw,"getStartOfDay");l(Rw,"getEndOfDay");l($w,"toRelative")});var $o={};he($o,{PACKAGE_ROOT:()=>de,VERSION:()=>Pe,compareVersions:()=>Ld,getPackageInfo:()=>Mw,getPackageRoot:()=>qa,getVersion:()=>xr,isCompatible:()=>Ow,needsMigration:()=>Fw});import Va from"node:fs";import Ro from"node:path";function qa(){if(vr)return vr;let s=__dirname;for(let e=0;e<5;e++){let t=Ro.join(s,"package.json");if(Va.existsSync(t))try{if(JSON.parse(Va.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=s,s}catch{}s=Ro.dirname(s)}return vr=Ro.join(__dirname,"..","..",".."),vr}function xr(){if(Do)return Do;try{let s=Ro.join(qa(),"package.json"),e=JSON.parse(Va.readFileSync(s,"utf-8"));return Do=e.version,Ja=e,Do}catch(s){return console.error("Failed to read version from package.json:",w(s)),"0.0.0"}}function Mw(){return Ja||xr(),Ja}function Ld(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<Math.max(t.length,n.length);r++){let o=t[r]||0,i=n[r]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Ow(s){let e=xr(),[t,n]=e.split(".").map(Number),[r,o]=s.split(".").map(Number);return t===r&&n===o}function Fw(s,e=null){let t=e||xr();return Ld(s,t)<0}var Do,Ja,vr,Pe,de,dt=y(()=>{"use strict";N();Do=null,Ja=null,vr=null;l(qa,"getPackageRoot");l(xr,"getVersion");l(Mw,"getPackageInfo");l(Ld,"compareVersions");l(Ow,"isCompatible");l(Fw,"needsMigration");Pe=xr(),de=qa()});import{exec as _w}from"node:child_process";import{promisify as Nw}from"node:util";async function Mo(s){try{let{stdout:e}=await Lw(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Uw(){let s=await Mo("gh api user --jq .login");return s.success&&s.output||(s=await Mo("git config --global github.user"),s.success&&s.output)?s.output:null}async function Hw(){let s=await Mo("git config user.name");return s.success&&s.output?s.output:null}async function Gw(){let s=await Mo("git config user.email");return s.success&&s.output?s.output:null}async function Ps(){let[s,e,t]=await Promise.all([Uw(),Hw(),Gw()]);return{github:s,email:t,name:e||s||"Unknown"}}var Lw,Oo=y(()=>{"use strict";Lw=Nw(_w);l(Mo,"execCommand");l(Uw,"detectGitHubUsername");l(Hw,"detectGitName");l(Gw,"detectGitEmail");l(Ps,"detect")});import zw from"node:crypto";import Qt from"node:fs/promises";import Ya from"node:os";import G from"node:path";import{globSync as Ww}from"glob";var Xa,Bw,I,Se=y(()=>{"use strict";le();ve();Xa=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?G.resolve(e):G.join(Ya.homedir(),".prjct-cli"),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=G.resolve(e),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}generateProjectId(e){return zw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return G.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return G.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return G.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return G.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Po(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await Nt(this.globalBaseDir),await Nt(this.globalProjectsDir),await Nt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let r of n)await Nt(G.join(t,r));return await Nt(G.join(t,"planning","tasks")),await Nt(G.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=Ba(t);return G.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Nt(n),n}async listSessions(e,t=null,n=null){let r=G.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=G.join(r,a.name),u=await Qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=G.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:G.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return G.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Po(t)}getDisplayPath(e){let t=Ya.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return G.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return G.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return G.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return G.join(this.globalBaseDir,".running")}getDocsPath(){return G.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),xt(ut)).getActiveProvider();return(Je(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return G.join(Ya.homedir(),".claude")}getClaudeSettingsPath(){return G.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?G.join(this.getGlobalProjectPath(e),"agents"):G.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return G.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return G.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of n){let o=G.join(e,r.file);if(await x(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=G.join(e,"package.json");if(await x(r))try{let o=await Qt.readFile(r,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],r=[];try{if(t==="pnpm"){let i=(await Qt.readFile(G.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
|
|
13
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=
|
|
14
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=
|
|
15
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:Pe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=
|
|
7
|
+
var Wy=Object.create;var Cr=Object.defineProperty;var By=Object.getOwnPropertyDescriptor;var Vy=Object.getOwnPropertyNames;var Jy=Object.getPrototypeOf,qy=Object.prototype.hasOwnProperty;var l=(r,e)=>Cr(r,"name",{value:e,configurable:!0}),vr=(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 y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ky=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),we=(r,e)=>{for(var t in e)Cr(r,t,{get:e[t],enumerable:!0})},bd=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Vy(e))!qy.call(r,s)&&s!==t&&Cr(r,s,{get:()=>e[s],enumerable:!(n=By(e,s))||n.enumerable});return r};var Yy=(r,e,t)=>(t=r!=null?Wy(Jy(r)):{},bd(e||!r||!r.__esModule?Cr(t,"default",{value:r,enumerable:!0}):t,r)),It=r=>bd(Cr({},"__esModule",{value:!0}),r);var Cd={};we(Cd,{DAEMON_PATHS:()=>Ge,IDLE_TIMEOUT_MS:()=>Ha,decodeMessage:()=>Xy,encodeMessage:()=>Ss});function Ss(r){return Buffer.from(`${JSON.stringify(r)}
|
|
8
|
+
`)}function Xy(r){return JSON.parse(r.trim())}var Ge,Ha,Po=y(()=>{"use strict";Ge={runDir:l(()=>`${process.env.HOME||vr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ge.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ge.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ge.runDir()}/daemon.log`,"log")},Ha=1800*1e3;l(Ss,"encodeMessage");l(Xy,"decodeMessage")});var bs={};we(bs,{executeViaDaemon:()=>ew,getDaemonStatus:()=>Zy,isDaemonRunning:()=>vd,sendRequest:()=>xr,spawnDaemon:()=>xd,stopDaemon:()=>tw});import To from"node:crypto";import At from"node:fs";import{connect as Qy}from"node:net";async function vd(){let r=Ge.socket();if(!At.existsSync(r))return!1;try{return(await xr({id:To.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{At.unlinkSync(r)}catch{}return!1}}async function Zy(){let r=Ge.socket(),e=Ge.pid();if(!At.existsSync(r))return{running:!1};try{let t=await xr({id:To.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return At.existsSync(e)?{running:!1,pid:parseInt(At.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function xr(r){return new Promise((e,t)=>{let n=Ge.socket(),s=Qy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(Ss(r))}),s.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 m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ew(r,e,t,n,s,o=!0){let i=Ge.socket();if(!At.existsSync(i))return o&&xd().catch(()=>{}),null;try{return await xr({id:To.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function tw(){try{return(await xr({id:To.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function xd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(At.existsSync(t))o=t,i="bun";else if(At.existsSync(n))o=n,i="node";else if(At.existsSync(s))o=s,i="node";else return!1;let a=Ge.runDir();At.mkdirSync(a,{recursive:!0});let c=Ge.log(),u=At.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),At.closeSync(u),await new Promise(m=>setTimeout(m,500)),vd()}var Cs=y(()=>{"use strict";Po();l(vd,"isDaemonRunning");l(Zy,"getDaemonStatus");l(xr,"sendRequest");l(ew,"executeViaDaemon");l(tw,"stopDaemon");l(xd,"spawnDaemon")});import{z as Zt}from"zod";function Pd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var TI,EI,II,Pr,AI,Tr=y(()=>{"use strict";TI=Zt.enum(["opus","sonnet","haiku"]),EI=Zt.enum(["2.5-pro","2.5-flash","2.0-flash"]),II=Zt.string().min(1),Pr=Zt.object({provider:Zt.string(),model:Zt.string(),cliVersion:Zt.string().optional(),recordedAt:Zt.string()}),AI=Zt.object({preferredModel:Zt.string().optional(),lastAnalysisModel:Pr.optional()});l(Pd,"compareSemver")});function Td(r){return r instanceof Error&&"code"in r}function v(r){return Td(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function Eo(r){if(r instanceof Error)return r.stack}var N=y(()=>{"use strict";l(Td,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(Eo,"getErrorStack")});import Ad from"node:fs/promises";async function jd(r,e){let t;try{t=await Ad.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ed(r,t),Id(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ed(r,t),Id(r,nw(s.error)),null)}async function Ed(r,e){let t=`${r}.backup`;try{await Ad.writeFile(t,e,"utf-8")}catch{}}function Id(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 nw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Dd=y(()=>{"use strict";N();l(jd,"safeRead");l(Ed,"createBackup");l(Id,"logCorruption");l(nw,"formatZodError")});var ue={};we(ue,{appendLine:()=>Ua,appendToFile:()=>rw,atomicWrite:()=>sw,copyFile:()=>uw,deleteDir:()=>aw,deleteFile:()=>iw,dirExists:()=>Io,ensureDir:()=>Lt,fileExists:()=>P,getFileExtension:()=>gw,getFileModifiedTime:()=>lw,getFileNameWithoutExtension:()=>fw,getFileSize:()=>cw,listFiles:()=>Ps,moveFile:()=>dw,prependToFile:()=>ow,readFile:()=>xs,readJson:()=>zn,readLines:()=>pw,writeFile:()=>Rd,writeJson:()=>Er,writeLines:()=>mw});import be from"node:fs/promises";import vs from"node:path";async function zn(r,e=null,t){if(t)return await jd(r,t)??e;try{let n=await be.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function Er(r,e,t=2){let n=JSON.stringify(e,null,t);await be.writeFile(r,n,"utf-8")}async function xs(r,e=""){try{return await be.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function Rd(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.writeFile(r,e,"utf-8")}async function sw(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await be.writeFile(n,e,"utf-8"),await be.rename(n,r)}async function rw(r,e){await be.appendFile(r,e,"utf-8")}async function Ua(r,e){let t=vs.dirname(r);await be.mkdir(t,{recursive:!0}),await be.appendFile(r,`${e}
|
|
10
|
+
`,"utf-8")}async function ow(r,e){try{let t=await be.readFile(r,"utf-8");await be.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await be.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await be.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function Io(r){try{return(await be.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Lt(r){await be.mkdir(r,{recursive:!0})}async function iw(r){try{return await be.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function aw(r){try{return await be.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function Ps(r,e={}){try{let n=await be.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function cw(r){return(await be.stat(r)).size}async function lw(r){return(await be.stat(r)).mtime}async function uw(r,e){await be.copyFile(r,e)}async function dw(r,e){await be.rename(r,e)}async function pw(r){return(await xs(r,"")).split(`
|
|
11
|
+
`)}async function mw(r,e){let t=e.join(`
|
|
12
|
+
`);await Rd(r,t)}function gw(r){return vs.extname(r)}function fw(r){return vs.basename(r,vs.extname(r))}var Te=y(()=>{"use strict";Dd();N();l(zn,"readJson");l(Er,"writeJson");l(xs,"readFile");l(Rd,"writeFile");l(sw,"atomicWrite");l(rw,"appendToFile");l(Ua,"appendLine");l(ow,"prependToFile");l(P,"fileExists");l(Io,"dirExists");l(Lt,"ensureDir");l(iw,"deleteFile");l(aw,"deleteDir");l(Ps,"listFiles");l(cw,"getFileSize");l(lw,"getFileModifiedTime");l(uw,"copyFile");l(dw,"moveFile");l(pw,"readLines");l(mw,"writeLines");l(gw,"getFileExtension");l(fw,"getFileNameWithoutExtension")});var Od={};we(Od,{invalidateProviderCache:()=>ww,readProviderCache:()=>za,writeProviderCache:()=>Wa});import Ao from"node:fs/promises";import hw from"node:os";import $d from"node:path";async function za(){try{let r=await Ao.readFile(Ga,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>yw?null:e.detection}catch{return null}}async function Wa(r){let e={timestamp:new Date().toISOString(),detection:r};await Ao.mkdir(Md,{recursive:!0}),await Ao.writeFile(Ga,JSON.stringify(e,null,2))}async function ww(){try{await Ao.unlink(Ga)}catch{}}var Md,Ga,yw,Ba=y(()=>{"use strict";Md=$d.join(hw.homedir(),".prjct-cli","cache"),Ga=$d.join(Md,"providers.json"),yw=600*1e3;l(za,"readProviderCache");l(Wa,"writeProviderCache");l(ww,"invalidateProviderCache")});var mt={};we(mt,{AntigravityProvider:()=>Ja,ClaudeProvider:()=>jo,CodexProvider:()=>qa,CursorProvider:()=>Nd,GeminiProvider:()=>Va,Providers:()=>Oe,WindsurfProvider:()=>Ld,detectAllProviders:()=>un,detectAntigravity:()=>Ts,detectCodex:()=>Ka,detectCursorProject:()=>Gd,detectProvider:()=>Do,detectWindsurfProject:()=>zd,getActiveProvider:()=>Cw,getCommandsDir:()=>Aw,getGlobalContextPath:()=>Tw,getGlobalSettingsPath:()=>Ew,getProjectCommandsPath:()=>jw,getProviderBranding:()=>Ro,getSkillsPath:()=>Iw,hasProviderConfig:()=>vw,needsCursorRouterRegeneration:()=>xw,needsWindsurfRouterRegeneration:()=>Pw,selectProvider:()=>Ya,validateCliVersion:()=>Ud});import{exec as kw}from"node:child_process";import bn from"node:os";import ze from"node:path";import{promisify as Sw}from"node:util";async function Hd(r){try{let{stdout:e}=await Fd(`which ${r}`,{timeout:_d});return e.trim()}catch{return null}}async function bw(r){try{let{stdout:e}=await Fd(`${r} --version`,{timeout:_d}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Do(r){let e=Oe[r];if(!e.cliCommand)return{installed:!1};let t=await Hd(e.cliCommand);if(!t)return{installed:!1};let n=await bw(e.cliCommand),s=Ud(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Ud(r,e){let t=Oe[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 un(r=!1){if(!r){let s=await za();if(s)return s}let[e,t]=await Promise.all([Do("claude"),Do("gemini")]),n={claude:e,gemini:t};return await Wa(n).catch(()=>{}),n}async function Cw(r){if(r&&Oe[r])return Oe[r];let e=await un();return e.claude.installed&&!e.gemini.installed?jo:e.gemini.installed&&!e.claude.installed?Va:jo}async function vw(r){let e=Oe[r];return e.configDir?P(e.configDir):!1}function Ro(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Gd(r){let e=ze.join(r,".cursor"),t=ze.join(e,"rules"),n=ze.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function xw(r){let e=await Gd(r);return e.detected&&!e.routerInstalled}async function zd(r){let e=ze.join(r,".windsurf"),t=ze.join(e,"rules"),n=ze.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Pw(r){let e=await zd(r);return e.detected&&!e.routerInstalled}async function Ts(){let r=Ja.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ze.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Ka(){let r=qa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Hd("codex"),t=ze.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([P(r),P(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Tw(r){let e=Oe[r];return e.configDir?ze.join(e.configDir,e.contextFile):null}function Ew(r){let e=Oe[r];return!e.configDir||!e.settingsFile?null:ze.join(e.configDir,e.settingsFile)}function Iw(r){return Oe[r].skillsDir}function Aw(r){return Oe[r].commandsDir}function jw(r,e){let t=Oe[r];return ze.join(e,t.commandsDir)}async function Ya(){let r=await un(),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 Fd,_d,jo,Va,Ja,Nd,Ld,qa,Oe,Je=y(()=>{"use strict";Tr();Te();Ba();Fd=Sw(kw),_d=2e3,jo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ze.join(bn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ze.join(bn.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"},Va={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ze.join(bn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ze.join(bn.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"},Ja={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ze.join(bn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ze.join(bn.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},Nd={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},Ld={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},qa={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ze.join(bn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ze.join(bn.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},Oe={claude:jo,gemini:Va,cursor:Nd,antigravity:Ja,windsurf:Ld,codex:qa};l(Hd,"whichCommand");l(bw,"getCliVersion");l(Do,"detectProvider");l(Ud,"validateCliVersion");l(un,"detectAllProviders");l(Cw,"getActiveProvider");l(vw,"hasProviderConfig");l(Ro,"getProviderBranding");l(Gd,"detectCursorProject");l(xw,"needsCursorRouterRegeneration");l(zd,"detectWindsurfProject");l(Pw,"needsWindsurfRouterRegeneration");l(Ts,"detectAntigravity");l(Ka,"detectCodex");l(Tw,"getGlobalContextPath");l(Ew,"getGlobalSettingsPath");l(Iw,"getSkillsPath");l(Aw,"getCommandsDir");l(jw,"getProjectCommandsPath");l(Ya,"selectProvider")});import{z as Ce}from"zod";function Dw(r){return r instanceof Es}function re(r){return Dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Is,nA,sA,rA,oA,iA,aA,Es,$o,Mo,Ir,dn=y(()=>{"use strict";Is={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},nA=Is.create("FileError",Ce.object({path:Ce.string(),operation:Ce.enum(["read","write","delete","create","copy"]),reason:Ce.string().optional()})),sA=Is.create("ValidationError",Ce.object({field:Ce.string(),expected:Ce.string(),received:Ce.string().optional(),message:Ce.string().optional()})),rA=Is.create("PermissionError",Ce.object({action:Ce.string(),resource:Ce.string(),reason:Ce.string().optional()})),oA=Is.create("TaskError",Ce.object({taskId:Ce.string().optional(),operation:Ce.enum(["create","update","complete","pause","resume","delete"]),reason:Ce.string()})),iA=Is.create("SessionError",Ce.object({sessionId:Ce.string().optional(),reason:Ce.string()})),aA=Is.create("SyncError",Ce.object({projectId:Ce.string().optional(),operation:Ce.enum(["push","pull","auth","connect"]),reason:Ce.string()})),Es=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)}},$o=class r extends Es{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")}},Mo=class r extends Es{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")}},Ir=class r extends Es{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(Dw,"isPrjctError");l(re,"getErrorMessage")});var z={};we(z,{calculateDuration:()=>Hw,formatDate:()=>Oo,formatDuration:()=>pn,formatMonth:()=>$w,getDateKey:()=>Mw,getDateRange:()=>_w,getDaysAgo:()=>Cn,getDaysFromNow:()=>Fw,getEndOfDay:()=>Gw,getStartOfDay:()=>Uw,getTimestamp:()=>C,getTodayKey:()=>Wd,getYearMonthDay:()=>Xa,isToday:()=>Nw,isWithinLastDays:()=>Lw,parseDate:()=>Ow,toRelative:()=>zw});import{formatDistanceToNowStrict as Rw}from"date-fns";function Oo(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function $w(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Wd(){return Oo(new Date)}function Mw(r){return Oo(r)}function Xa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Ow(r){return new Date(r)}function C(){return new Date().toISOString()}function Cn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Fw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function _w(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Nw(r){return Oo(r)===Wd()}function Lw(r,e){let t=Cn(e);return r>=t}function pn(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Hw(r,e=new Date){let t=e.getTime()-r.getTime();return pn(t)}function Uw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Gw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function zw(r){let e=typeof r=="string"?new Date(r):r;return Rw(e,{addSuffix:!0})}var ae=y(()=>{"use strict";l(Oo,"formatDate");l($w,"formatMonth");l(Wd,"getTodayKey");l(Mw,"getDateKey");l(Xa,"getYearMonthDay");l(Ow,"parseDate");l(C,"getTimestamp");l(Cn,"getDaysAgo");l(Fw,"getDaysFromNow");l(_w,"getDateRange");l(Nw,"isToday");l(Lw,"isWithinLastDays");l(pn,"formatDuration");l(Hw,"calculateDuration");l(Uw,"getStartOfDay");l(Gw,"getEndOfDay");l(zw,"toRelative")});var No={};we(No,{PACKAGE_ROOT:()=>pe,VERSION:()=>Pe,compareVersions:()=>Bd,getPackageInfo:()=>Ww,getPackageRoot:()=>ec,getVersion:()=>Wn,isCompatible:()=>Bw,needsMigration:()=>Vw});import Qa from"node:fs";import _o from"node:path";function ec(){if(Ar)return Ar;let r=__dirname;for(let e=0;e<5;e++){let t=_o.join(r,"package.json");if(Qa.existsSync(t))try{if(JSON.parse(Qa.readFileSync(t,"utf-8")).name==="prjct-cli")return Ar=r,r}catch{}r=_o.dirname(r)}return Ar=_o.join(__dirname,"..","..",".."),Ar}function Wn(){if(Fo)return Fo;try{let r=_o.join(ec(),"package.json"),e=JSON.parse(Qa.readFileSync(r,"utf-8"));return Fo=e.version,Za=e,Fo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Ww(){return Za||Wn(),Za}function Bd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Bw(r){let e=Wn(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Vw(r,e=null){let t=e||Wn();return Bd(r,t)<0}var Fo,Za,Ar,Pe,pe,lt=y(()=>{"use strict";N();Fo=null,Za=null,Ar=null;l(ec,"getPackageRoot");l(Wn,"getVersion");l(Ww,"getPackageInfo");l(Bd,"compareVersions");l(Bw,"isCompatible");l(Vw,"needsMigration");Pe=Wn(),pe=ec()});import{exec as Jw}from"node:child_process";import{promisify as qw}from"node:util";async function Lo(r){try{let{stdout:e}=await Kw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Yw(){let r=await Lo("gh api user --jq .login");return r.success&&r.output||(r=await Lo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Xw(){let r=await Lo("git config user.name");return r.success&&r.output?r.output:null}async function Qw(){let r=await Lo("git config user.email");return r.success&&r.output?r.output:null}async function As(){let[r,e,t]=await Promise.all([Yw(),Xw(),Qw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Kw,Ho=y(()=>{"use strict";Kw=qw(Jw);l(Lo,"execCommand");l(Yw,"detectGitHubUsername");l(Xw,"detectGitName");l(Qw,"detectGitEmail");l(As,"detect")});import Zw from"node:crypto";import en from"node:fs/promises";import nc from"node:os";import W from"node:path";import{globSync as ek}from"glob";var sc,tk,E,ke=y(()=>{"use strict";ae();Te();sc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?W.resolve(e):W.join(nc.homedir(),".prjct-cli"),this.globalProjectsDir=W.join(this.globalBaseDir,"projects"),this.globalConfigDir=W.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=W.resolve(e),this.globalProjectsDir=W.join(this.globalBaseDir,"projects"),this.globalConfigDir=W.join(this.globalBaseDir,"config")}generateProjectId(e){return Zw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return W.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return W.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return W.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return W.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Io(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Lt(this.globalBaseDir),await Lt(this.globalProjectsDir),await Lt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Lt(W.join(t,s));return await Lt(W.join(t,"planning","tasks")),await Lt(W.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Xa(t);return W.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Lt(n),n}async listSessions(e,t=null,n=null){let s=W.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await en.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=W.join(s,a.name),u=await en.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=W.join(c,d.name),p=await en.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:W.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return W.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await en.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 Io(t)}getDisplayPath(e){let t=nc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return W.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return W.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return W.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return W.join(this.globalBaseDir,".running")}getDocsPath(){return W.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),It(mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),It(mt)).getActiveProvider();return(Je(),It(mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return W.join(nc.homedir(),".claude")}getClaudeSettingsPath(){return W.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?W.join(this.getGlobalProjectPath(e),"agents"):W.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return W.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return W.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=W.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=W.join(e,"package.json");if(await P(s))try{let o=await en.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await en.readFile(W.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
13
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=W.join(e,"package.json"),i=await en.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=W.join(e,"lerna.json");if(await P(c)){let u=await en.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=W.join(e,"package.json"),i=await en.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=ek(o,{cwd:e,absolute:!1});for(let a of i){let c=W.join(e,a),u=W.join(c,"package.json");if(await P(u))try{let d=await en.readFile(u,"utf-8"),m=JSON.parse(d),p=W.join(c,"PRJCT.md");n.push({name:m.name||W.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=W.resolve(e);for(let s of t.packages){let o=W.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=W.resolve(e),n=W.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=W.dirname(t)}return null}},tk=new sc,E=tk});var Jd={};we(Jd,{default:()=>$});import Bn from"node:fs/promises";import nk from"node:path";import*as Uo from"jsonc-parser";function Vd(r){let e=[],t=Uo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Uo.printParseErrorCode(n.error)}`)}return t}var rc,sk,$,qe=y(()=>{"use strict";dn();N();ae();lt();Ho();ke();l(Vd,"parseJsonc");rc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=E.getLocalConfigPath(e),n=await Bn.readFile(t,"utf-8");return Vd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${re(t)}`),null}}async writeConfig(e,t){let n=E.getLocalConfigPath(e),s=E.getLegacyPrjctPath(e);await Bn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Bn.writeFile(n,`${o}
|
|
14
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=E.getGlobalProjectConfigPath(e),n=await Bn.readFile(t,"utf-8");return Vd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${re(t)}`),null}}async writeGlobalConfig(e,t){let n=E.getGlobalProjectConfigPath(e),s=E.getGlobalProjectPath(e);await Bn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Bn.writeFile(n,`${o}
|
|
15
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:Pe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=E.generateProjectId(e),s=E.getGlobalProjectPath(n),o=E.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Pe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await E.hasLegacyStructure(e))return!1;if(!await E.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=E.getGlobalProjectPath(s.projectId);try{return(await Bn.readdir(nk.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:E.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await As(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=E.generateProjectId(e);return{projectId:n,dataPath:E.getDisplayPath(E.getGlobalProjectPath(n))}}},sk=new rc,$=sk});var Kd={};we(Kd,{default:()=>ic});import js from"node:fs/promises";import rk from"node:os";import qd from"node:path";var oc,ok,ic,ac=y(()=>{"use strict";N();oc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=rk.homedir(),this.configDir=qd.join(this.homeDir,".prjct-cli","config"),this.configFile=qd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await js.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await js.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await js.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await js.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await js.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await js.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},ok=new oc,ic=ok});function ik(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function jr(){return ik()==="bun"}var cc=y(()=>{"use strict";l(ik,"detectRuntime");l(jr,"isBun")});import lc from"node:fs";import Yd from"node:path";function ak(r){if(jr()){let{Database:s}=vr("bun:sqlite");return new s(r,{create:!0})}let e=vr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var ck,Go,R,q,fe=y(()=>{"use strict";ke();cc();l(ak,"openDatabase");ck=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
16
16
|
-- =======================================================================
|
|
17
17
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
18
18
|
-- =======================================================================
|
|
@@ -226,7 +226,7 @@ var My=Object.create;var hr=Object.defineProperty;var Oy=Object.getOwnPropertyDe
|
|
|
226
226
|
started_at TEXT,
|
|
227
227
|
ended_at TEXT
|
|
228
228
|
);
|
|
229
|
-
`)},"up")},{version:2,name:"archives-table",up:l(
|
|
229
|
+
`)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
|
|
230
230
|
-- =======================================================================
|
|
231
231
|
-- Archives: Stale data moved out of active storage (PRJ-267)
|
|
232
232
|
-- =======================================================================
|
|
@@ -243,13 +243,13 @@ var My=Object.create;var hr=Object.defineProperty;var Oy=Object.getOwnPropertyDe
|
|
|
243
243
|
CREATE INDEX idx_archives_entity_type ON archives(entity_type);
|
|
244
244
|
CREATE INDEX idx_archives_archived_at ON archives(archived_at);
|
|
245
245
|
CREATE INDEX idx_archives_entity_id ON archives(entity_id);
|
|
246
|
-
`)},"up")}],
|
|
246
|
+
`)},"up")}],Go=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Yd.join(E.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Yd.dirname(n);lc.existsSync(s)||lc.mkdirSync(s,{recursive:!0});let o=ak(n);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 = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return lc.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,n){let s=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.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,n,s){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
|
|
247
247
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
248
248
|
version INTEGER PRIMARY KEY,
|
|
249
249
|
name TEXT NOT NULL,
|
|
250
250
|
applied_at TEXT NOT NULL
|
|
251
251
|
)
|
|
252
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Qw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},M=new _o,q=M});var Bd=y(()=>{"use strict"});import Er from"node:fs/promises";import bn from"node:path";import{z as ue}from"zod";async function sk(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=bn.join(e,"package.json"),r=await Er.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rk(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await ck(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=nk[a];if(!c)continue;c.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ok(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,c=bn.join(e,a);try{await Er.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.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: ${r.join(", ")}`,durationMs:Date.now()-t}}async function ik(s,e){let t=Date.now();try{let n=await lk(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ak(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=bn.join(e,o.file);try{await Er.access(i),r.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Vd(s,e){let t=Date.now(),n=await Promise.all([sk(s,e),rk(s,e),ok(s,e),ik(s,e),ak(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function ck(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=bn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(s),Array.from(e)}async function lk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(s),e}var Zw,ek,tk,rc,NA,nk,oc=y(()=>{"use strict";N();Sr();Zw=ue.enum(["draft","verified","sealed"]),ek=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),tk=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),rc=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(ek),antiPatterns:ue.array(tk),analyzedAt:ue.string(),modelMetadata:kr.optional(),status:Zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),NA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},nk={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(sk,"verifyFrameworks");l(rk,"verifyLanguages");l(ok,"verifyPatternLocations");l(ik,"verifyFileCount");l(ak,"verifyAntiPatternFiles");l(Vd,"semanticVerify");l(ck,"getProjectExtensions");l(lk,"countProjectFiles")});import{z as Oe}from"zod";var No,Cn,uk,GA,ic,Jd,Ir=y(()=>{"use strict";No=Oe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Cn=Oe.object({primaryDomain:No,secondaryDomains:Oe.array(No),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),uk=Oe.object({classification:Cn,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),GA=Oe.object({entries:Oe.record(Oe.string(),uk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:Cn,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),ic={entries:{},confirmedPatterns:[]},Jd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as W}from"zod";var dk,pk,qd,mk,gk,fk,hk,yk,Kd,BA,ac=y(()=>{"use strict";dk=W.enum(["low","medium","high"]),pk=W.enum(["pending","converted","completed","archived","dormant"]),qd=W.enum(["high","medium","low"]),mk=W.object({impact:qd,effort:qd}),gk=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),fk=W.object({name:W.string(),description:W.string()}),hk=W.object({name:W.string(),description:W.string().optional()}),yk=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:dk,status:pk,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:mk.optional(),implementationNotes:W.string().optional(),stack:gk.optional(),modules:W.array(fk).optional(),roles:W.array(hk).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Kd=W.object({ideas:W.array(yk),lastUpdated:W.string()}),BA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Xd(s){return{provider:s,lastSync:"",staleAfter:18e5,issues:{}}}var Yd,wk,kk,Sk,bk,KA,YA,cc=y(()=>{"use strict";Yd=Y.enum(["linear","jira","github","monday","asana","none"]),wk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),kk=Y.enum(["none","urgent","high","medium","low"]),Sk=Y.enum(["feature","bug","improvement","task","chore","epic"]),bk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:wk,priority:kk,type:Sk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),KA=Y.object({provider:Yd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),bk)}),YA=Y.object({provider:Yd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Xd,"createEmptyIssues")});var np={};he(np,{AgentAssignmentSchema:()=>Qd,OUTPUT_SCHEMAS:()=>ep,SubtaskBreakdownSchema:()=>Zd,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>lc});import{z as Ke}from"zod";function lc(s){let e=ep[s];return e?`## OUTPUT FORMAT
|
|
252
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of ck)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},R=new Go,q=R});var Xd=y(()=>{"use strict"});import Dr from"node:fs/promises";import vn from"node:path";import{z as de}from"zod";async function mk(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=vn.join(e,"package.json"),s=await Dr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function gk(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await wk(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=pk[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function fk(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=vn.join(e,a);try{await Dr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function hk(r,e){let t=Date.now();try{let n=await kk(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function yk(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],s=[];for(let o of r.antiPatterns){let i=vn.join(e,o.file);try{await Dr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Qd(r,e){let t=Date.now(),n=await Promise.all([mk(r,e),gk(r,e),fk(r,e),hk(r,e),yk(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function wk(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Dr.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=vn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function kk(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Dr.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var lk,uk,dk,uc,ZA,pk,dc=y(()=>{"use strict";N();Tr();lk=de.enum(["draft","verified","sealed"]),uk=de.object({name:de.string(),description:de.string(),location:de.string().optional()}),dk=de.object({issue:de.string(),file:de.string(),suggestion:de.string()}),uc=de.object({projectId:de.string(),languages:de.array(de.string()),frameworks:de.array(de.string()),packageManager:de.string().optional(),sourceDir:de.string().optional(),testDir:de.string().optional(),configFiles:de.array(de.string()),fileCount:de.number(),patterns:de.array(uk),antiPatterns:de.array(dk),analyzedAt:de.string(),modelMetadata:Pr.optional(),status:lk.default("draft"),commitHash:de.string().optional(),signature:de.string().optional(),sealedAt:de.string().optional(),verifiedAt:de.string().optional()}),ZA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},pk={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(mk,"verifyFrameworks");l(gk,"verifyLanguages");l(fk,"verifyPatternLocations");l(hk,"verifyFileCount");l(yk,"verifyAntiPatternFiles");l(Qd,"semanticVerify");l(wk,"getProjectExtensions");l(kk,"countProjectFiles")});import{z as Fe}from"zod";var zo,xn,Sk,sj,pc,Zd,Rr=y(()=>{"use strict";zo=Fe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),xn=Fe.object({primaryDomain:zo,secondaryDomains:Fe.array(zo),confidence:Fe.number().min(0).max(1),filePatterns:Fe.array(Fe.string()),relevantAgents:Fe.array(Fe.string())}),Sk=Fe.object({classification:xn,classifiedAt:Fe.string(),source:Fe.enum(["cache","history","llm","heuristic"]),descriptionHash:Fe.string(),projectId:Fe.string()}),sj=Fe.object({entries:Fe.record(Fe.string(),Sk),confirmedPatterns:Fe.array(Fe.object({descriptionHash:Fe.string(),classification:xn,confirmedAt:Fe.string(),taskDescription:Fe.string()}))}),pc={entries:{},confirmedPatterns:[]},Zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as B}from"zod";var bk,Ck,ep,vk,xk,Pk,Tk,Ek,tp,ij,mc=y(()=>{"use strict";bk=B.enum(["low","medium","high"]),Ck=B.enum(["pending","converted","completed","archived","dormant"]),ep=B.enum(["high","medium","low"]),vk=B.object({impact:ep,effort:ep}),xk=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Pk=B.object({name:B.string(),description:B.string()}),Tk=B.object({name:B.string(),description:B.string().optional()}),Ek=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:bk,status:Ck,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:vk.optional(),implementationNotes:B.string().optional(),stack:xk.optional(),modules:B.array(Pk).optional(),roles:B.array(Tk).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),tp=B.object({ideas:B.array(Ek),lastUpdated:B.string()}),ij={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function sp(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var np,Ik,Ak,jk,Dk,uj,dj,gc=y(()=>{"use strict";np=Y.enum(["linear","jira","github","monday","asana","none"]),Ik=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Ak=Y.enum(["none","urgent","high","medium","low"]),jk=Y.enum(["feature","bug","improvement","task","chore","epic"]),Dk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:Ik,priority:Ak,type:jk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),uj=Y.object({provider:np,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),Dk)}),dj=Y.object({provider:np,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(sp,"createEmptyIssues")});var cp={};we(cp,{AgentAssignmentSchema:()=>rp,OUTPUT_SCHEMAS:()=>ip,SubtaskBreakdownSchema:()=>op,TaskClassificationSchema:()=>xn,renderSchemaForPrompt:()=>fc});import{z as Ke}from"zod";function fc(r){let e=ip[r];return e?`## OUTPUT FORMAT
|
|
253
253
|
|
|
254
254
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
255
255
|
|
|
@@ -258,28 +258,28 @@ ${e.example}
|
|
|
258
258
|
\`\`\`
|
|
259
259
|
|
|
260
260
|
Fields:
|
|
261
|
-
${
|
|
262
|
-
`)}return"(see example above)"}function tp(s){return s instanceof Ke.ZodString?"string":s instanceof Ke.ZodNumber?"number":s instanceof Ke.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof Ke.ZodArray?`array of ${tp(s.element)}`:s instanceof Ke.ZodObject?"object":"any"}var Qd,Zd,ep,Lo=y(()=>{"use strict";Ir();Ir();Qd=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),Zd=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:No,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),ep={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Zd,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(lc,"renderSchemaForPrompt");l(Ck,"describeSchema");l(tp,"describeField")});import{z as E}from"zod";var sp,Pk,vk,rp,xk,Tk,Ek,Ik,Ak,jk,Dk,op,Rk,$k,rj,ip,ap,cp,lp,Mk,Uo,uc=y(()=>{"use strict";sp=E.number().min(1).max(5),Pk=E.enum(["exceeded","met","partial","failed"]),vk=E.enum(["definitely","probably","maybe","no"]),rp=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xk=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:rp.optional(),explanation:E.string().optional()})}),Tk=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),Ek=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Ik=E.object({metrics:E.array(Tk),acceptanceCriteria:E.array(Ek),overallSuccess:Pk,successScore:E.number().min(0).max(100)}),Ak=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),jk=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(Ak)}),Dk=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:vk,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),op=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:sp,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),Rk=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:xk,success:Ik.optional(),learnings:jk,roi:Dk,rating:sp,taskOutcomes:E.array(op).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),$k=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:rp,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),rj=E.object({outcomes:E.array(Rk),taskOutcomes:E.array(op).optional(),aggregates:$k.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),ip={outcomes:[],taskOutcomes:[],lastUpdated:""},ap=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),cp=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),lp=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),Mk=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),Uo=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>Mk(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=s.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:s.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as ze}from"zod";function Uk(){let s={};for(let e of _k)s[e]="allow";for(let e of Nk)s[e]="ask";for(let e of Lk)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Ho,cj,Ok,dc,Fk,lj,_k,Nk,Lk,uj,up=y(()=>{"use strict";Ho=ze.enum(["allow","deny","ask"]),cj=ze.enum(["read","write","delete","create"]),Ok=ze.record(ze.string(),Ho),dc=ze.record(ze.string(),Ho),Fk=ze.object({enabled:ze.boolean().default(!0),allowedDomains:ze.array(ze.string()).optional(),blockedDomains:ze.array(ze.string()).optional()}),lj=ze.object({bash:Ok.optional(),files:ze.object({read:dc.optional(),write:dc.optional(),delete:dc.optional()}).optional(),web:Fk.optional(),skills:ze.record(ze.string(),Ho).optional(),doomLoop:ze.object({enabled:ze.boolean().default(!0),maxRetries:ze.number().default(3)}).optional(),externalDirectories:Ho.default("ask")}),_k=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Lk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Uk,"buildDefaultPermissions");uj=Uk()});import{z as at}from"zod";var gj,fj,dp=y(()=>{"use strict";gj=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),fj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Hk,Gk,zk,Wk,Bk,Vk,Jk,qk,Kk,Yk,Xk,Qk,Zk,eS,tS,nS,sS,rS,kj,Sj,pp=y(()=>{"use strict";Hk=A.enum(["planned","active","completed","shipped"]),Gk=A.enum(["low","medium","high"]),zk=A.enum(["feature","breaking_change","refactor","infrastructure"]),Wk=A.enum(["completed","active","planned"]),Bk=A.enum(["planned","active","completed"]),Vk=A.enum(["git","git-branch","manual","prd"]),Jk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),qk=A.object({id:A.string(),name:A.string(),status:Wk,completedAt:A.string().optional()}),Kk=A.object({goal:A.string(),phases:A.array(qk),successMetrics:A.array(A.string()).optional()}),Yk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),Xk=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),Qk=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Zk=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),eS=A.object({estimated:Qk.nullable(),actual:Zk.nullable()}),tS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),nS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:tS.optional(),status:Bk,startDate:A.string().optional(),endDate:A.string().optional()}),sS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Hk,impact:Gk,effort:A.string().optional(),progress:A.number(),type:zk.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(Jk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Yk.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:Vk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:eS.optional(),valueScore:A.number().optional(),commits:A.array(Xk).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),rS=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),kj=A.object({strategy:Kk.nullable().optional(),features:A.array(sS),backlog:A.array(A.union([A.string(),rS])),lastUpdated:A.string(),quarters:A.array(nS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),Sj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import oS from"node:crypto";import{homedir as iS}from"node:os";import{join as aS}from"node:path";function ge(){return oS.randomUUID()}var cS,mp=y(()=>{"use strict";l(ge,"generateUUID");cS=aS(iS(),".prjct-cli","projects")});import{z as Q}from"zod";var lS,gp,uS,dS,pS,mS,gS,fS,hS,fp,pc=y(()=>{"use strict";lS=Q.enum(["feature","fix","improvement","refactor"]),gp=Q.enum(["pass","warning","fail","skipped"]),uS=Q.enum(["added","changed","fixed","removed"]),dS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),pS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),mS=Q.object({description:Q.string(),type:uS.optional()}),gS=Q.object({lintStatus:gp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:gp.nullable().optional(),testDetails:Q.string().optional()}),fS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),hS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:lS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(mS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:fS.optional(),codeMetrics:pS.optional(),qualityMetrics:gS.optional(),quantitativeImpact:Q.string().optional(),duration:dS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),fp=Q.object({shipped:Q.array(hS),lastUpdated:Q.string()})});import{z as T}from"zod";var yS,yp,wS,kS,SS,mc,wp,bS,CS,kp,hp,PS,vS,Sp,bp,Cp,xS,TS,$j,Go=y(()=>{"use strict";Sr();yS=T.enum(["low","medium","high","critical"]),yp=T.enum(["feature","bug","improvement","chore"]),wS=T.enum(["active","backlog","previously_active"]),kS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),SS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),mc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),wp=T.object({output:T.string().min(1,"Subtask output is required"),summary:mc}),bS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:kS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:mc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),CS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),kp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(bS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:CS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:kr.optional()}),hp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),PS=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),vS=T.object({taskId:T.string(),title:T.string(),classification:yp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(mc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:PS.optional()}),Sp=T.object({currentTask:kp.nullable(),previousTask:hp.nullable().optional(),pausedTasks:T.array(hp).optional(),taskHistory:T.array(vS).optional(),lastUpdated:T.string()}),bp=T.object({id:T.string(),description:T.string(),priority:yS,type:yp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:wS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Cp=T.object({tasks:T.array(bp),lastUpdated:T.string()}),xS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),TS=T.object({type:SS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),$j=T.object({projectId:T.string(),currentTask:kp.nullable(),queue:T.array(bp),stats:xS,recentActivity:T.array(TS),lastSync:T.string()})});import{z as ie}from"zod";var ES,IS,Pp,_j,Nj,Lj,Pn,vp,xs=y(()=>{"use strict";ES=ie.enum(["improving","stable","declining"]),IS=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Pp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),_j=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),Nj=ie.object({sprints:ie.array(IS),averageVelocity:ie.number(),velocityTrend:ES,estimationAccuracy:ie.number(),overEstimated:ie.array(Pp),underEstimated:ie.array(Pp),lastUpdated:ie.string()}),Lj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},vp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Bd();oc();Ir();ac();cc();Lo();Sr();uc();up();dp();pp();mp();pc();Go();xs()});var Zt,gc,kt,vn=y(()=>{"use strict";Lt();le();ye();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},gc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),r=C();return M.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return M.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?M.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):M.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=M.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=M.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(M.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);M.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return M.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new gc});var xp=y(()=>{"use strict"});var zo,Tp=y(()=>{"use strict";zo={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 Ts,Wo=y(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var Ep=y(()=>{"use strict"});var Ip=y(()=>{"use strict";Ep()});function Bo(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var O,Ap,Es=y(()=>{"use strict";O={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"},Ap=["frontend","backend","devops","docs","testing","database","general"];l(Bo,"calculateConfidence")});var fc=y(()=>{"use strict"});var hc=y(()=>{"use strict";xp();Tp();Wo();N();Ip();Es();fc()});function Is(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return RS[s]}var oe,yc,wc,Vo,RS,Et,jp,Ar,un=y(()=>{"use strict";oe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},yc=["feature","spec","design","refactor","migrate"],wc=["ship","cleanup","git","migrate"],Vo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],RS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Is,"getTimeout");Et={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},jp={HISTORY_MAX:100},Ar={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function MS(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if($S.has(s)||s.includes("prjct"))return{level:As.debug,name:"debug"};let e=As[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Jo(s,e,t){return Dp>=s?(...n)=>console[t](e,...n):FS}var As,$S,Dp,OS,FS,_S,U,Gn=y(()=>{"use strict";As={error:0,warn:1,info:2,debug:3},$S=new Set(["1","true","*"]);l(MS,"getLogLevel");({level:Dp,name:OS}=MS()),FS=l(()=>{},"noop");l(Jo,"createLogMethod");_S={error:Jo(As.error,"[prjct:error]","error"),warn:Jo(As.warn,"[prjct:warn]","warn"),info:Jo(As.info,"[prjct:info]","log"),debug:Jo(As.debug,"[prjct:debug]","log"),isEnabled:l(()=>Dp>=0,"isEnabled"),level:l(()=>OS,"level")},U=_S});var qo,NS,Rp=y(()=>{"use strict";ln();ye();hc();un();Gn();qo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=jp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(zo.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(zo.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{M.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",re(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},NS=new qo});var Ko,Yo,$p=y(()=>{"use strict";Se();le();ve();Ko=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Un(t,[])??[];n.push(e),await br(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Un(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await br(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await br(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Un(t,null)}},Yo=new Ko});var kc=y(()=>{"use strict";Rp();$p()});var Ut,Xo=y(()=>{"use strict";Ut=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var We,en=y(()=>{"use strict";kc();Xo();le();ye();We=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ut({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=M.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){M.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Yo.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return M.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Sc,Qe,jr=y(()=>{"use strict";Lt();ac();le();vn();en();Sc=class extends We{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.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:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Sn(Zt.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Qe=new Sc});var bc,xe,Dr=y(()=>{"use strict";Lt();Go();le();vn();en();bc=class extends We{static{l(this,"QueueStorage")}constructor(){super("queue.json",Cp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ge(),createdAt:C(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),r=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Sn(Zt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((r,o)=>{let i=n[r.section]-n[o.section];if(i!==0)return i;let a=t[r.priority]-t[o.priority];return a!==0?a:new Date(r.createdAt).getTime()-new Date(o.createdAt).getTime()})}},xe=new bc});var Cc,pt,Rr=y(()=>{"use strict";Lt();pc();le();vn();en();Cc=class extends We{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",fp)}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((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ge(),shippedAt:C()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Sn(Zt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},pt=new Cc});var $r,Pc,zn,vc=y(()=>{"use strict";$r={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"}},Pc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=$r[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}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 $r[e]}getPrompt(e){return $r[e].prompt}getValidCommands(e){return $r[e].transitions}formatNextSteps(e){return $r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},zn=new Pc});var xc,L,Mr=y(()=>{"use strict";Lt();Go();le();vc();vn();en();xc=class extends We{static{l(this,"StateStorage")}constructor(){super("state.json",Sp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=zn.getCurrentState(e),r=zn.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(u=>u.id===t),o===-1))return null;let i=r[o],a=r.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(r=>r.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));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:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.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(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=wp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
261
|
+
${Rk(e.schema)}`:null}function Rk(r){if(r instanceof Ke.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${ap(n)}`).join(`
|
|
262
|
+
`)}return"(see example above)"}function ap(r){return r instanceof Ke.ZodString?"string":r instanceof Ke.ZodNumber?"number":r instanceof Ke.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ke.ZodArray?`array of ${ap(r.element)}`:r instanceof Ke.ZodObject?"object":"any"}var rp,op,ip,Wo=y(()=>{"use strict";Rr();Rr();rp=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),op=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:zo,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),ip={classification:{schema:xn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:rp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:op,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(fc,"renderSchemaForPrompt");l(Rk,"describeSchema");l(ap,"describeField")});import{z as I}from"zod";var lp,$k,Mk,up,Ok,Fk,_k,Nk,Lk,Hk,Uk,dp,Gk,zk,kj,pp,mp,gp,fp,Wk,Bo,hc=y(()=>{"use strict";lp=I.number().min(1).max(5),$k=I.enum(["exceeded","met","partial","failed"]),Mk=I.enum(["definitely","probably","maybe","no"]),up=I.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Ok=I.object({estimated:I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),source:I.enum(["prd","manual","historical"]).optional()}),actual:I.object({hours:I.number(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional(),sessions:I.number().optional()}),variance:I.object({hours:I.number(),percentage:I.number(),reason:up.optional(),explanation:I.string().optional()})}),Fk=I.object({name:I.string(),baseline:I.number().nullable(),target:I.number(),actual:I.number(),unit:I.string(),achieved:I.boolean(),percentOfTarget:I.number()}),_k=I.object({criteria:I.string(),met:I.boolean(),notes:I.string().optional()}),Nk=I.object({metrics:I.array(Fk),acceptanceCriteria:I.array(_k),overallSuccess:$k,successScore:I.number().min(0).max(100)}),Lk=I.object({category:I.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:I.string(),actionable:I.boolean(),action:I.string().optional()}),Hk=I.object({whatWorked:I.array(I.string()),whatDidnt:I.array(I.string()),surprises:I.array(I.string()),recommendations:I.array(Lk)}),Uk=I.object({valueDelivered:I.number().min(1).max(10),userImpact:I.enum(["none","low","medium","high","critical"]),businessImpact:I.enum(["none","low","medium","high","critical"]),roiScore:I.number(),worthIt:Mk,worthItReason:I.string().optional(),alternativeConsidered:I.string().optional(),betterAlternativeExists:I.boolean().optional()}),dp=I.object({id:I.string(),taskId:I.string(),description:I.string(),estimatedMinutes:I.number().optional(),actualMinutes:I.number(),completedAsPlanned:I.boolean(),qualityScore:lp,blockers:I.array(I.string()),agentUsed:I.string().optional(),skillsUsed:I.array(I.string()).optional(),startedAt:I.string(),completedAt:I.string()}),Gk=I.object({id:I.string(),featureId:I.string(),featureName:I.string(),prdId:I.string().nullable(),version:I.string().optional(),branch:I.string().optional(),prUrl:I.string().optional(),effort:Ok,success:Nk.optional(),learnings:Hk,roi:Uk,rating:lp,taskOutcomes:I.array(dp).optional(),startedAt:I.string(),shippedAt:I.string(),reviewedAt:I.string().optional(),reviewedBy:I.string().optional(),legacy:I.boolean().optional()}),zk=I.object({totalFeatures:I.number(),averageEstimationAccuracy:I.number(),averageSuccessRate:I.number(),averageROI:I.number(),bySuccessLevel:I.object({exceeded:I.number(),met:I.number(),partial:I.number(),failed:I.number()}),variancePatterns:I.array(I.object({reason:up,count:I.number(),averageVariance:I.number()})),topLearnings:I.array(I.object({insight:I.string(),frequency:I.number()}))}),kj=I.object({outcomes:I.array(Gk),taskOutcomes:I.array(dp).optional(),aggregates:zk.optional(),lastUpdated:I.string(),lastAggregated:I.string().optional()}),pp={outcomes:[],taskOutcomes:[],lastUpdated:""},mp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),gp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),fp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Wk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Bo=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=>Wk(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as We}from"zod";function Yk(){let r={};for(let e of Jk)r[e]="allow";for(let e of qk)r[e]="ask";for(let e of Kk)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Vo,vj,Bk,yc,Vk,xj,Jk,qk,Kk,Pj,hp=y(()=>{"use strict";Vo=We.enum(["allow","deny","ask"]),vj=We.enum(["read","write","delete","create"]),Bk=We.record(We.string(),Vo),yc=We.record(We.string(),Vo),Vk=We.object({enabled:We.boolean().default(!0),allowedDomains:We.array(We.string()).optional(),blockedDomains:We.array(We.string()).optional()}),xj=We.object({bash:Bk.optional(),files:We.object({read:yc.optional(),write:yc.optional(),delete:yc.optional()}).optional(),web:Vk.optional(),skills:We.record(We.string(),Vo).optional(),doomLoop:We.object({enabled:We.boolean().default(!0),maxRetries:We.number().default(3)}).optional(),externalDirectories:Vo.default("ask")}),Jk=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],qk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Kk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Yk,"buildDefaultPermissions");Pj=Yk()});import{z as ut}from"zod";var Aj,jj,yp=y(()=>{"use strict";Aj=ut.object({projectId:ut.string(),name:ut.string(),repoPath:ut.string(),description:ut.string().optional(),version:ut.string().optional(),cliVersion:ut.string().optional(),techStack:ut.array(ut.string()),fileCount:ut.number(),commitCount:ut.number(),createdAt:ut.string(),lastSync:ut.string(),lastSyncCommit:ut.string().optional(),lastSyncBranch:ut.string().optional()}),jj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Xk,Qk,Zk,eS,tS,nS,sS,rS,oS,iS,aS,cS,lS,uS,dS,pS,mS,gS,Mj,Oj,wp=y(()=>{"use strict";Xk=A.enum(["planned","active","completed","shipped"]),Qk=A.enum(["low","medium","high"]),Zk=A.enum(["feature","breaking_change","refactor","infrastructure"]),eS=A.enum(["completed","active","planned"]),tS=A.enum(["planned","active","completed"]),nS=A.enum(["git","git-branch","manual","prd"]),sS=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),rS=A.object({id:A.string(),name:A.string(),status:eS,completedAt:A.string().optional()}),oS=A.object({goal:A.string(),phases:A.array(rS),successMetrics:A.array(A.string()).optional()}),iS=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),aS=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),cS=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),lS=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),uS=A.object({estimated:cS.nullable(),actual:lS.nullable()}),dS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),pS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:dS.optional(),status:tS,startDate:A.string().optional(),endDate:A.string().optional()}),mS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Xk,impact:Qk,effort:A.string().optional(),progress:A.number(),type:Zk.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(sS),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:iS.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:nS.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:uS.optional(),valueScore:A.number().optional(),commits:A.array(aS).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),gS=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),Mj=A.object({strategy:oS.nullable().optional(),features:A.array(mS),backlog:A.array(A.union([A.string(),gS])),lastUpdated:A.string(),quarters:A.array(pS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),Oj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import fS from"node:crypto";import{homedir as hS}from"node:os";import{join as yS}from"node:path";function he(){return fS.randomUUID()}var wS,kp=y(()=>{"use strict";l(he,"generateUUID");wS=yS(hS(),".prjct-cli","projects")});import{z as it}from"zod";var Wj,Sp=y(()=>{"use strict";Wj=it.object({sessionId:it.string(),projectId:it.string(),projectPath:it.string(),projectName:it.string().optional(),taskDescription:it.string(),taskStatus:it.enum(["active","paused"]),activeSubtaskIndex:it.number().optional(),subtaskCount:it.number().optional(),branch:it.string().optional(),linearId:it.string().optional(),filesModified:it.array(it.string()).optional(),durationWorkedSec:it.number().optional(),timestamp:it.string(),resumeHint:it.string()})});import{z as Q}from"zod";var kS,bp,SS,bS,CS,vS,xS,PS,TS,Cp,wc=y(()=>{"use strict";kS=Q.enum(["feature","fix","improvement","refactor"]),bp=Q.enum(["pass","warning","fail","skipped"]),SS=Q.enum(["added","changed","fixed","removed"]),bS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),CS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),vS=Q.object({description:Q.string(),type:SS.optional()}),xS=Q.object({lintStatus:bp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:bp.nullable().optional(),testDetails:Q.string().optional()}),PS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),TS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:kS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(vS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:PS.optional(),codeMetrics:CS.optional(),qualityMetrics:xS.optional(),quantitativeImpact:Q.string().optional(),duration:bS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),Cp=Q.object({shipped:Q.array(TS),lastUpdated:Q.string()})});import{z as T}from"zod";var ES,xp,IS,AS,jS,kc,Pp,DS,RS,Tp,vp,$S,MS,Ep,Ip,Ap,OS,FS,Xj,Jo=y(()=>{"use strict";Tr();ES=T.enum(["low","medium","high","critical"]),xp=T.enum(["feature","bug","improvement","chore"]),IS=T.enum(["active","backlog","previously_active"]),AS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),jS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),kc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),Pp=T.object({output:T.string().min(1,"Subtask output is required"),summary:kc}),DS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:AS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:kc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),RS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Tp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(DS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:RS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:Pr.optional()}),vp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),$S=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),MS=T.object({taskId:T.string(),title:T.string(),classification:xp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(kc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:$S.optional()}),Ep=T.object({currentTask:Tp.nullable(),previousTask:vp.nullable().optional(),pausedTasks:T.array(vp).optional(),taskHistory:T.array(MS).optional(),lastUpdated:T.string()}),Ip=T.object({id:T.string(),description:T.string(),priority:ES,type:xp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:IS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Ap=T.object({tasks:T.array(Ip),lastUpdated:T.string()}),OS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),FS=T.object({type:jS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),Xj=T.object({projectId:T.string(),currentTask:Tp.nullable(),queue:T.array(Ip),stats:OS,recentActivity:T.array(FS),lastSync:T.string()})});import{z as ce}from"zod";var _S,NS,jp,tD,nD,sD,Pn,Dp,Ds=y(()=>{"use strict";_S=ce.enum(["improving","stable","declining"]),NS=ce.object({sprintNumber:ce.number(),startDate:ce.string(),endDate:ce.string(),pointsCompleted:ce.number(),tasksCompleted:ce.number(),avgVariance:ce.number(),estimationAccuracy:ce.number()}),jp=ce.object({category:ce.string(),avgVariance:ce.number(),taskCount:ce.number()}),tD=ce.object({totalPoints:ce.number(),sprints:ce.number(),estimatedDate:ce.string()}),nD=ce.object({sprints:ce.array(NS),averageVelocity:ce.number(),velocityTrend:_S,estimationAccuracy:ce.number(),overEstimated:ce.array(jp),underEstimated:ce.array(jp),lastUpdated:ce.string()}),sD=ce.object({sprintLengthDays:ce.number().min(1).max(90).default(7),startDay:ce.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ce.number().min(1).max(52).default(6),accuracyTolerance:ce.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Dp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ht=y(()=>{"use strict";Xd();dc();Rr();mc();gc();Wo();Tr();hc();hp();yp();wp();kp();Sp();wc();Jo();Ds()});var tn,Sc,bt,Tn=y(()=>{"use strict";Ht();ae();fe();tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Sc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=he(),s=C();return R.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return R.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?R.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):R.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=R.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=R.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(R.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);R.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return R.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},bt=new Sc});var Rp=y(()=>{"use strict"});var qo,$p=y(()=>{"use strict";qo={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 Rs,Ko=y(()=>{"use strict";Rs={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var Mp=y(()=>{"use strict"});var Op=y(()=>{"use strict";Mp()});function Yo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var O,Fp,$s=y(()=>{"use strict";O={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"},Fp=["frontend","backend","devops","docs","testing","database","general"];l(Yo,"calculateConfidence")});var bc=y(()=>{"use strict"});var Cc=y(()=>{"use strict";Rp();$p();Ko();N();Op();$s();bc()});function Ms(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return GS[r]}var oe,vc,xc,Xo,GS,jt,_p,$r,mn=y(()=>{"use strict";oe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},vc=["feature","spec","design","refactor","migrate"],xc=["ship","cleanup","git","migrate"],Xo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],GS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ms,"getTimeout");jt={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},_p={HISTORY_MAX:100},$r={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function WS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(zS.has(r)||r.includes("prjct"))return{level:Os.debug,name:"debug"};let e=Os[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Qo(r,e,t){return Np>=r?(...n)=>console[t](e,...n):VS}var Os,zS,Np,BS,VS,JS,H,Vn=y(()=>{"use strict";Os={error:0,warn:1,info:2,debug:3},zS=new Set(["1","true","*"]);l(WS,"getLogLevel");({level:Np,name:BS}=WS()),VS=l(()=>{},"noop");l(Qo,"createLogMethod");JS={error:Qo(Os.error,"[prjct:error]","error"),warn:Qo(Os.warn,"[prjct:warn]","warn"),info:Qo(Os.info,"[prjct:info]","log"),debug:Qo(Os.debug,"[prjct:debug]","log"),isEnabled:l(()=>Np>=0,"isEnabled"),level:l(()=>BS,"level")},H=JS});var Zo,qS,Lp=y(()=>{"use strict";dn();fe();Cc();mn();Vn();Zo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=_p.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(qo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(qo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{R.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",re(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},qS=new Zo});var ei,ti,Hp=y(()=>{"use strict";ke();ae();Te();ei=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await zn(t,[])??[];n.push(e),await Er(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await zn(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await Er(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:C(),success:!0};await Er(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await zn(t,null)}},ti=new ei});var Pc=y(()=>{"use strict";Lp();Hp()});var Ut,ni=y(()=>{"use strict";Ut=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Be,nn=y(()=>{"use strict";Pc();ni();ae();fe();Be=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ut({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=R.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){R.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await ti.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return R.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Tc,et,Mr=y(()=>{"use strict";Ht();mc();ae();Tn();nn();Tc=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",tp)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:he(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Cn(tn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},et=new Tc});var Ec,Ee,Or=y(()=>{"use strict";Ht();Jo();ae();Tn();nn();Ec=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",Ap)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:he(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:he(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Cn(tn.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Ee=new Ec});var Ic,gt,Fr=y(()=>{"use strict";Ht();wc();ae();Tn();nn();Ic=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Cp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:he(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Cn(tn.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;bt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},gt=new Ic});var _r,Ac,Jn,jc=y(()=>{"use strict";_r={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 n=_r[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return _r[e]}getPrompt(e){return _r[e].prompt}getValidCommands(e){return _r[e].transitions}formatNextSteps(e){return _r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Jn=new Ac});var Dc,L,Nr=y(()=>{"use strict";Ht();Jo();ae();jc();Tn();nn();Dc=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",Ep)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Jn.getCurrentState(e),s=Jn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:he()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];bt.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:C()}));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:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Pp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
263
263
|
${f.join(`
|
|
264
|
-
`)}`)}let{output:r,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:r,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new xc});import US from"node:fs/promises";import HS from"node:path";import{Hono as GS}from"hono";function zS(s){return I.getGlobalProjectPath(s)}function Mp(s,e){let t=new GS,n=zS(s);return t.get("/state",async r=>{let o=await L.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await xe.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await Qe.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=M.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await pt.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([L.read(s),xe.read(s),Qe.read(s),pt.read(s)]),u=M.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await L.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=HS.join(n,"context",`${o}.md`),c=await US.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${w(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}var Op=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();N();Gn();l(zS,"getProjectDataPath");l(Mp,"createRoutes")});import js from"node:fs/promises";import WS from"node:path";import{Hono as BS}from"hono";function Qo(s){return M.getDoc(s,"project")}async function Tc(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}function Fp(){let s=new BS;return s.get("/projects",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Qo(o),a=await L.read(o),c=await xe.read(o),u=await Qe.read(o),d=await pt.read(o),m=a?.currentTask,p=await Tc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Qo(t)),L.read(t),xe.read(t),Qe.read(t),pt.read(t)]),c=M.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await Tc(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,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:r},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(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),xe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===r);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(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await Qe.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await xe.read(c),m=await Qe.read(c),p=await pt.read(c);u?.currentTask&&a++,r+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await js.mkdir(Ds,{recursive:!0});let r=(await js.readdir(Ds,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await L.read(d),p=Qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Tc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}var VS,Ds,_p=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();VS=I.getGlobalBasePath(),Ds=WS.join(VS,"projects");l(Qo,"getProjectConfig");l(Tc,"calculateDuration");l(Fp,"createExtendedRoutes")});import{streamSSE as JS}from"hono/streaming";function Lp(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>Np&&t(i)},qS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return JS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},KS),p=setTimeout(()=>{t(a)},Np);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}var Np,qS,KS,Up=y(()=>{"use strict";fc();Np=3600*1e3,qS=300*1e3,KS=3e4;l(Lp,"createSSEManager")});var Hp={};he(Hp,{DEFAULT_PORT:()=>ei,createServer:()=>Zo,startServer:()=>ZS});import{Hono as YS}from"hono";import{cors as XS}from"hono/cors";import{logger as QS}from"hono/logger";function Zo(s){let e=new YS,t=Lp();s.enableCors!==!1&&e.use("*",XS({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",QS()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:s.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Mp(s.projectId,s.projectPath);e.route("/api",n);let r=Fp();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(Tr())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: ${s.projectId}`),console.log(` Runtime: ${Tr()?"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 ZS(s,e,t=ei){let n=Zo({port:t,projectId:s,projectPath:e});return await n.start(),n}var ei,Ec=y(()=>{"use strict";nc();Op();_p();Up();l(Zo,"createServer");ei=3478;l(ZS,"startServer")});import Wn from"chalk";var Gp,eb,tb,Ht,zp=y(()=>{"use strict";Je();Gp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],eb=80,tb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gp,speed:eb},cli:{header:l(()=>`${Wn.cyan.bold("\u26A1")} ${Wn.cyan("prjct")}`,"header"),footer:l(()=>Wn.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${Wn.cyan("\u26A1")} ${Wn.cyan("prjct")} ${Wn.cyan(Gp[s%10])} ${Wn.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((s="claude")=>Eo(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>Eo(s).signature,"getSignature")},Ht=tb});function Bn(s,e){return{...Ts[s],...e}}function Or(s,e,t){return{message:s,hint:e,...t}}var Fr=y(()=>{"use strict";Wo();Wo();l(Bn,"getError");l(Or,"createError")});var Bp={};he(Bp,{ERRORS:()=>Ts,ICONS:()=>xn,OUTPUT_TIERS:()=>Wp,createError:()=>Or,default:()=>h,formatForHuman:()=>ib,getError:()=>Bn,getOutputTier:()=>sb,getTierConfig:()=>ni,isQuietMode:()=>ob,limitLines:()=>ti,setOutputTier:()=>nb,setQuietMode:()=>rb});import se from"chalk";function nb(s){$s=s}function sb(){return $s}function ni(){return Wp[$s]}function rb(s){ct=s}function ob(){return ct}function ti(s,e){let t=e??ni().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
|
|
265
|
-
`);if(n.length<=t)return
|
|
264
|
+
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Dc});import YS from"node:fs/promises";import XS from"node:path";import{Hono as QS}from"hono";function ZS(r){return E.getGlobalProjectPath(r)}function Up(r,e){let t=new QS,n=ZS(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Ee.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await et.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=R.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await gt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Ee.read(r),et.read(r),gt.read(r)]),u=R.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=XS.join(n,"context",`${o}.md`),c=await YS.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Gp=y(()=>{"use strict";ke();fe();Mr();Or();Fr();Nr();N();Vn();l(ZS,"getProjectDataPath");l(Up,"createRoutes")});import Fs from"node:fs/promises";import eb from"node:path";import{Hono as tb}from"hono";function si(r){return R.getDoc(r,"project")}async function Rc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function zp(){let r=new tb;return r.get("/projects",async e=>{try{await Fs.mkdir(_s,{recursive:!0});let n=(await Fs.readdir(_s,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=si(o),a=await L.read(o),c=await Ee.read(o),u=await et.read(o),d=await gt.read(o),m=a?.currentTask,p=await Rc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(si(t)),L.read(t),Ee.read(t),et.read(t),gt.read(t)]),c=R.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Rc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await 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:s},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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([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===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await et.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Fs.mkdir(_s,{recursive:!0});let n=(await Fs.readdir(_s,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Ee.read(c),m=await et.read(c),p=await gt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Fs.mkdir(_s,{recursive:!0});let s=(await Fs.readdir(_s,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=si(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=si(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Rc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var nb,_s,Wp=y(()=>{"use strict";ke();fe();Mr();Or();Fr();Nr();nb=E.getGlobalBasePath(),_s=eb.join(nb,"projects");l(si,"getProjectConfig");l(Rc,"calculateDuration");l(zp,"createExtendedRoutes")});import{streamSSE as sb}from"hono/streaming";function Vp(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Bp&&t(i)},rb),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return sb(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},ob),p=setTimeout(()=>{t(a)},Bp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Bp,rb,ob,Jp=y(()=>{"use strict";bc();Bp=3600*1e3,rb=300*1e3,ob=3e4;l(Vp,"createSSEManager")});var qp={};we(qp,{DEFAULT_PORT:()=>oi,createServer:()=>ri,startServer:()=>lb});import{Hono as ib}from"hono";import{cors as ab}from"hono/cors";import{logger as cb}from"hono/logger";function ri(r){let e=new ib,t=Vp();r.enableCors!==!1&&e.use("*",ab({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",cb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Up(r.projectId,r.projectPath);e.route("/api",n);let s=zp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(jr())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: ${jr()?"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 lb(r,e,t=oi){let n=ri({port:t,projectId:r,projectPath:e});return await n.start(),n}var oi,$c=y(()=>{"use strict";cc();Gp();Wp();Jp();l(ri,"createServer");oi=3478;l(lb,"startServer")});import qn from"chalk";var Kp,ub,db,Gt,Yp=y(()=>{"use strict";Je();Kp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ub=80,db={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Kp,speed:ub},cli:{header:l(()=>`${qn.cyan.bold("\u26A1")} ${qn.cyan("prjct")}`,"header"),footer:l(()=>qn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${qn.cyan("\u26A1")} ${qn.cyan("prjct")} ${qn.cyan(Kp[r%10])} ${qn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Ro(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Ro(r).signature,"getSignature")},Gt=db});function Kn(r,e){return{...Rs[r],...e}}function Lr(r,e,t){return{message:r,hint:e,...t}}var Hr=y(()=>{"use strict";Ko();Ko();l(Kn,"getError");l(Lr,"createError")});var Qp={};we(Qp,{ERRORS:()=>Rs,ICONS:()=>En,OUTPUT_TIERS:()=>Xp,createError:()=>Lr,default:()=>h,formatForHuman:()=>hb,getError:()=>Kn,getOutputTier:()=>mb,getTierConfig:()=>ai,isQuietMode:()=>fb,limitLines:()=>ii,setOutputTier:()=>pb,setQuietMode:()=>gb});import se from"chalk";function pb(r){Ls=r}function mb(){return Ls}function ai(){return Xp[Ls]}function gb(r){dt=r}function fb(){return dt}function ii(r,e){let t=e??ai().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
265
|
+
`);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
|
|
266
266
|
`)}
|
|
267
|
-
${se.dim(`...${o} more lines`)}`}function
|
|
268
|
-
`),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} ${
|
|
269
|
-
`)}let
|
|
270
|
-
`),e.maxLines):
|
|
271
|
-
`),this))},done(
|
|
272
|
-
`),n=Math.max(
|
|
273
|
-
${se.bold(
|
|
274
|
-
`),this)},progress(
|
|
275
|
-
`),this)}},h=cb});var qp={};he(qp,{default:()=>ub,sessionTracker:()=>Tn});var lb,Vp,Jp,jc,Tn,ub,si=y(()=>{"use strict";ye();le();lb=1800*1e3,Vp=50,Jp=200,jc=class{static{l(this,"SessionTracker")}async read(e){try{return M.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){M.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:lb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>Vp&&(r.current.commands=r.current.commands.slice(-Vp)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>Jp&&(r.current.files=r.current.files.slice(-Jp)),await this.write(e,r)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Pr(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Pr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Tn=new jc,ub=Tn});var Yp={};he(Yp,{default:()=>Vn,performanceTracker:()=>Kp});var Dc,Kp,Vn,ri=y(()=>{"use strict";ye();Dc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,r){q.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),r=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of r)q.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){q.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){q.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let r=this.getMetrics(e,n),o={period:`${t}d`},i=r.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=r.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=r.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=r.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Kp=new Dc,Vn=Kp});function $c(s){if(Ap.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(oi))if(n!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Rc,oi,Jn,_r,Nr,Lr=y(()=>{"use strict";ye();Es();le();Rc={frontend:[O.CODE_STYLE,O.FILE_STRUCTURE,O.ARCHITECTURE,O.TECH_STACK],backend:[O.CODE_STYLE,O.ARCHITECTURE,O.DEPENDENCIES,O.TECH_STACK],devops:[O.SHIP_WORKFLOW,O.TEST_BEHAVIOR,O.DEPENDENCIES,O.ARCHITECTURE],docs:[O.CODE_STYLE,O.NAMING_CONVENTION,O.FILE_STRUCTURE],testing:[O.TEST_BEHAVIOR,O.CODE_STYLE,O.DEPENDENCIES],database:[O.ARCHITECTURE,O.NAMING_CONVENTION,O.TECH_STACK,O.DEPENDENCIES],general:Object.values(O)},oi={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l($c,"resolveCanonicalDomains");Jn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=q.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();q.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),r=t(n);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},_r=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()}},Nr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};q.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var Ur,Mc=y(()=>{"use strict";ye();Es();le();Lr();Ur=class s extends Jn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>s.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-s.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,r="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>s.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-s.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Bo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let r=await this.load(e),o=C();if(!r.workflows[t])r.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=Bo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,n,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Bo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),r=s.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>r&&o.push(a)}if(o.length===0)return 0;let i=q.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return q.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var qn,Oc=y(()=>{"use strict";Lt();Es();le();Lr();qn=class extends Jn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(O),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(O);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(O));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=C(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),r=n.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=n.memories[r];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,n=!1){let r=await this.load(e),o=this._coerceTags(t);if(n)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),r=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),r=n.memories.length;if(r===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),v=(p.tags||[]).filter($=>D.includes($));g.tagMatch=Math.min(20,v.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),v=0;for(let $ of D)p.content.toLowerCase().includes($)&&(v+=2),p.title.toLowerCase().includes($)&&(v+=3);g.keywords=Math.min(15,v)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let r=new Set;for(let a of n){let c=Rc[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=oi[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return $c(e)}_getCommandTags(e){return{ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE],task:[O.BRANCH_NAMING,O.CODE_STYLE],sync:[O.TECH_STACK,O.ARCHITECTURE,O.DEPENDENCIES],test:[O.TEST_BEHAVIOR],bug:[O.CODE_STYLE,O.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(r=>r.length>2&&!n.has(r))}_extractContextTags(e){let t=[],n={ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(r=>r.length>2&&!n.includes(r))}async autoRemember(e,t,n,r=""){let i={commit_footer:[O.COMMIT_STYLE],branch_naming:[O.BRANCH_NAMING],test_before_ship:[O.TEST_BEHAVIOR,O.SHIP_WORKFLOW],preferred_agent:[O.AGENT_PREFERENCE],code_style:[O.CODE_STYLE],verbosity:[O.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${r?`
|
|
276
|
-
Context: ${
|
|
277
|
-
`).filter(Boolean).forEach(n=>{let
|
|
278
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
279
|
-
`).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:
|
|
280
|
-
`)}async function
|
|
281
|
-
|
|
282
|
-
${i}`;return await X.writeFile(
|
|
267
|
+
${se.dim(`...${o} more lines`)}`}function hb(r){let e=ai();if(Ls==="silent")return"";if(Ls==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Dt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Dt(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&&Ls==="compact"&&o.push(se.dim(String(t.url))),ii(o.join(`
|
|
268
|
+
`),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} ${Dt(String(a.title),jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(se.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
269
|
+
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?ii(s.map(o=>`${o}: ${Dt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
270
|
+
`),e.maxLines):ii(JSON.stringify(r,null,2),e.maxLines)}var e$,Mc,Xp,Ls,En,Ns,Oc,dt,Dt,yb,wb,h,zt=y(()=>{"use strict";Yp();mn();Hr();Hr();e$=Gt.spinner.frames,Mc=Gt.spinner.speed,Xp={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}},Ls="compact";l(pb,"setOutputTier");l(mb,"getOutputTier");l(ai,"getTierConfig");En={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Ns=null,Oc=0,dt=!1;l(gb,"setQuietMode");l(fb,"isQuietMode");Dt=l((r,e)=>{let t=e??(ai().maxCharsPerLine||jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(ii,"limitLines");l(hb,"formatForHuman");yb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(jt.CLEAR_WIDTH)}\r`):!0,"clear"),wb={start(){return dt||console.log(Gt.cli.header()),this},end(){return dt||console.log(Gt.cli.footer()),this},spin(r){return dt?this:(this.stop(),process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,Dt(r,jt.SPINNER_MSG))}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,Dt(r,jt.SPINNER_MSG))}
|
|
271
|
+
`),this))},done(r,e){if(this.stop(),!dt){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=se.dim(` [${n.join(" | ")}]`))}console.log(`${En.success} ${Dt(r,jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${En.fail} ${Dt(r,jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Kn(r):r;return console.error(),console.error(`${En.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),dt||console.log(`${En.warn} ${Dt(r,jt.WARN_MSG)}`),this},info(r){return this.stop(),dt||console.log(`${En.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!dt&&e&&console.log(`${En.debug} ${se.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),dt)return this;let t=e.bullet||En.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),dt||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(s)),console.log(se.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),dt)return this;let t=e.split(`
|
|
272
|
+
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(se.dim(`\u250C${s}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(r.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),dt?this:(console.log(`
|
|
273
|
+
${se.bold(r)}`),console.log(se.dim("\u2500".repeat(r.length))),this)},stop(){return Ns&&(clearInterval(Ns),Ns=null,yb()),this},step(r,e,t){if(dt)return this;this.stop();let n=se.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,`${n} ${Dt(t,jt.STEP_MSG)}`)}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,`${n} ${Dt(t,jt.STEP_MSG)}`)}
|
|
274
|
+
`),this)},progress(r,e,t){if(dt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=se.cyan("\u2588".repeat(s))+se.dim("\u2591".repeat(o)),a=t?` ${Dt(t,jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ns=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(Oc++,`[${i}] ${n}%${a}`)}`)},Mc),this):(process.stdout.write(`${Gt.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
275
|
+
`),this)}},h=wb});var tm={};we(tm,{default:()=>Sb,sessionTracker:()=>In});var kb,Zp,em,Fc,In,Sb,ci=y(()=>{"use strict";fe();ae();kb=1800*1e3,Zp=50,em=200,Fc=class{static{l(this,"SessionTracker")}async read(e){try{return R.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){R.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:kb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Zp&&(s.current.commands=s.current.commands.slice(-Zp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>em&&(s.current.files=s.current.files.slice(-em)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:pn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:pn(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},In=new Fc,Sb=In});var sm={};we(sm,{default:()=>Yn,performanceTracker:()=>nm});var _c,nm,Yn,li=y(()=>{"use strict";fe();_c=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){q.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)q.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){q.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){q.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},nm=new _c,Yn=nm});function Lc(r){if(Fp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ui))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Nc,ui,Xn,Ur,Gr,zr=y(()=>{"use strict";fe();$s();ae();Nc={frontend:[O.CODE_STYLE,O.FILE_STRUCTURE,O.ARCHITECTURE,O.TECH_STACK],backend:[O.CODE_STYLE,O.ARCHITECTURE,O.DEPENDENCIES,O.TECH_STACK],devops:[O.SHIP_WORKFLOW,O.TEST_BEHAVIOR,O.DEPENDENCIES,O.ARCHITECTURE],docs:[O.CODE_STYLE,O.NAMING_CONVENTION,O.FILE_STRUCTURE],testing:[O.TEST_BEHAVIOR,O.CODE_STYLE,O.DEPENDENCIES],database:[O.ARCHITECTURE,O.NAMING_CONVENTION,O.TECH_STACK,O.DEPENDENCIES],general:Object.values(O)},ui={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Lc,"resolveCanonicalDomains");Xn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=q.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();q.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Ur=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()}},Gr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};q.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Wr,Hc=y(()=>{"use strict";fe();$s();ae();zr();Wr=class r extends Xn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Yo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Yo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Yo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=q.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return q.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Qn,Uc=y(()=>{"use strict";Ht();$s();ae();zr();Qn=class extends Xn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(O),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(O);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(O));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:he(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(M=>D.includes(M));g.tagMatch=Math.min(20,x.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let M of D)p.content.toLowerCase().includes(M)&&(x+=2),p.title.toLowerCase().includes(M)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=Nc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ui[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Lc(e)}_getCommandTags(e){return{ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE],task:[O.BRANCH_NAMING,O.CODE_STYLE],sync:[O.TECH_STACK,O.ARCHITECTURE,O.DEPENDENCIES],test:[O.TEST_BEHAVIOR],bug:[O.CODE_STYLE,O.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[O.COMMIT_STYLE],branch_naming:[O.BRANCH_NAMING],test_before_ship:[O.TEST_BEHAVIOR,O.SHIP_WORKFLOW],preferred_agent:[O.AGENT_PREFERENCE],code_style:[O.CODE_STYLE],verbosity:[O.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
276
|
+
Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Gc,bb,Ie,Hs=y(()=>{"use strict";zr();Hc();Uc();zr();Hc();Uc();Gc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Qn,this._patternStore=new Wr,this._historyStore=new Gr,this._sessionStore=new Ur}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},bb=new Gc,Ie=bb});import{exec as Cb}from"node:child_process";import Ct from"node:fs/promises";import Wt from"node:path";import{promisify as vb}from"node:util";var Zn,zc,xb,Ye,rm=y(()=>{"use strict";N();Zn=vb(Cb),zc=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Wt.join(this.projectPath,"package.json"),t=await Ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Wt.join(this.projectPath,"Cargo.toml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=Wt.join(this.projectPath,"requirements.txt");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=Wt.join(this.projectPath,"go.mod");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=Wt.join(this.projectPath,"Gemfile");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=Wt.join(this.projectPath,"mix.exs");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=Wt.join(this.projectPath,"pom.xml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=Wt.join(this.projectPath,"composer.json"),t=await Ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Wt.join(this.projectPath,"pyproject.toml");return await Ct.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Zn('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(`
|
|
277
|
+
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Ct.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await Ct.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Zn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Zn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Zn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Zn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Zn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await Ct.access(Wt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=Wt.join(this.projectPath,e);return await Ct.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Zn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
278
|
+
`).filter(Boolean)}catch{return[]}}},xb=new zc,Ye=xb});import Bc from"node:fs";import Pb from"node:fs/promises";import di from"node:path";function Vc(){if(om)return Wc;om=!0;let r=di.join(pe,"dist","templates.json");try{let e=Bc.readFileSync(r,"utf-8");return Wc=JSON.parse(e),Wc}catch{return null}}function Eb(r){let e=es.indexOf(r);e>-1&&es.splice(e,1),es.push(r)}function Ib(){for(;Us.size>=Tb&&es.length>0;){let r=es.shift();r&&Us.delete(r)}}function pi(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
|
|
279
|
+
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function im(r){if(Us.has(r))return Eb(r),Us.get(r);let e,t=Vc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=di.join(pe,"templates","commands",`${r}.md`);try{e=await Pb.readFile(s,"utf-8")}catch{throw Mo.notFound(r)}}let n=pi(e);return Ib(),Us.set(r,n),es.push(r),n}async function Ab(r){return(await im(r)).frontmatter["allowed-tools"]||[]}function jb(){Us.clear(),es.length=0}function ye(r){let e=Vc();if(e?.[r])return e[r];let t=di.join(pe,"templates",r);try{return Bc.readFileSync(t,"utf-8")}catch{return null}}function An(r){let e=Vc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=di.join(pe,"templates",r);try{return Bc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Tb,Us,es,Wc,om,Db,Jc,jn=y(()=>{"use strict";dn();lt();Tb=50,Us=new Map,es=[],Wc=null,om=!1;l(Vc,"loadBundle");l(Eb,"updateLruOrder");l(Ib,"evictLru");l(pi,"parseFrontmatter");l(im,"load");l(Ab,"getAllowedTools");l(jb,"clearCache");l(ye,"getTemplateContent");l(An,"listTemplates");Db={load:im,parseFrontmatter:pi,getAllowedTools:Ab,clearCache:jb,getTemplateContent:ye,listTemplates:An},Jc=Db});import X from"node:fs/promises";import Kc from"node:os";import ne from"node:path";async function Rb(){try{let r=ye("global/modules/module-config.json");if(r)return JSON.parse(r);let e=ne.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function $b(r){let e=await Rb();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=ne.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=ne.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ne.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
|
|
280
|
+
`)}async function Mb(){try{let r=ne.join(Kc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=An("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ne.basename(s);await X.writeFile(ne.join(r,i),o,"utf-8")}}return{success:!0}}let t=ne.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=ne.join(t,s),i=ne.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function Ob(){let r=(Je(),It(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 X.mkdir(e.configDir,{recursive:!0});let s=ne.join(e.configDir,e.contextFile),o=ne.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await $b()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
281
|
+
|
|
282
|
+
${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function am(){let r=Kc.homedir();return{claude:{commands:ne.join(r,".claude","commands","p"),config:ne.join(r,".claude"),router:ne.join(r,".claude","commands","p.md")},gemini:{commands:ne.join(r,".gemini","commands"),config:ne.join(r,".gemini"),router:ne.join(r,".gemini","commands","p.toml")}}}var qc,Fb,Ae,Dn=y(()=>{"use strict";jn();N();lt();l(Rb,"loadModuleConfig");l($b,"composeGlobalTemplate");l(Mb,"installDocs");l(Ob,"installGlobalConfig");qc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Kc.homedir(),this.templatesDir=ne.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),It(mt)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=ne.join(t.configDir,"commands"):this.claudeCommandsPath=ne.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=An("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Je(),It(mt)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=ne.join(this.claudeCommandsPath,a),u=ye(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=ne.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=ne.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ye(`commands/${e}.md`))return!0;try{let n=ne.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Je(),It(mt)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=ne.join(t.configDir,"commands",n);await X.mkdir(ne.dirname(s),{recursive:!0});let o=ye(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=ne.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Je(),It(mt)).getActiveProvider(),n=ne.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ne.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ne.join(this.claudeCommandsPath,o),a=n.includes(o),c=ye(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=ne.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return Ob()}async installDocs(){return Mb()}};l(am,"getProviderPaths");Fb=new qc,Ae=Fb});import{z as _e}from"zod";function dm(r,e="default"){let t=cm[e]||cm.default;return r/1e3*t}function mi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var _b,Nb,lm,um,cm,gi=y(()=>{"use strict";_b=_e.object({date:_e.string(),tokensSaved:_e.number(),syncs:_e.number(),avgCompressionRate:_e.number(),totalDuration:_e.number()}),Nb=_e.object({agentName:_e.string(),usageCount:_e.number(),tokensSaved:_e.number()}),lm=_e.object({totalTokensSaved:_e.number(),avgCompressionRate:_e.number(),syncCount:_e.number(),watchTriggers:_e.number(),avgSyncDuration:_e.number(),totalSyncDuration:_e.number(),agentUsage:_e.array(Nb),dailyStats:_e.array(_b),firstSync:_e.string(),lastUpdated:_e.string()}),um={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},cm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(dm,"estimateCostSaved");l(mi,"formatCost")});function Lb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Hb(r){let e=[],t=Lb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Yc,o+i.length);if(c===-1)continue;let u=c+Yc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Xc(r,e){let t=Hb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
283
283
|
|
|
284
284
|
---
|
|
285
285
|
|
|
@@ -287,105 +287,148 @@ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r
|
|
|
287
287
|
|
|
288
288
|
`,n+=`_The sections below are preserved during sync. Edit freely._
|
|
289
289
|
|
|
290
|
-
`;for(let
|
|
290
|
+
`;for(let s of t)n+=s.content,n+=`
|
|
291
291
|
|
|
292
292
|
`;return`${n.trimEnd()}
|
|
293
|
-
`}function
|
|
294
|
-
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(
|
|
295
|
-
`;await
|
|
293
|
+
`}function Qc(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
|
|
294
|
+
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Yc)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Yc,Zc=y(()=>{"use strict";Yc="<!-- /prjct:preserve -->";l(Lb,"createPreserveStartRegex");l(Hb,"extractPreservedSections");l(Xc,"mergePreservedSections");l(Qc,"validatePreserveBlocks")});function Br(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Ub.has(e.code))return!0;if(e.code&&mm.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 hi(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&mm.has(e.code))}function pm(r,e,t){let n=Rn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Rn.delete(r),!1):!0:!1}function el(r,e){let t=Rn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Rn.set(r,t)}function Gb(r){Rn.delete(r)}var Ub,mm,Rn,fi,gm,Vr,yi=y(()=>{"use strict";Ub=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Br,"isTransientError");l(hi,"isPermanentError");Rn=new Map;l(pm,"isCircuitOpen");l(el,"recordFailure");l(Gb,"recordSuccess");fi=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(pm(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Gb(t),o}catch(o){if(n=o,s++,hi(o))throw el(t,this.options.circuitBreakerThreshold),o;if(!(Br(o)&&s<this.options.maxAttempts))throw el(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw el(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Br(e)}isCircuitOpen(e){return pm(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Rn.get(e)}resetCircuit(e){Rn.delete(e)}resetAllCircuits(){Rn.clear()}},gm=new fi({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Vr=new fi({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var fm=y(()=>{"use strict";Zc();yi()});import wi from"node:fs/promises";import tl from"node:path";var nl,hm,ym=y(()=>{"use strict";qe();ke();N();nl=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=E.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await wi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await wi.readFile(tl.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=tl.join(this.agentsPath,`${e}.md`),n=await wi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=tl.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
|
|
295
|
+
`;await wi.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},hm=nl});import wm from"node:path";async function Bb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(wm.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(wm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Vb(){return{...zb}}function Jb(){return{...Wb}}async function km(){return ki||(ki=await Bb()?Vb():Jb(),ki)}var ki,zb,Wb,Sm=y(()=>{"use strict";Te();ki=null,zb={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Wb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Bb,"isClaudeEnvironment");l(Vb,"getClaudeAgent");l(Jb,"getTerminalAgent");l(km,"detect")});import Jr from"node:fs/promises";var sl,bm,Cm=y(()=>{"use strict";N();sl=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await Jr.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${w(n)}`)}await Jr.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await Jr.readdir(e)}async fileExists(e){try{return await Jr.access(e),!0}catch(t){if(v(t))return!1;throw t}}async createDirectory(e){await Jr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
296
|
+
${e.map((t,n)=>`${n+1}. ${t}`).join(`
|
|
297
|
+
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
298
|
+
|
|
299
|
+
\u{1F3AF} Current: ${e.currentTask||"None"}
|
|
300
|
+
\u{1F680} Shipped: ${e.shippedCount}
|
|
301
|
+
\u{1F4DD} Queue: ${e.queuedCount}
|
|
302
|
+
\u{1F4A1} Ideas: ${e.ideasCount}
|
|
303
|
+
${e.recentActivity?`
|
|
304
|
+
${e.recentActivity}`:""}`}formatProgress(e){let t=e.velocity>e.previousVelocity?"\u{1F4C8}":e.velocity<e.previousVelocity?"\u{1F4C9}":"\u27A1\uFE0F";return`\u{1F4CA} ${e.period}
|
|
305
|
+
|
|
306
|
+
Shipped: ${e.count}
|
|
307
|
+
Velocity: ${e.velocity.toFixed(1)}/day ${t}
|
|
308
|
+
${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolate code causing error
|
|
309
|
+
2. Add logs at key points
|
|
310
|
+
3. Search exact error message`,design:`\u{1F3A8} 1. Define problem clearly
|
|
311
|
+
2. Start with simplest solution
|
|
312
|
+
3. Ship MVP, iterate`,performance:`\u26A1 1. Profile/measure first
|
|
313
|
+
2. Optimize slowest parts
|
|
314
|
+
3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
|
|
315
|
+
2. Start with simplest part
|
|
316
|
+
3. Ship it`},n=Object.keys(t).find(s=>e.toLowerCase().includes(s))||"default";return t[n]}suggestNextAction(e){return{taskCompleted:`What's next?
|
|
317
|
+
\u2022 "start [task]" \u2192 Begin working
|
|
318
|
+
\u2022 "ship feature" \u2192 Track & celebrate
|
|
319
|
+
\u2022 "add idea" \u2192 Brainstorm
|
|
320
|
+
|
|
321
|
+
Or: /p:now | /p:ship | /p:idea`,featureShipped:`Keep the momentum!
|
|
322
|
+
\u2022 "start next task" \u2192 Keep building
|
|
323
|
+
\u2022 "see progress" \u2192 View stats
|
|
324
|
+
\u2022 "plan ahead" \u2192 Strategic thinking
|
|
325
|
+
|
|
326
|
+
Or: /p:now | /p:recap | /p:roadmap`,ideaCaptured:`Ready to start?
|
|
327
|
+
\u2022 "start this" \u2192 Begin now
|
|
328
|
+
\u2022 "plan more" \u2192 Keep brainstorming
|
|
329
|
+
\u2022 "see ideas" \u2192 View backlog
|
|
330
|
+
|
|
331
|
+
Or: /p:now | /p:idea | /p:recap`,initialized:`Ready to start? Tell me what you want to build!
|
|
332
|
+
|
|
333
|
+
Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
334
|
+
\u2022 "start the first part"
|
|
335
|
+
\u2022 "add as tasks"
|
|
336
|
+
\u2022 "think more"
|
|
337
|
+
|
|
338
|
+
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
339
|
+
|
|
340
|
+
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}}},bm=sl});var Kb,Si,Gs,vm=y(()=>{"use strict";ym();dn();Sm();Cm();yi();Kb=["claude"],Si=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new hm}async initialize(){return this.agent?this.agent:await gm.execute(async()=>{if(this.agentInfo=await km(),!this.agentInfo?.isSupported)throw Ir.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Kb.includes(e))throw Ir.notSupported(this.agentInfo?.type??"unknown");return this.agent=new bm,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
|
|
296
341
|
AGENTIC EXECUTION:
|
|
297
342
|
- Read: templates/agentic/orchestrator.md
|
|
298
343
|
- Analyze task: "${e}"
|
|
299
|
-
- Available specialists: ${
|
|
344
|
+
- Available specialists: ${s.join(", ")}
|
|
300
345
|
- Claude decides which agent(s) to use
|
|
301
346
|
- Always prefer specialists over generalist
|
|
302
347
|
- Fragment complex tasks into subtasks
|
|
303
|
-
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Fs=new fi});var hi,yi,fm=y(()=>{"use strict";hi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},yi=new hi});import Hb from"node:crypto";import wi from"node:fs/promises";import hm from"node:path";function ym(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,Qc,Ze,zr=y(()=>{"use strict";Se();N();le();ye();Wt="1.0.0";l(ym,"getDefaultChecksums");Qc=class{static{l(this,"IndexStorage")}getIndexPath(e){return hm.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await wi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Wt?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 ym()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await wi.readFile(e);return Hb.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Wt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{M.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await wi.readdir(t);await Promise.all(n.map(r=>wi.unlink(hm.join(t,r))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),r=new Map;if(!n)return r;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=M.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,n){let r=M.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Ze=new Qc});var wm,Gb,ki,zb,km=y(()=>{"use strict";zr();wm=8e4,Gb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},ki=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let r=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||wm,[c,u,d]=await Promise.all([Ze.readIndex(t),Ze.readDomains(t),Ze.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let v of m){let $=d.domainIndex[v]||[];for(let F of $)p.add(F)}if(i&&d.domainIndex.general){let v=d.domainIndex.general.slice(0,10);for(let $ of v)p.add($)}let g=c.relevantFiles.filter(v=>p.has(v.path)&&v.score>=o);g.sort((v,$)=>$.score-v.score);let f=0,k=[];for(let v of g){let $=Math.ceil(v.size/this.CHARS_PER_TOKEN);if(f+$>a||k.length>=r)break;k.push(v),f+=$}let b=Math.ceil(c.relevantFiles.reduce((v,$)=>v+$.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),r=new Set;for(let[o,i]of Object.entries(Gb))for(let a of i)if(n.includes(a)){r.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){r.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){r.add(o.name);break}}return r.size===0&&(r.add("services"),r.add("api")),Array.from(r)}async filterByDomains(e,t,n){let r=await Ze.readCategories(e);if(!r)return n||[];let o=new Set;for(let a of t){let c=r.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Ze.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ze.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,r=t.minScore||30,o=t.tokenBudget||wm,i=e.filter(d=>d.score>=r).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let r of e){let o=n[r];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},zb=new ki});import Sm from"node:path";var Zc,Si,Wb,bm=y(()=>{"use strict";zr();le();Zc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Si=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let r=n.useLLM!==!1,o=r?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=r?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:r?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!r}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Zc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Sm.dirname(i.path);n.get(u).add(`**/${Sm.basename(d)}/**`)}}let r=this.extractDirectoryDomains(e);for(let[i,a]of r)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Zc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let r=n.path.split("/");for(let o of r.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],r=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Zc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:r,method:"heuristic"})}return n}async saveToCache(e,t,n){let r=C(),o={version:Wt,projectId:e,domains:t,discoveredAt:r};await Ze.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Wt,lastUpdate:r,fileCategories:n,domainIndex:i};await Ze.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ze.readDomains(e),Ze.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let r=await Ze.readDomains(e);if(!r)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,r.domains):this.categorizeFilesHeuristic(t,r.domains),i=await Ze.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Wt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Ze.writeCategories(e,m)}return o}},Wb=new Si});import el from"node:path";var tl,Bb,Vb,bi,Cm,nl=y(()=>{"use strict";tl=30,Bb=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Vb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],bi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},r=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,r)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,r)=>r.score-n.score)}getRelevantFiles(e,t=tl){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,r=t.allFiles.size;if(r===0)return 0;let o=n/r;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=el.basename(e.path);for(let n of Bb)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=el.basename(e.path);for(let r of Vb)if(r.test(t))return 15;let n=el.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let r=n/t.maxRecentCommits;return r>=.5?10:r>=.25?7:r>=.1?5:n>0?2:0}},Cm=new bi});import{execSync as sl}from"node:child_process";var Ci,rl,Pi,_s,vi=y(()=>{"use strict";Fr();Ci={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"}},rl=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Ci[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ci[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Pi(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=Ci[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
|
|
304
|
-
`);throw new
|
|
305
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ci),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=sl(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return sl(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return sl(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Pi=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}},_s=new rl});import{exec as Jb}from"node:child_process";import{promisify as qb}from"node:util";var GM,Pm=y(()=>{"use strict";un();vi();GM=qb(Jb)});var xi,mt,ol=y(()=>{"use strict";qe();vn();ye();xi=class{static{l(this,"MemoryService")}async log(e,t,n,r){try{let o=await R.getProjectId(e);if(!o)return;q.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?q.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let r=await R.getProjectId(e);return r?q.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;q.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 q.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let r=n-Zt.MEMORY_MAX_ENTRIES,o=q.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);kt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&q.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new xi});var vm=y(()=>{"use strict";Se();ve()});import{exec as Yb}from"node:child_process";import{promisify as Xb}from"node:util";var rO,xm=y(()=>{"use strict";zr();le();nl();rO=Xb(Yb)});import{createHash as Qb}from"node:crypto";var il,bt,Ti=y(()=>{"use strict";oc();le();en();il=class extends We{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};rc.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return rc.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Vd(r,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 Qb("sha256").update(JSON.stringify(t)).digest("hex")}},bt=new il});var al,dn,Wr=y(()=>{"use strict";li();le();en();al=class extends We{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",nm)}getDefault(){return{...sm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+r)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let v=b.findIndex($=>$.agentName===D);v>=0?b[v]={...b[v],usageCount:b[v].usageCount+1,tokensSaved:b[v].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:rm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},dn=new al});import lt from"node:fs/promises";import pe from"node:path";async function Br(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(M.exists(s)&&M.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=I.getGlobalProjectPath(s),r=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await Zb(r,o,i),M.getDb(s);for(let{filename:a,key:c}of ul){let u=pe.join(r,a),d=await Xn(u);if(d===null){t.skippedFiles.push(a);continue}try{M.setDoc(s,c,d),Tm(s,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of ll){let u=pe.join(o,a),d=await Xn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{M.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Em(s,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await aC(s,o,t),await cC(s,o,t),await lC(s,i,t),await uC(s,i,t),t.errors.length===0&&await dC(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function Zb(s,e,t){let n=pe.join(s,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(pe.join(n,"index"),{recursive:!0}),await lt.mkdir(pe.join(n,"memory"),{recursive:!0}),await cl(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await cl(e,pe.join(n,"index")),await cl(t,pe.join(n,"memory")),n}async function cl(s,e,t){try{let n=await lt.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=pe.join(s,r.name),i=pe.join(e,r.name);await lt.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Tm(s,e,t){switch(e){case"state":eC(s,t);break;case"queue":tC(s,t);break;case"ideas":nC(s,t);break;case"shipped":sC(s,t);break;case"metrics":rC(s,t);break;case"analysis":oC(s,t);break}}function eC(s,e){let t=M.getDb(s),n=t.prepare(`
|
|
348
|
+
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Gs=new Si});var bi,Ci,xm=y(()=>{"use strict";bi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},Ci=new bi});import Yb from"node:crypto";import vi from"node:fs/promises";import Pm from"node:path";function Tm(){return{version:Bt,lastUpdated:"",checksums:{}}}var Bt,rl,tt,qr=y(()=>{"use strict";ke();N();ae();fe();Bt="1.0.0";l(Tm,"getDefaultChecksums");rl=class{static{l(this,"IndexStorage")}getIndexPath(e){return Pm.join(E.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await vi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Bt?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 Tm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await vi.readFile(e);return Yb.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Bt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{R.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await vi.readdir(t);await Promise.all(n.map(s=>vi.unlink(Pm.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Bt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Bt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=R.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=R.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},tt=new rl});var Em,Xb,xi,Qb,Im=y(()=>{"use strict";qr();Em=8e4,Xb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},xi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||Em,[c,u,d]=await Promise.all([tt.readIndex(t),tt.readDomains(t),tt.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let M=d.domainIndex[x]||[];for(let F of M)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let M of x)p.add(M)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,M)=>M.score-x.score);let f=0,k=[];for(let x of g){let M=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+M>a||k.length>=s)break;k.push(x),f+=M}let b=Math.ceil(c.relevantFiles.reduce((x,M)=>x+M.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Xb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await tt.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await tt.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return tt.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Em,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},Qb=new xi});import Am from"node:path";var ol,Pi,Zb,jm=y(()=>{"use strict";qr();ae();ol=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Pi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of ol)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Am.dirname(i.path);n.get(u).add(`**/${Am.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=ol.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of ol)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Bt,projectId:e,domains:t,discoveredAt:s};await tt.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Bt,lastUpdate:s,fileCategories:n,domainIndex:i};await tt.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([tt.readDomains(e),tt.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await tt.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await tt.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Bt,lastUpdate:C(),fileCategories:u,domainIndex:d};await tt.writeCategories(e,m)}return o}},Zb=new Pi});import il from"node:path";var al,eC,tC,Ti,Dm,cl=y(()=>{"use strict";al=30,eC=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],tC=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],Ti=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=al){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=il.basename(e.path);for(let n of eC)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=il.basename(e.path);for(let s of tC)if(s.test(t))return 15;let n=il.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},Dm=new Ti});import{execSync as ll}from"node:child_process";var Ei,ul,Ii,zs,Ai=y(()=>{"use strict";Hr();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"}},ul=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Ei[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ei[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Ii(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Ei[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
349
|
+
`);throw new Ii({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
350
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ei),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=ll(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Lr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return ll(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return ll(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Lr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Ii=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}},zs=new ul});import{exec as nC}from"node:child_process";import{promisify as sC}from"node:util";var lO,Rm=y(()=>{"use strict";mn();Ai();lO=sC(nC)});var ji,ft,dl=y(()=>{"use strict";qe();Tn();fe();ji=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;q.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?q.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?q.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;q.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 q.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=tn.MEMORY_MAX_ENTRIES)return 0;let s=n-tn.MEMORY_MAX_ENTRIES,o=q.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);bt.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&&q.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},ft=new ji});var $m=y(()=>{"use strict";ke();Te()});import{exec as oC}from"node:child_process";import{promisify as iC}from"node:util";var PO,Mm=y(()=>{"use strict";qr();ae();cl();PO=iC(oC)});import{createHash as aC}from"node:crypto";var pl,vt,Di=y(()=>{"use strict";dc();ae();nn();pl=class extends Be{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};uc.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return uc.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Qd(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return aC("sha256").update(JSON.stringify(t)).digest("hex")}},vt=new pl});var ml,gn,Kr=y(()=>{"use strict";gi();ae();nn();ml=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",lm)}getDefault(){return{...um}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(M=>M.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:dm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},gn=new ml});import pt from"node:fs/promises";import me from"node:path";async function Yr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(R.exists(r)&&R.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=E.getGlobalProjectPath(r),s=me.join(n,"storage"),o=me.join(n,"index"),i=me.join(n,"memory");t.backupDir=await cC(s,o,i),R.getDb(r);for(let{filename:a,key:c}of hl){let u=me.join(s,a),d=await ts(u);if(d===null){t.skippedFiles.push(a);continue}try{R.setDoc(r,c,d),Om(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of fl){let u=me.join(o,a),d=await ts(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{R.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Fm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await hC(r,o,t),await yC(r,o,t),await wC(r,i,t),await kC(r,i,t),t.errors.length===0&&await SC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function cC(r,e,t){let n=me.join(r,"backup");return await pt.mkdir(n,{recursive:!0}),await pt.mkdir(me.join(n,"index"),{recursive:!0}),await pt.mkdir(me.join(n,"memory"),{recursive:!0}),await gl(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await gl(e,me.join(n,"index")),await gl(t,me.join(n,"memory")),n}async function gl(r,e,t){try{let n=await pt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=me.join(r,s.name),i=me.join(e,s.name);await pt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Om(r,e,t){switch(e){case"state":lC(r,t);break;case"queue":uC(r,t);break;case"ideas":dC(r,t);break;case"shipped":pC(r,t);break;case"metrics":mC(r,t);break;case"analysis":gC(r,t);break}}function lC(r,e){let t=R.getDb(r),n=t.prepare(`
|
|
306
351
|
INSERT OR REPLACE INTO tasks
|
|
307
352
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
308
353
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
309
354
|
shipped_at, paused_at, pause_reason, pr_url, expected_value, data)
|
|
310
355
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
311
|
-
`),
|
|
356
|
+
`),s=t.prepare(`
|
|
312
357
|
INSERT OR REPLACE INTO subtasks
|
|
313
358
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
314
359
|
depends_on, started_at, completed_at, output, summary)
|
|
315
360
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
316
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];
|
|
361
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function uC(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
|
|
317
362
|
INSERT OR REPLACE INTO queue_tasks
|
|
318
363
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
319
364
|
feature_id, feature_name)
|
|
320
365
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
321
|
-
`);for(let o of t)
|
|
366
|
+
`);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function dC(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
|
|
322
367
|
INSERT OR REPLACE INTO ideas
|
|
323
368
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
324
369
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
325
|
-
`);for(let o of t)
|
|
370
|
+
`);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function pC(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
|
|
326
371
|
INSERT OR REPLACE INTO shipped_features
|
|
327
372
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
328
373
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
329
|
-
`);for(let o of t)
|
|
374
|
+
`);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function mC(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
|
|
330
375
|
INSERT OR REPLACE INTO metrics_daily
|
|
331
376
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
332
377
|
VALUES (?, ?, ?, ?, ?)
|
|
333
|
-
`);for(let o of t)
|
|
378
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function gC(r,e){let n=R.getDb(r).prepare(`
|
|
334
379
|
INSERT OR REPLACE INTO analysis
|
|
335
380
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
336
381
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
337
|
-
`),
|
|
382
|
+
`),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function Fm(r,e,t){e==="categories-cache"&&fC(r,t)}function fC(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=R.getDb(r).prepare(`
|
|
338
383
|
INSERT OR REPLACE INTO index_files
|
|
339
384
|
(path, categories, domain, score, size, mtime, language)
|
|
340
385
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
341
|
-
`);for(let o of t)
|
|
386
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function hC(r,e,t){let n=me.join(e,"checksums.json"),s=await ts(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=R.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 yC(r,e,t){let n=me.join(e,"file-scores.json"),s=await ts(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=R.getDb(r),a=i.prepare(`
|
|
342
387
|
INSERT OR REPLACE INTO index_files
|
|
343
388
|
(path, score, size, mtime, language, categories, domain)
|
|
344
389
|
VALUES (?, ?, ?, ?, NULL,
|
|
345
390
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
346
391
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
347
|
-
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function
|
|
348
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=
|
|
349
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=
|
|
350
|
-
`).filter(f=>f.trim());if(p.length===0){await
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
${e.join(" | ")}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
${
|
|
359
|
-
${
|
|
360
|
-
`)}`}function
|
|
361
|
-
|
|
362
|
-
${e}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
Detected: ${e}
|
|
367
|
-
`)
|
|
368
|
-
Setup cancelled. Run again anytime.
|
|
369
|
-
`))
|
|
370
|
-
`).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},gC=new ji,gt=gC});var Di,fC,yl,_m=y(()=>{"use strict";Zn();Di=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,r=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:r,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let r=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let r=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.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 r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},fC=new Di,yl=fC});var qr,Ri,wl,kl=y(()=>{"use strict";Es();le();qr=3,Ri=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}async learnFromOutcomes(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.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(r.taskId),t.set(u,d)}}let n=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let r of n.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let r of n.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:n,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let r of n.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([n,{count:r}])=>r>=2).map(([n,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,r=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of r)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>=qr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,r)=>r.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let r=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:r}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:r,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[O.FILE_STRUCTURE,O.ARCHITECTURE],tech_stack:[O.TECH_STACK],architecture:[O.ARCHITECTURE,O.CODE_STYLE],estimation:[O.SHIP_WORKFLOW],workflow:[O.SHIP_WORKFLOW,O.CODE_STYLE],gotcha:[O.TEST_BEHAVIOR,O.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: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
371
|
-
`)}},wl=new Ri});var $i,Nm,Sl=y(()=>{"use strict";uc();en();le();$i=class extends We{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...ip,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Uo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),r=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Uo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,r=t/60,o=ap(n,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=cp(5,r);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:lp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},Nm=new $i});var bl=y(()=>{"use strict";Fm();_m();kl();Zn();Sl()});import nn from"chalk";function hC(s){return Lm[s.toLowerCase()]||Lm.default}var Lm,Cl,Mi,Um=y(()=>{"use strict";Lm={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(hC,"getIcon");Cl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
|
|
392
|
+
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function wC(r,e,t){let n=me.join(e,"events.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
|
|
393
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=R.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function kC(r,e,t){let n=me.join(e,"learnings.jsonl");try{let o=(await pt.readFile(n,"utf-8")).split(`
|
|
394
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=R.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function SC(r,e,t,n){let s=l(async(i,a)=>{try{await pt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of hl)await s(me.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(me.join(e,i),`cleanup:index/${i}`);await s(me.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(me.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function ts(r){try{let e=await pt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function Ri(r){let e=E.getGlobalProjectPath(r),t=me.join(e,"storage"),n=0;R.getDb(r);for(let{filename:u,key:d}of hl){let m=me.join(t,u),p=await ts(m);if(p!==null){R.setDoc(r,d,p),Om(r,d,p);try{await pt.unlink(m)}catch{}n++}}let s=me.join(e,"project.json"),o=await ts(s);if(o!==null){R.setDoc(r,"project",o);try{await pt.unlink(s)}catch{}n++}let i=me.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=me.join(i,u);try{let p=(await pt.readFile(d,"utf-8")).split(`
|
|
395
|
+
`).filter(f=>f.trim());if(p.length===0){await pt.unlink(d),n++;continue}let g=R.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,k,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await pt.unlink(d),n++}catch{}}let a=me.join(e,"index"),c=[...fl.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=me.join(a,u),m=await ts(d);if(m===null)continue;let p=fl.find(g=>g.filename===u);p&&(R.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Fm(r,p.key,m));try{await pt.unlink(d)}catch{}n++}return n}var hl,fl,$i=y(()=>{"use strict";ke();N();fe();hl=[{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"}],fl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Yr,"migrateJsonToSqlite");l(cC,"createBackup");l(gl,"copyFiles");l(Om,"populateNormalized");l(lC,"populateTasksFromState");l(uC,"populateQueueTasks");l(dC,"populateIdeas");l(pC,"populateShippedFeatures");l(mC,"populateMetricsDaily");l(gC,"populateAnalysis");l(Fm,"populateIndexTables");l(fC,"populateCategoriesIndex");l(hC,"migrateChecksums");l(yC,"migrateFileScores");l(wC,"migrateEventsJsonl");l(kC,"migrateLearningsJsonl");l(SC,"cleanupJsonFiles");l(ts,"readJsonSafe");l(Ri,"sweepLegacyJson")});var _m=y(()=>{"use strict";Pc();N()});var yl,wl,kl=y(()=>{"use strict";Ds();nn();yl=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Dp,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}},wl=new yl});var Vt=y(()=>{"use strict";Di();Tn();fe();Mr();qr();Kr();$i();Or();Fr();Nr();_m();nn();kl()});function bC(){return`\u26A1 prjct
|
|
396
|
+
|
|
397
|
+
---`}function CC(){return`---
|
|
398
|
+
\u26A1 prjct \xB7 v${Wn()}`}function Se(...r){return vC(bC(),...r.filter(Boolean),CC())}function Sl(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
|
|
399
|
+
`)}function nt(r,e,t=3){return`### ${r}
|
|
400
|
+
${e}`}function xt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
401
|
+
`)}function bl(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
402
|
+
> ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Nm(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
|
|
403
|
+
${Sl(t,n)}`}function Lm(r){return r.length===0?"":`### Relevant Files
|
|
404
|
+
${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
|
|
405
|
+
`)}`}function Hm(r){return`### Rules
|
|
406
|
+
${xt(r)}`}function Xe(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
|
|
407
|
+
${Sl(e,t)}`}function Rt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Sl(t,n)}function Jt(r,e){return e?`## \u2705 ${r}
|
|
408
|
+
> ${e}`:`## \u2705 ${r}`}function Um(r){return`> \u26A0\uFE0F **${r}**`}function vC(...r){return r.filter(Boolean).join(`
|
|
409
|
+
|
|
410
|
+
`)}function sn(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ws=y(()=>{"use strict";lt();l(bC,"mdHeader");l(CC,"mdFooter");l(Se,"mdOutput");l(Sl,"mdTable");l(nt,"mdSection");l(xt,"mdList");l(bl,"mdTaskHeader");l(Nm,"mdSubtasks");l(Lm,"mdRelevantFiles");l(Hm,"mdRules");l(Xe,"mdNextSteps");l(Rt,"mdStats");l(Jt,"mdDone");l(Um,"mdWarn");l(vC,"mdJoin");l(sn,"mdActionRequired")});import Xr from"chalk";function Pt(r,e={}){if(e.quiet)return;let t=zm[r]||"idle",n=Jn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Gm[o]||o}));console.log(Xr.dim(`
|
|
411
|
+
Next:`));for(let o of s){let i=Xr.cyan(o.cmd.padEnd(12));console.log(Xr.dim(` ${i} \u2192 ${o.desc}`))}}function Mi(r){let e=zm[r]||"idle";return Jn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Gm[n]||n}))}function Qr(r){let e=Jn.getStateInfo(r);console.log(Xr.dim(`\u{1F4CD} State: ${Xr.white(r.toUpperCase())} - ${e.description}`))}var Gm,zm,Bs=y(()=>{"use strict";jc();Gm={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"},zm={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(Pt,"showNextSteps");l(Mi,"getNextSteps");l(Qr,"showStateInfo")});import*as ie from"@clack/prompts";import ns from"chalk";var Oi,Wm,Vs,Bm=y(()=>{"use strict";zt();Oi=[{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."}],Wm=[{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"}],Vs=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;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(){ie.intro(ns.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(this.currentStep++,!await t.run()||this.aborted)return this.buildResult(!0);return ie.outro(ns.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=Oi.findIndex(n=>n.value===this.detectedType),t=await ie.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Oi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Oi[e].value:void 0});return ie.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ie.multiselect({message:"Which AI agents do you use?",options:Wm.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ie.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);ie.note(e,"Detected stack");let t=await ie.confirm({message:"Is this stack correct?",initialValue:!0});if(ie.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ie.group({language:l(()=>ie.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ie.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await ie.group({verbosity:l(()=>ie.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(()=>ie.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=[`${ns.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${ns.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${ns.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${ns.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${ns.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
412
|
+
`);ie.note(e,"Configuration Summary");let t=await ie.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ie.isCancel(t)||!t?(ie.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,ie.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Oi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Wm.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import Cl from"node:path";var xC,PC,Fi,TC,ht,ss=y(()=>{"use strict";ke();Ht();Te();xC="outcomes",PC="outcomes.jsonl",Fi=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=E.getGlobalProjectPath(e);return Cl.join(t,xC)}getOutcomesPath(e){return Cl.join(this.getOutcomesDir(e),PC)}async record(e,t){let n={...t,id:he()},s=this.getOutcomesPath(e);return await Lt(Cl.dirname(s)),await Ua(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await xs(t);return n.trim()?n.trim().split(`
|
|
413
|
+
`).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},TC=new Fi,ht=TC});var _i,EC,vl,Vm=y(()=>{"use strict";ss();_i=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ht.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await ht.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await ht.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await ht.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await ht.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},EC=new _i,vl=EC});var Zr,Ni,xl,Pl=y(()=>{"use strict";$s();ae();Zr=3,Ni=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Zr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Zr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Zr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Zr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Zr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[O.FILE_STRUCTURE,O.ARCHITECTURE],tech_stack:[O.TECH_STACK],architecture:[O.ARCHITECTURE,O.CODE_STYLE],estimation:[O.SHIP_WORKFLOW],workflow:[O.SHIP_WORKFLOW,O.CODE_STYLE],gotcha:[O.TEST_BEHAVIOR,O.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: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
414
|
+
`)}},xl=new Ni});var Li,Jm,Tl=y(()=>{"use strict";hc();nn();ae();Li=class extends Be{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...pp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Bo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Bo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Bo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=mp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=gp(5,s);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:fp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Jm=new Li});var El=y(()=>{"use strict";Bm();Vm();Pl();ss();Tl()});import rn from"chalk";function IC(r){return qm[r.toLowerCase()]||qm.default}var qm,Il,Hi,Km=y(()=>{"use strict";qm={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(IC,"getIcon");Il=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(rn.cyan(`
|
|
372
415
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
373
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let
|
|
374
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
375
|
-
`)}function
|
|
376
|
-
`)}var
|
|
377
|
-
`;return
|
|
378
|
-
`}),
|
|
416
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=IC(t);console.log(rn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(rn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(rn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(rn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?rn.green("\u2713"):rn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${rn.dim(`(${n})`)}
|
|
417
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${rn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(rn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Hi=new Il});import st from"chalk";function AC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Ym.length;return Ym[t]}function jC(r,e,t="\u25B6"){let n=st.dim(String(r+1).padStart(2)),o=AC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=st.green("\u2713 Complete");break;case"in_progress":a=st.yellow(`${t} Working...`);break;case"pending":a=st.gray("\u25CB Pending");break;case"failed":a=st.red("\u2717 Failed");break;case"blocked":a=st.gray("\u2298 Blocked");break;default:a=st.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function DC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${st.bold.white("SUBTASK PROGRESS")}`),e.push(` ${st.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(jC(t,r[t]));return e.push(""),e.join(`
|
|
418
|
+
`)}function Xm(r){console.log(DC(r))}var Ym,Qm=y(()=>{"use strict";Ym=[st.cyan,st.magenta,st.yellow,st.blue,st.green,st.redBright,st.magentaBright,st.cyanBright];l(AC,"getDomainColor");l(jC,"formatSubtaskLine");l(DC,"renderSubtaskProgress");l(Xm,"printSubtaskProgress")});function RC(r){return Zm.includes(r)}async function $C(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function MC(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
|
|
419
|
+
`)}var Zm,OC,Ui,eg=y(()=>{"use strict";Zm=["ship","feature","spec","cleanup","migrate"];l(RC,"requiresReasoning");l($C,"reason");l(MC,"formatPlan");OC={requiresReasoning:RC,reason:$C,formatPlan:MC,REASONING_REQUIRED_COMMANDS:Zm},Ui=OC});import eo from"node:fs/promises";var Al,FC,yt,jl=y(()=>{"use strict";qe();ke();N();ni();Al=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ut({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=E.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:E.getFilePath(n,"core","now.md"),next:E.getFilePath(n,"core","next.md"),context:E.getFilePath(n,"core","context.md"),shipped:E.getFilePath(n,"progress","shipped.md"),metrics:E.getFilePath(n,"progress","metrics.md"),ideas:E.getFilePath(n,"planning","ideas.md"),roadmap:E.getFilePath(n,"planning","roadmap.md"),specs:E.getFilePath(n,"planning","specs"),memory:E.getFilePath(n,"memory","context.jsonl"),patterns:E.getFilePath(n,"memory","patterns.json"),analysis:E.getFilePath(n,"analysis","repo-summary.md"),codePatterns:E.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await eo.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([eo.readFile(d,"utf-8"),eo.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await eo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await eo.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},FC=new Al,yt=FC});import{exec as _C}from"node:child_process";import je from"node:fs/promises";import tg from"node:os";import $n from"node:path";import{promisify as NC}from"node:util";function ng(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function Dl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function HC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
420
|
+
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
421
|
+
`}),r.recommendations.length>0&&(e+=`
|
|
379
422
|
Recommendations:
|
|
380
|
-
`,
|
|
381
|
-
`})),e}async function
|
|
382
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let r=Dn.join(s.projectPath,"package.json");try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=s.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=s.params.feature||s.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${xl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await Ae.readFile(r,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=s.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(xl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=s.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Xm(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await Ae.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&s.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=s.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(r,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Dn.join(Vm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Zm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(r,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=Dn.join(Vm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function eg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await Ae.access(Dn.join(s.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(Dn.join(s.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function tg(s){let e=[],t=[],n={},r=s.paths.specs;try{await Ae.access(r),n.specsExists=!0;let i=await Ae.readdir(r);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=s.params.feature||s.params.name||s.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sg(s,e,t){let n=ng[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${w(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function AC(s,e,t){let n=await sg(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function jC(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var EC,ng,DC,Fi,rg=y(()=>{"use strict";N();EC=TC(xC);l(Jm,"formatDuration");l(xl,"escapeRegex");l(IC,"formatWarnings");l(qm,"verifyDone");l(Km,"verifyShip");l(Ym,"verifyFeature");l(Xm,"verifyNow");l(Qm,"verifyInit");l(Zm,"verifySync");l(eg,"verifyAnalyze");l(tg,"verifySpec");ng={done:qm,ship:Km,feature:Ym,now:Xm,init:Qm,sync:Zm,analyze:eg,spec:tg};l(sg,"verify");l(AC,"prepareCommand");l(jC,"requiresVerification");DC={verify:sg,prepareCommand:AC,requiresVerification:jC,verifiers:ng,formatWarnings:IC,formatDuration:Jm,escapeRegex:xl,verifyDone:qm,verifyShip:Km,verifyFeature:Ym,verifyNow:Xm,verifyInit:Qm,verifySync:Zm,verifyAnalyze:eg,verifySpec:tg},Fi=DC});function $C(s){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."}[s]||"Verify actual state before proceeding."}function MC(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of RC)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:$C(t)};return{detected:!1}}function OC(s,e){if(!s||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(s)===t(e)}function FC(s){if(!s||s.length===0)return{type:"unknown",description:"No error information"};let e=s[s.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 _C(s,e,t){let n={permission:`I've tried ${s} ${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 ${s}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${s} from completing.`,validation:`Validation keeps failing for ${s}.`,config:`There seems to be a configuration issue affecting ${s}.`,unknown:`I've tried ${s} ${t} times without success.`};return n[e.type]||n.unknown}function NC(s){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[s.type]||e.unknown}var RC,Tl,LC,Hs,og=y(()=>{"use strict";RC=[{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($C,"getHallucinationSuggestion");l(MC,"detectHallucination");l(OC,"isSimilarError");l(FC,"analyzeErrorPattern");l(_C,"generateEscalationMessage");l(NC,"generateSuggestion");Tl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>OC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return null;let o=FC(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:_C(e,o,this.maxAttempts),suggestion:NC(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(n,r))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return MC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},LC=new Tl,Hs=LC});function El(s,e){let t=Yr(e),n=UC[t.startDay],r=new Date(s);r.setHours(0,0,0,0);let i=(r.getDay()-n+7)%7;return r.setDate(r.getDate()-i),r}function HC(s,e){let t=Yr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function GC(s,e,t){let n=Yr(t),r=El(s,t),o=El(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function _i(s,e=Pn){let t=Yr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=zC(s,e),r=WC(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=JC(o),a=BC(o),c=VC(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=qC(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function ag(s,e,t=Pn){let n=Yr(t);if(e<=0)return{totalPoints:s,sprints:0,estimatedDate:""};let r=Math.ceil(s/e),o=r*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:s,sprints:r,estimatedDate:i.toISOString()}}function zC(s,e){let t=new Map,n=s.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of s){let i=new Date(o.completedAt),a=GC(i,r,e);if(!t.has(a)){let c=El(i,e),u=HC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function WC(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+KC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Al(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:r,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,r)=>n.sprintNumber-r.sprintNumber)}function BC(s){if(s.length<3)return"stable";let e=s.map(d=>d.pointsCompleted),t=e.length,n=0,r=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*r)/(t*i-n*n),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function VC(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Al(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function JC(s){if(s.length===0)return 0;let e=s.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/s.length*10)/10}function qC(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Al(r),i=r.tags&&r.tags.length>0?r.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[r,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),n.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:n}}function Al(s){if(!s.variance)return 0;let e=Il(s.estimatedDuration),t=Il(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Il(s){let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),s.match(/(\d+)s/)&&e===0&&(e=1),e}function cg(s){if(s.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${s.averageVelocity} pts/sprint (trend: ${s.velocityTrend})`),e.push(`Estimation accuracy: ${s.estimationAccuracy}%`);for(let t of s.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of s.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
383
|
-
`)}function
|
|
423
|
+
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
424
|
+
`})),e}async function sg(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await je.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=ng(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await je.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await je.access($n.dirname(i),je.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function rg(r){let e=[],t=[],n={};try{let{stdout:i}=await LC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
425
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=$n.join(r.projectPath,"package.json");try{let i=await je.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await je.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Dl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await je.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function og(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await je.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await je.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Dl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await je.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ig(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await je.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await je.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ag(r){let e=[],t=[],n={},s=$n.join(r.projectPath,".prjct/prjct.config.json");try{let i=await je.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=$n.join(tg.homedir(),".prjct-cli");try{await je.access(o,je.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await je.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function cg(r){let e=[],t=[],n={},s=$n.join(r.projectPath,".prjct/prjct.config.json");try{let a=await je.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=$n.join(tg.homedir(),".prjct-cli/projects",o||"");try{await je.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function lg(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await je.access($n.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await je.stat($n.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function ug(r){let e=[],t=[],n={},s=r.paths.specs;try{await je.access(s),n.specsExists=!0;let i=await je.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function pg(r,e,t){let n=dg[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function UC(r,e,t){let n=await pg(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function GC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var LC,dg,zC,Gi,mg=y(()=>{"use strict";N();LC=NC(_C);l(ng,"formatDuration");l(Dl,"escapeRegex");l(HC,"formatWarnings");l(sg,"verifyDone");l(rg,"verifyShip");l(og,"verifyFeature");l(ig,"verifyNow");l(ag,"verifyInit");l(cg,"verifySync");l(lg,"verifyAnalyze");l(ug,"verifySpec");dg={done:sg,ship:rg,feature:og,now:ig,init:ag,sync:cg,analyze:lg,spec:ug};l(pg,"verify");l(UC,"prepareCommand");l(GC,"requiresVerification");zC={verify:pg,prepareCommand:UC,requiresVerification:GC,verifiers:dg,formatWarnings:HC,formatDuration:ng,escapeRegex:Dl,verifyDone:sg,verifyShip:rg,verifyFeature:og,verifyNow:ig,verifyInit:ag,verifySync:cg,verifyAnalyze:lg,verifySpec:ug},Gi=zC});function BC(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 VC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of WC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:BC(t)};return{detected:!1}}function JC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function qC(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 KC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function YC(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 WC,Rl,XC,Js,gg=y(()=>{"use strict";WC=[{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(BC,"getHallucinationSuggestion");l(VC,"detectHallucination");l(JC,"isSimilarError");l(qC,"analyzeErrorPattern");l(KC,"generateEscalationMessage");l(YC,"generateSuggestion");Rl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>JC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=qC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:KC(e,o,this.maxAttempts),suggestion:YC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return VC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},XC=new Rl,Js=XC});function $l(r,e){let t=to(e),n=QC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function ZC(r,e){let t=to(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function ev(r,e,t){let n=to(t),s=$l(r,t),o=$l(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function zi(r,e=Pn){let t=to(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=tv(r,e),s=nv(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=ov(o),a=sv(o),c=rv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=iv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function hg(r,e,t=Pn){let n=to(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function tv(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=ev(i,s,e);if(!t.has(a)){let c=$l(i,e),u=ZC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function nv(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+av(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Ol(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function sv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function rv(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Ol(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function ov(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function iv(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Ol(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function Ol(r){if(!r.variance)return 0;let e=Ml(r.estimatedDuration),t=Ml(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Ml(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function yg(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(`
|
|
426
|
+
`)}function av(r){if(!r.estimatedDuration)return 0;let e=Ml(r.estimatedDuration);if(e<=0)return 0;let t=fg[0],n=Number.POSITIVE_INFINITY;for(let s of fg){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function to(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var QC,fg,Fl=y(()=>{"use strict";Ds();QC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l($l,"getSprintStart");l(ZC,"getSprintEnd");l(ev,"getSprintNumber");l(zi,"calculateVelocity");l(hg,"projectCompletion");l(tv,"bucketBySprint");l(nv,"buildSprintVelocities");l(sv,"detectTrend");l(rv,"calculateOverallAccuracy");l(ov,"calculateAverageVelocity");l(iv,"detectEstimationPatterns");l(Ol,"parseVariancePercent");l(Ml,"parseDurationMinutes");l(yg,"formatVelocityContext");fg=[{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(av,"derivePoints");l(to,"resolveConfig")});import{exec as cv}from"node:child_process";import lv from"node:fs/promises";import Wi from"node:path";import{promisify as uv}from"node:util";async function rs(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=fv(r),c=await hv(e),u=await yv(e),d=[];for(let p of c){if(!i&&kv(p))continue;let g=wv(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function fv(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function hv(r){let e=[];async function t(n,s=""){try{let o=await lv.readdir(n,{withFileTypes:!0});for(let i of o){let a=Wi.join(n,i.name),c=Wi.join(s,i.name);if(i.isDirectory()){if(gv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Wi.extname(i.name).toLowerCase();mv.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function yv(r){let e=new Map;try{let{stdout:t}=await dv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
384
427
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
385
428
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
386
429
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
387
|
-
'`,{cwd:
|
|
388
|
-
`).filter(Boolean);for(let o of
|
|
430
|
+
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
431
|
+
`).filter(Boolean);for(let o of s){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((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function wv(r,e,t){let n=[],s=0,o=0,i=0,a=0,c=r.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(s+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){s+=.15;break}}s=Math.min(1,s);for(let[g,f]of Object.entries(pv))for(let k of f)if(c.includes(k)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Wi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function kv(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 dv,pv,mv,gv,Bi=y(()=>{"use strict";N();dv=uv(cv),pv={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"]},mv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),gv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(rs,"findRelevantFiles");l(fv,"extractKeywords");l(hv,"getAllCodeFiles");l(yv,"getGitRecency");l(wv,"scoreFile");l(kv,"isTestFile")});import{exec as Sv}from"node:child_process";import{promisify as bv}from"node:util";async function so(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await xv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await vv(r,t);return o=o.filter(c=>!Pv(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),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 no(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
389
432
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
390
433
|
NF {
|
|
391
434
|
count[$0]++
|
|
@@ -394,9 +437,9 @@ Recommendations:
|
|
|
394
437
|
END {
|
|
395
438
|
for (f in count) print count[f], lastmod[f], f
|
|
396
439
|
}
|
|
397
|
-
' | sort -rn`,{cwd:
|
|
398
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of
|
|
399
|
-
`).filter(Boolean),{stdout:i}=await
|
|
440
|
+
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
441
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function xv(r){let{stdout:e}=await no("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await no("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await no(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
442
|
+
`).filter(Boolean),{stdout:i}=await no(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
400
443
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
401
444
|
NF {
|
|
402
445
|
count[$0]++
|
|
@@ -405,40 +448,40 @@ Recommendations:
|
|
|
405
448
|
END {
|
|
406
449
|
for (f in count) print count[f], lastmod[f], f
|
|
407
450
|
}
|
|
408
|
-
'`,{cwd:
|
|
409
|
-
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),
|
|
410
|
-
`);return{file:
|
|
411
|
-
`),
|
|
412
|
-
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:
|
|
451
|
+
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
452
|
+
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),M=Math.max(0,1-D/14),F=g/d,G=M*.5+F*.5,ee;x<1?ee="just now":x<24?ee=`${x}h ago`:ee=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(G*100)/100,lastChanged:ee,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Pv(r){let e=r.split("/").pop()||"";for(let t of Cv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var no,Cv,_l=y(()=>{"use strict";no=bv(Sv),Cv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(so,"getRecentFiles");l(vv,"getHotFilesFromCommits");l(xv,"getBranchOnlyFiles");l(Pv,"shouldIgnore")});function Vi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function wg(r,e){let t=Tv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Ll(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ro(r,e){let t=Vi(r),n=Vi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=wg(s,Ev),a=Nl.map(c=>({model:c,...wg(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Ll(i.total),byModel:a}}}function os(r){let e=Vi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Nl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Ji(r){if(r.length===0)return os("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=Nl.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:n},compression:s,cost:{saved:i,formatted:Ll(i),byModel:o}}}function Iv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Av(r){return`${Math.round(r*100)}%`}var Tv,Ev,Nl,oo=y(()=>{"use strict";Tv={"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}},Ev="claude-sonnet-4.5";l(Vi,"countTokens");Nl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(wg,"calculateModelCost");l(Ll,"formatCostSaved");l(ro,"measureCompression");l(os,"noCompression");l(Ji,"combineMetrics");l(Iv,"formatTokenCount");l(Av,"formatCompressionRate")});import bg from"node:fs/promises";import Mn from"node:path";async function On(r,e=process.cwd()){let t=Mn.isAbsolute(r)?r:Mn.join(e,r),n;try{n=await bg.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:os("")};throw u}let s=Mn.extname(r).toLowerCase(),o=Cg[s]||"unknown",i=$v[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:os(n)};let a=Mv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
453
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:ro(n,c)}}async function Hl(r,e=process.cwd(),t={}){let n=Mn.isAbsolute(r)?r:Mn.join(e,r),s=[];async function o(i){let a=await bg.readdir(i,{withFileTypes:!0});for(let c of a){let u=Mn.join(i,c.name),d=Mn.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 m=Mn.extname(c.name).toLowerCase();if(Cg[m]){let p=await On(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function Mv(r,e){let t=[],n=r.split(`
|
|
454
|
+
`),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
455
|
+
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:Ov(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Ov(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Cg,kg,jv,Dv,Rv,Sg,$v,qi=y(()=>{"use strict";N();oo();Cg={".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"},kg=[{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}],jv=[{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}],Dv=[{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}],Rv=[{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}],Sg=[{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}],$v={typescript:kg,javascript:kg,python:jv,go:Dv,rust:Rv,java:Sg,csharp:Sg,php:[],ruby:[],unknown:[]};l(On,"extractSignatures");l(Hl,"extractDirectorySignatures");l(Mv,"extractFromContent");l(Ov,"cleanSignature")});import{createHash as Fv}from"node:crypto";import Pg from"node:fs/promises";import Tg from"node:path";function vg(r){return Fv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function xg(r){try{let e=Tg.join(r,"storage","classification-cache.json"),t=await Pg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?pc:(console.warn("[classifier] Failed to load cache:",w(e)),pc)}}async function Ul(r,e){try{let t=Tg.join(r,"storage","classification-cache.json");await Pg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function Nv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>_v?null:n.classification}function Lv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Hv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Eg(e),s=fc("classification")||"",o=`Classify this software engineering task into a domain.
|
|
413
456
|
|
|
414
|
-
Task: "${
|
|
457
|
+
Task: "${r}"
|
|
415
458
|
|
|
416
459
|
Available domains in this project: ${n.join(", ")}
|
|
417
460
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
418
461
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
419
462
|
|
|
420
|
-
${
|
|
421
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:
|
|
422
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:
|
|
423
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),
|
|
424
|
-
`);let t=[];
|
|
425
|
-
Context: ${
|
|
426
|
-
`)}var
|
|
427
|
-
`,"utf-8"),
|
|
428
|
-
${[["project",
|
|
463
|
+
${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=xn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function Gv(r,e){let t=Eg(e),n=new Map;for(let[p,g]of Object.entries(Uv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Zd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=zv(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function Eg(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function zv(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var _v,Uv,Gl,Wv,Ig,Ag=y(()=>{"use strict";Rr();Wo();N();_v=3600*1e3;l(vg,"hashDescription");l(xg,"loadCache");l(Ul,"saveCache");l(Nv,"lookupCache");l(Lv,"lookupPatterns");l(Hv,"classifyWithLLM");Uv={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(Gv,"classifyWithHeuristic");l(Eg,"buildAvailableDomains");l(zv,"getFilePatterns");Gl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=vg(e),i=await xg(n),a=Nv(i,o,t);if(a)return{classification:a,source:"cache"};let c=Lv(i,o);if(c)return{classification:c,source:"history"};let u=await Hv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Ul(n,i),{classification:u,source:"llm"};let d=Gv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Ul(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=vg(e),o=await xg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ul(n,o))}},Wv=new Gl,Ig=Wv});import{exec as Bv}from"node:child_process";import io from"node:fs/promises";import Vv from"node:os";import is from"node:path";import{promisify as Jv}from"node:util";var jg,Dg,zl,qv,Ki,Wl=y(()=>{"use strict";Fl();qe();ke();Ds();Vt();Bi();_l();qi();N();ss();Ag();jn();jg=Jv(Bv),Dg=["database","backend","frontend","testing","devops"],zl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=E.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((G,ee)=>{if(G.status==="fulfilled")return G.value;g.push(p[ee]),console.warn(`Context tool "${p[ee]}" failed: ${w(G.reason)}`)}),[k,b,D]=f,x={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},M=this.shouldFragment(a,t),F=null;return M&&e==="task"&&(F=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:M,subtasks:F,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:b??null,velocityContext:D??null,contextDegradation:x}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),rs(e,t,{maxFiles:10,minScore:.15}),so(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await On(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
464
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([jg("git branch --show-current",{cwd:e}),jg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
465
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await vt.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 ht.getAll(e);if(t.length===0)return null;let n=zi(t,Pn);return n.sprints.length===0?null:yg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=is.join(e,"analysis","repo-analysis.json"),n=await io.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Ig.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=is.join(e,"agents");return(await io.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=is.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=is.join(s,u);try{let m=await io.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=pi(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=is.join(Vv.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=is.join(t,`${i}.md`),c=is.join(t,i,"SKILL.md");try{let u=await io.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await io.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=Dg.indexOf(a),d=Dg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},qv=new zl,Ki=qv});function Kv(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 Bl,Yv,Le,Rg=y(()=>{"use strict";Ht();ae();mn();mn();l(Kv,"generateApprovalPrompt");Bl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return vc.includes(e)}isDestructive(e){return xc.includes(e)}isToolAllowedInPlanning(e){return Xo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Xo.includes(n)):t}startPlanning(e,t,n){let s={id:he(),projectId:e,command:t,params:n,status:oe.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[oe.GATHERING,oe.ANALYZING,oe.PROPOSING,oe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===oe.APPROVED?n.approvedAt=C():t===oe.EXECUTING?n.executionStartedAt=C():(t===oe.COMPLETED||t===oe.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=oe.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=oe.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==oe.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=oe.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=oe.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==oe.APPROVED?null:(t.status=oe.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==oe.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==oe.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=oe.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Kv(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[oe.GATHERING]:"\u{1F50D}",[oe.ANALYZING]:"\u{1F9E0}",[oe.PROPOSING]:"\u{1F4DD}",[oe.PENDING_APPROVAL]:"\u23F3",[oe.APPROVED]:"\u2705",[oe.EXECUTING]:"\u26A1",[oe.COMPLETED]:"\u{1F389}",[oe.REJECTED]:"\u274C",[oe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===oe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
466
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},Yv=new Bl,Le=Yv});function Xv(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Yi[t]?Yi[t]:Yi[e]?Yi[e]:e}function Xi(r){let e=new Set,t=[];for(let n of r){let s=Xv(n);e.has(s)||(e.add(s),t.push(n))}return t}var Yi,Vl=y(()=>{"use strict";Yi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(Xv,"normalizeFrameworkName");l(Xi,"deduplicateTechStack")});import{z as He}from"zod";function $g(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
467
|
+
`);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=Xi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>Qv[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
|
|
468
|
+
Context: ${r.fileCount} files in project.`),e.join(`
|
|
469
|
+
`)}var EN,Qv,Mg=y(()=>{"use strict";Vl();EN=He.object({projectPath:He.string(),language:He.string().optional(),framework:He.string().optional(),techStack:He.array(He.string()).default([]),domains:He.object({hasFrontend:He.boolean().default(!1),hasBackend:He.boolean().default(!1),hasDatabase:He.boolean().default(!1),hasTesting:He.boolean().default(!1),hasDocker:He.boolean().default(!1)}).optional(),fileCount:He.number().optional(),availableAgents:He.array(He.string()).default([]),analysisLanguages:He.array(He.string()).default([]),analysisFrameworks:He.array(He.string()).default([]),analysisPackageManager:He.string().optional()}),Qv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l($g,"buildAntiHallucinationBlock")});import{z as qt}from"zod";var Zv,Og,Fg=y(()=>{"use strict";Zv=qt.object({agents:qt.boolean(),patterns:qt.boolean(),checklist:qt.boolean(),modules:qt.array(qt.string())}),Og=qt.object({version:qt.string(),description:qt.string().optional(),commands:qt.record(qt.string(),Zv).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Jl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function _g(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Jl(o,ex),a=Jl(o,tx),c=Jl(o,nx);return s.some(d=>sx.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var ex,tx,nx,sx,Ng=y(()=>{"use strict";ex=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],tx=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],nx=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],sx=["Write","Edit","Bash"];l(Jl,"countMatches");l(_g,"classifyCommand")});import ql from"node:fs/promises";import rx from"node:path";async function Hg(){if(ao)return ao;let r=await ql.readFile(Kl,"utf-8"),e=JSON.parse(r);return ao=Og.parse(e),ao}function ox(r){return Ug.get(r)}function ix(r,e){Ug.set(r,e)}function cx(r,e){let t=r,n=Lg.get(t);return n&&ux(n.entry,e)?(n.count++,n.count>=ax):(Lg.set(t,{entry:e,count:1}),!1)}async function lx(r,e){let t=await ql.readFile(Kl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await ql.writeFile(Kl,`${JSON.stringify(n,null,2)}
|
|
470
|
+
`,"utf-8"),ao=null}function ux(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function Gg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=ox(e);if(n)return{entry:n,source:"cache"};if(t){let s=_g(e,t);return ix(e,s),cx(e,s)&&lx(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Kl,ao,Ug,Lg,ax,zg=y(()=>{"use strict";Fg();lt();Ng();Kl=rx.join(pe,"core/config/command-context.config.json"),ao=null;l(Hg,"loadCommandContextConfig");Ug=new Map;l(ox,"getCachedClassification");l(ix,"cacheClassification");Lg=new Map,ax=3;l(cx,"trackClassification");l(lx,"persistClassification");l(ux,"isSameEntry");l(Gg,"resolveCommandContextFull")});import dx from"node:os";import{z as on}from"zod";function px(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function mx(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Wg(r){let e=r.platform??dx.platform(),t=r.runtime??px(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
471
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",mx(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
429
472
|
`)}
|
|
430
|
-
</env>`}var
|
|
431
|
-
... (truncated to ~${e} tokens)`}function
|
|
432
|
-
`);return
|
|
433
|
-
`),
|
|
434
|
-
`),
|
|
473
|
+
</env>`}var zN,Bg=y(()=>{"use strict";zN=on.object({projectName:on.string(),projectPath:on.string(),isGitRepo:on.boolean().default(!0),gitBranch:on.string().optional(),platform:on.string().optional(),runtime:on.string().optional(),date:on.string().optional(),model:on.string().optional(),provider:on.string().optional()});l(px,"detectRuntime");l(mx,"normalizePlatform");l(Wg,"buildEnvironmentBlock")});function Jg(r){let e=r.getAllocationFor("injection");return{...Zi,totalPrompt:e}}function as(r,e){let t=e*qg;return r.length<=t?r:`${r.substring(0,t)}
|
|
474
|
+
... (truncated to ~${e} tokens)`}function Vg(r){return Math.ceil(r.length/qg)}function Kg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=gx[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var Zi,qg,gx,Qi,Yg=y(()=>{"use strict";Zi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Jg,"budgetsFromCoordinator");qg=4;l(as,"truncateToTokenBudget");l(Vg,"estimateTokens");gx={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(Kg,"filterSkillsByDomains");Qi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Zi,...e}}addSection(e,t){let n=as(e,t),s=Vg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=as(n,o);return this.used+=Vg(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Xg from"node:fs/promises";import cs from"node:path";var Yl,fx,Qg,Zg=y(()=>{"use strict";Vt();N();Te();lt();El();Mg();zg();Bg();Yg();Vl();jn();Yl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Xg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Jg(this._coordinator):Zi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let n=cs.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=An("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ye(s);if(o){let i=cs.basename(s,".md");t[i]=o}}}else{let s=cs.join(pe,"templates","checklists");if(await P(s)){let o=(await Xg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=cs.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([L.read(e),Ee.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await vl.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
|
|
475
|
+
`);return as(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=cs.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Hg();p=Gg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
476
|
+
`),s.role&&d.push(`Role: ${s.role}
|
|
477
|
+
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
435
478
|
`),d.push(`
|
|
436
479
|
Apply specialized expertise. Read agent file for details if needed.
|
|
437
480
|
|
|
438
481
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
439
482
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
440
483
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
441
|
-
`);let k=t.projectPath;if(k){let S=u?.project?.id?
|
|
484
|
+
`);let k=t.projectPath;if(k){let S=u?.project?.id?cs.basename(k):cs.basename(k),j=Wg({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
442
485
|
${j}
|
|
443
486
|
`)}if(u){let S=u.sealedAnalysis;if(d.push(`
|
|
444
487
|
## PROJECT ANALYSIS (Sealed)
|
|
@@ -462,7 +505,7 @@ ${j}
|
|
|
462
505
|
`)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let S=this.extractPatternSummary(D);S&&(d.push(`## CODE PATTERNS
|
|
463
506
|
`),d.push(S),d.push(`
|
|
464
507
|
Full patterns: Read analysis/patterns.md
|
|
465
|
-
`))}let
|
|
508
|
+
`))}let x=n?.analysis||"";if(b&&x&&x.trim()){let S=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
|
|
466
509
|
## STACK
|
|
467
510
|
Stack: ${j}
|
|
468
511
|
`),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
@@ -473,18 +516,18 @@ Stack: ${j}
|
|
|
473
516
|
`),j.effort&&d.push(`Effort: ${j.effort}
|
|
474
517
|
`),j.model&&d.push(`Model: ${j.model}
|
|
475
518
|
`),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
|
|
476
|
-
`);let te=
|
|
519
|
+
`);let te=as(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
477
520
|
${te}
|
|
478
521
|
\`\`\`
|
|
479
522
|
|
|
480
|
-
`)}}let S=
|
|
523
|
+
`)}}let S=Kg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
481
524
|
|
|
482
525
|
`);for(let j of S){d.push(`#### Skill: ${j.name}
|
|
483
|
-
`);let te=
|
|
526
|
+
`);let te=as(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
484
527
|
${te}
|
|
485
528
|
\`\`\`
|
|
486
529
|
|
|
487
|
-
`)}}}let
|
|
530
|
+
`)}}}let M=this.getModulesForCommand(m,p);if(M.length>0)for(let S of M){let j=await this.loadModule(S);j&&(d.push(`
|
|
488
531
|
`),d.push(j))}if(c?.isPlanning&&(d.push(`
|
|
489
532
|
## PLAN MODE
|
|
490
533
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
@@ -492,8 +535,8 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
|
|
|
492
535
|
`)),c?.requiresApproval&&d.push(`
|
|
493
536
|
## APPROVAL REQUIRED
|
|
494
537
|
Show changes, list affected files, ask for confirmation.
|
|
495
|
-
`),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],te={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:
|
|
496
|
-
${
|
|
538
|
+
`),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],te={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:Xi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Ze=>Ze.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
|
|
539
|
+
${$g(te)}
|
|
497
540
|
`)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
|
|
498
541
|
### CONTEXT DEGRADATION NOTICE
|
|
499
542
|
|
|
@@ -527,9 +570,9 @@ ${j.content}
|
|
|
527
570
|
## PROJECT: ${k}
|
|
528
571
|
Read files before modifying.
|
|
529
572
|
|
|
530
|
-
`);let
|
|
573
|
+
`);let G=this.filterRelevantState(n);if(G&&(d.push(`
|
|
531
574
|
## PRJCT STATE (Project Management Data)
|
|
532
|
-
`),d.push(
|
|
575
|
+
`),d.push(G),d.push(`
|
|
533
576
|
`)),u?.velocityContext&&(d.push(`
|
|
534
577
|
### VELOCITY (Historical Estimation Data)
|
|
535
578
|
|
|
@@ -575,7 +618,7 @@ Read files before modifying.
|
|
|
575
618
|
**Context for this subtask:**
|
|
576
619
|
${j.outputForNextAgent}
|
|
577
620
|
`)}d.push(`
|
|
578
|
-
`)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(
|
|
621
|
+
`)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Wo(),cp)),j=S(ee);j&&d.push(`
|
|
579
622
|
${j}
|
|
580
623
|
`)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
|
|
581
624
|
## QUALITY CHECKLISTS
|
|
@@ -583,7 +626,7 @@ ${j}
|
|
|
583
626
|
`),d.push(`Available: ${Object.keys(j).join(", ")}
|
|
584
627
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
585
628
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
586
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new
|
|
629
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Qi({totalPrompt:t.stateData}),s=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=s.includes(i)?500:250,u=n.addSection(`### ${i}
|
|
587
630
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
588
631
|
|
|
589
632
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -597,10 +640,10 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
597
640
|
|
|
598
641
|
`),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
|
|
599
642
|
`).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
|
|
600
|
-
`);a&&t.push(a)}let
|
|
643
|
+
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
601
644
|
Avoid:
|
|
602
645
|
${a}`)}let o=t.join(`
|
|
603
|
-
`);return
|
|
646
|
+
`);return as(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
604
647
|
## RULES (CRITICAL)
|
|
605
648
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
606
649
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -617,7 +660,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
617
660
|
- Prefer structured output (JSON) over free text when applicable.
|
|
618
661
|
|
|
619
662
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
620
|
-
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},
|
|
663
|
+
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},fx=new Yl,Qg=fx});import ef from"node:fs/promises";import $t from"node:path";var hx,yx,Xl,Ql,ea,Zl=y(()=>{"use strict";qe();ke();N();hx=["task","done","ship","resume","bug","enrich"],yx=["init","sync","pause","next","dash","history","undo","redo"],Xl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return $t.dirname(vr.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=E.getGlobalProjectPath(s),a=await(Je(),It(mt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=$t.join(u,"templates")}catch{c=$t.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await E.getAgentSettingsPath(),paths:{orchestrator:$t.join(c,"agentic","orchestrator.md"),agentRouting:$t.join(c,"agentic","agent-routing.md"),taskFragmentation:$t.join(c,"agentic","task-fragmentation.md"),commandTemplate:$t.join(c,"commands",`${e}.md`),repoAnalysis:$t.join(o,"analysis","repo-analysis.json"),agentsDir:$t.join(o,"agents"),skillsDir:a.skillsDir,stateJson:$t.join(o,"storage","state.json")}}}requiresOrchestration(e){return hx.includes(e)?!0:!yx.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=$t.join(E.getGlobalProjectPath(t),"agents");return(await ef.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=$t.join(E.getGlobalProjectPath(t),"agents");return(await ef.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
621
664
|
## Agentic Execution Mode
|
|
622
665
|
|
|
623
666
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -700,13 +743,13 @@ When fragmenting tasks:
|
|
|
700
743
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
701
744
|
3. Each completed subtask generates a summary
|
|
702
745
|
4. Pass summary to next agent for context handoff
|
|
703
|
-
`,context:e,requiresOrchestration:t}}},
|
|
704
|
-
`+
|
|
705
|
-
`+
|
|
706
|
-
`+
|
|
707
|
-
`+
|
|
708
|
-
`+
|
|
709
|
-
`}},
|
|
746
|
+
`,context:e,requiresOrchestration:t}}},Ql=new Xl,ea=Ql});import{exec as wx}from"node:child_process";import tf from"node:fs/promises";import{promisify as kx}from"node:util";var Sx,ls,Qe,eu=y(()=>{"use strict";yi();Sx=kx(wx),ls={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};ls.register("Read",async r=>{try{return await Vr.execute(async()=>await tf.readFile(r,"utf-8"),`read-${r}`)}catch(e){return hi(e)||Br(e),null}});ls.register("Write",async(r,e)=>{try{return await Vr.execute(async()=>await tf.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return hi(t)||Br(t),!1}});ls.register("Bash",async r=>{try{return await Vr.execute(async()=>await Sx(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});ls.register("GetTimestamp",async()=>new Date().toISOString());ls.register("GetDate",async()=>new Date().toISOString().split("T")[0]);ls.register("GetDateTime",async()=>new Date().toISOString());Qe=ls});import tu from"node:fs/promises";import bx from"node:os";import nf from"node:path";async function Cx(r){try{let e=nf.dirname(ta);await P(e)||await tu.mkdir(e,{recursive:!0}),await tu.writeFile(ta,`/p:${r}`)}catch{}}async function vx(){try{await P(ta)&&await tu.unlink(ta)}catch{}}var ta,nu,xx,na,su=y(()=>{"use strict";N();Km();Te();Qm();eg();jl();mg();gg();Hs();Wl();Rg();Zg();Zl();jn();eu();ta=nf.join(bx.homedir(),".prjct-cli",".running");l(Cx,"signalStart");l(vx,"signalEnd");nu=class{static{l(this,"CommandExecutor")}async signalStart(e){await Cx(e)}async signalEnd(){await vx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Js.shouldEscalate(e,s)){let o=Js.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Jc.load(e),i=await yt.build(n,t),a=Le.requiresPlanning(e),c=Le.isDestructive(e),u=Le.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Le.startPlanning(i.projectId,e,t):u&&(d=Le.getActivePlan(i.projectId));let m=null;if(Gi.requiresVerification(e)){let S=await yt.loadStateForCommand(i,e);m=await Gi.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Gi.formatWarnings(m))}let p=null;if(Ui.requiresReasoning(e)){let S=await yt.loadStateForCommand(i,e);p=await Ui.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ui.formatPlan(p)))}let g=t.task||t.description||"",f=await ea.buildContext(e,g,n),k=ea.buildAgenticPrompt(f),b=null;if(ea.requiresOrchestration(e)&&g)try{b=await Ki.execute(e,g,n),b.detectedDomains.length>0&&Hi.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");Hi.startAgent(S.name,j,`Loading ${j} specialist...`),Hi.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let S=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Xm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(S)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},x=await yt.loadState(i),M=null,F=null;i.projectId&&(M={commit_footer:await Ie.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ie.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ie.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ie.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Ie.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let G={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Le.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ee=await Qg.build(o,D,x,null,M,null,F,G,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Js.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:ee,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:M,relevantMemories:F,orchestratorContext:b,memory:{create:l(S=>Ie.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,te)=>Ie.autoRemember(i.projectId,S,j,te),"autoRemember"),search:l(S=>Ie.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Ie.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Ie.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Le.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Le.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Le.proposePlan(i.projectId,S),"propose"),approve:l(S=>Le.approvePlan(i.projectId,S),"approve"),reject:l(S=>Le.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Le.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Le.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Le.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Le.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Le.failStep(i.projectId,S),"failStep"),abort:l(S=>Le.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Le.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Le.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Js.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Js.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Qe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Qe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Jc.load(e)).frontmatter["allowed-tools"]||[],i=await yt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},xx=new nu,na=xx});import sa from"node:fs/promises";import Px from"node:https";import Tx from"node:os";import ru from"node:path";import Kt from"chalk";var ou,sf,rf=y(()=>{"use strict";N();Te();ou=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=ru.join(Tx.homedir(),".prjct-cli","config"),this.cacheFile=ru.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=ru.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=Px.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await sa.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await sa.mkdir(this.cacheDir,{recursive:!0}),await sa.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
747
|
+
`+Kt.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")+`
|
|
748
|
+
`+Kt.yellow("\u2502")+" "+Kt.bold("Update available!")+" "+Kt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Kt.yellow("\u2502")+`
|
|
749
|
+
`+Kt.yellow("\u2502")+" "+Kt.yellow("\u2502")+`
|
|
750
|
+
`+Kt.yellow("\u2502")+" Run: "+Kt.cyan("npm update -g prjct-cli")+" "+Kt.yellow("\u2502")+`
|
|
751
|
+
`+Kt.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")+`
|
|
752
|
+
`}},sf=ou});var ve,at=y(()=>{"use strict";su();jl();eu();qe();ke();rf();_n();ae();Te();zt();ve=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new sf,this.updateNotificationShown=!1,this.commandExecutor=na}get agent(){return Gs.getAgent()}get agentInfo(){return Gs.getInfo()}get currentAuthor(){return Fn.getCurrentAuthor()}async initializeAgent(){return Gs.initialize()}async ensureProjectInit(e){return Fn.ensureInit(e)}async ensureAuthor(){return Fn.ensureAuthor()}async getGlobalProjectPath(e){return Fn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return ft.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Fn.isEmptyDirectory(e)}async _detectExistingCode(e){return Fn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ci.breakdownFeature(e)}_detectBugSeverity(e){return Ci.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Gs.assignForTask(e,t,n)}}});var of={};we(of,{PlanningCommands:()=>ds});import us from"node:path";async function Ex(){if(!iu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(oa(),af));iu=new r}return iu}var iu,ds,ra=y(()=>{"use strict";Ho();Dn();Ht();Vt();N();Ws();Bs();El();at();iu=null;l(Ex,"getAnalysisCommands");ds=class extends ve{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Vs(t).runNonInteractive());else if(a=await new Vs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await As(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await E.ensureProjectStructure(m);let p=E.getGlobalProjectPath(m),g={"core/now.md":`# NOW
|
|
710
753
|
|
|
711
754
|
No current task. Use \`/p:now\` to set focus.
|
|
712
755
|
`,"core/next.md":`# NEXT
|
|
@@ -726,7 +769,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
726
769
|
`,"planning/roadmap.md":`# ROADMAP
|
|
727
770
|
|
|
728
771
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
729
|
-
`,"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[D,
|
|
772
|
+
`,"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[D,x]of Object.entries(g))await Qe.get("Write")(us.join(p,D),x);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await Ex();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!k){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=us.join(p,"planning","architect-session.md"),x=`# Architect Session
|
|
730
773
|
|
|
731
774
|
## Idea
|
|
732
775
|
${b}
|
|
@@ -735,8 +778,8 @@ ${b}
|
|
|
735
778
|
Initialized - awaiting stack recommendation
|
|
736
779
|
|
|
737
780
|
Generated: ${new Date().toLocaleString()}
|
|
738
|
-
`;return await
|
|
739
|
-
`);let
|
|
781
|
+
`;return await Qe.get("Write")(D,x),await Ae.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ae.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await yt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=he(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Ee.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:z.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await yt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Ee.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:z.getTimestamp()}),n.md?console.log(Se(nt("Bug Reported",e),Rt({Severity:a,Priority:m,Agent:u}),Xe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),Pt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
782
|
+
`);let s=await this.getGlobalProjectPath(t),o=us.join(s,"planning","architect-session.md"),i;try{i=await ue.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
740
783
|
|
|
741
784
|
Create a plan first:
|
|
742
785
|
1. Run /p:init in an empty directory
|
|
@@ -757,7 +800,7 @@ The architect plan is ready. Claude will now:
|
|
|
757
800
|
4. Create starter files with boilerplate
|
|
758
801
|
`),console.log(`
|
|
759
802
|
\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.
|
|
760
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
803
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:z.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=E.getGlobalProjectPath(o),u=us.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
761
804
|
|
|
762
805
|
## Idea
|
|
763
806
|
${e}
|
|
@@ -772,14 +815,14 @@ Initialized - awaiting architecture design
|
|
|
772
815
|
4. Generate roadmap
|
|
773
816
|
|
|
774
817
|
Generated: ${new Date().toLocaleString()}
|
|
775
|
-
`;return await
|
|
818
|
+
`;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(Se(nt("Idea Captured",e),Rt({Mode:"architecture"}),Xe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
776
819
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
777
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await
|
|
820
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await et.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:z.getTimestamp()}),n.md?console.log(Se(nt("Idea Captured",e),Rt({Mode:"capture"}),Xe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),Pt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=E.getGlobalProjectPath(s),m=us.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
778
821
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
779
822
|
`),{success:!0,specs:[]}):(console.log(`
|
|
780
823
|
\u{1F4CB} SPECIFICATIONS
|
|
781
824
|
`),console.log("\u2550".repeat(50)),f.forEach((k,b)=>{let D=k.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
|
|
782
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=
|
|
825
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=E.getGlobalProjectPath(s),i=us.join(o,"planning","specs");await ue.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=us.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
783
826
|
|
|
784
827
|
## Overview
|
|
785
828
|
[Brief description of the feature]
|
|
@@ -809,63 +852,63 @@ Generated: ${new Date().toLocaleString()}
|
|
|
809
852
|
---
|
|
810
853
|
Created: ${new Date().toLocaleString()}
|
|
811
854
|
Status: Draft
|
|
812
|
-
`;return await
|
|
813
|
-
\u{1F4DD} Edit: ~/.prjct-cli/projects/${
|
|
814
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var
|
|
815
|
-
`).filter(Boolean):[],
|
|
816
|
-
`)}async getSessionInfo(e){return
|
|
817
|
-
`);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let
|
|
818
|
-
`)}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}},
|
|
819
|
-
`)){let i=o.trim();i==="---COMMIT---"?(
|
|
820
|
-
`)}function
|
|
821
|
-
`)}function
|
|
855
|
+
`;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:z.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
856
|
+
\u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
857
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var ia,Fn,cf=y(()=>{"use strict";dn();Ho();qe();ke();N();Te();zt();ia=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ra(),of)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw $o.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await E.ensureProjectStructure(t),E.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await As();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Ps(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Ps(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Fn=new ia});import{exec as Ix}from"node:child_process";import{promisify as Ax}from"node:util";var au,jx,aa,co,lf=y(()=>{"use strict";fe();N();ci();au=Ax(Ix),jx={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},aa=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...jx,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=R.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await au("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([au(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),au(`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(`
|
|
858
|
+
`).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
859
|
+
`)}async getSessionInfo(e){return In.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
860
|
+
`);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
861
|
+
`)}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}},co=l((r,e)=>new aa(r,e),"createStalenessChecker")});import uf from"node:fs/promises";import ca from"node:path";function lo(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 Mx(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...lo(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lo(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lo(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...lo(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lo(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Rx.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function df(r,e){let t=[],n=await uf.readdir(r,{withFileTypes:!0});for(let s of n){if($x.has(s.name))continue;let o=ca.join(r,s.name);if(s.isDirectory())t.push(...await df(o,e));else if(s.isFile()){let i=ca.extname(s.name).toLowerCase();Dx.has(i)&&t.push(ca.relative(e,o))}}return t}async function Ox(r){let e=await df(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await uf.readFile(ca.join(r,d),"utf-8"),p=Mx(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function _x(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};q.setDoc(r,Fx,t)}async function pf(r,e){let t=await Ox(r);return _x(e,t),t}var Dx,Rx,$x,Fx,mf=y(()=>{"use strict";fe();Dx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Rx=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"]),$x=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(lo,"splitIdentifier");l(Mx,"tokenizeFile");l(df,"listFiles");l(Ox,"buildIndex");Fx="bm25-index";l(_x,"saveIndex");l(pf,"indexProject")});import cu from"node:fs/promises";import fn from"node:path";function Gx(r){let e=[],t,n=new RegExp(Ux.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function zx(r,e,t){let n;if(r.startsWith("@/"))n=fn.join(t,"src",r.slice(2));else{let s=fn.dirname(fn.join(t,e));n=fn.resolve(s,r)}for(let s of Hx){let o=n+s;try{if((await cu.stat(o)).isFile())return fn.relative(t,o)}catch{}}return null}async function gf(r,e){let t=[],n=await cu.readdir(r,{withFileTypes:!0});for(let s of n){if(Lx.has(s.name))continue;let o=fn.join(r,s.name);if(s.isDirectory())t.push(...await gf(o,e));else if(s.isFile()){let i=fn.extname(s.name).toLowerCase();Nx.has(i)&&t.push(fn.relative(e,o))}}return t}async function Wx(r){let e=await gf(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await cu.readFile(fn.join(r,u),"utf-8"),m=Gx(d),p=[];for(let g of m){let f=await zx(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Bx(r,e){q.setDoc(r,ff,e)}function hf(r){return q.getDoc(r,ff)}async function yf(r,e){let t=await Wx(r);return Bx(e,t),t}var Nx,Lx,Hx,Ux,ff,lu=y(()=>{"use strict";fe();Nx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Lx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Hx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Ux=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Gx,"extractImportSources");l(zx,"resolveImport");l(gf,"listFiles");l(Wx,"buildGraph");ff="import-graph";l(Bx,"saveGraph");l(hf,"loadGraph");l(yf,"indexImports")});function wf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=hf(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function kf(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var Sf=y(()=>{"use strict";lu();l(wf,"propagateChanges");l(kf,"affectedDomains")});import uu from"node:fs/promises";import la from"node:path";async function bf(r,e){let t=[],n=await uu.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Jx.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=la.join(r,o);if(s.isDirectory())t.push(...await bf(i,e));else if(s.isFile()){let a=la.extname(o).toLowerCase();Vx.has(a)&&t.push(la.relative(e,i))}}return t}function qx(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 Kx(r){let e=await bf(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=la.join(r,a),[u,d]=await Promise.all([uu.readFile(c,"utf-8"),uu.stat(c)]);return{path:a,hash:qx(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Yx(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function du(r,e){let t=q.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),q.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Xx(r){let e=new Map;try{let t=q.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function pu(r,e){let[t,n]=await Promise.all([Kx(r),Promise.resolve(Xx(e))]);return{diff:Yx(t,n),currentHashes:t}}function Cf(r){return q.hasDoc(r,"file-hashes-meta")}var Vx,Jx,vf=y(()=>{"use strict";fe();Vx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Jx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(bf,"listProjectFiles");l(qx,"hashContent");l(Kx,"computeHashes");l(Yx,"diffHashes");l(du,"saveHashes");l(Xx,"loadHashes");l(pu,"detectChanges");l(Cf,"hasHashRegistry")});import{exec as Qx}from"node:child_process";import{promisify as Zx}from"node:util";async function nP(r,e=100){try{let{stdout:t}=await eP(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
862
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Pf&&n.push(s),s=new Set):i&&s&&sP(i)&&s.add(i)}return s&&s.size>0&&s.size<=Pf&&n.push(s),n}catch{return[]}}function sP(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 rP(r,e=100){let t=await nP(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=oP(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<xf||m<xf)continue;let p=d+m-a,g=p>0?a/p:0;g<tP||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function oP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function aP(r,e){q.setDoc(r,iP,e)}async function Tf(r,e,t=100){let n=await rP(r,t);return aP(e,n),n}var eP,tP,xf,Pf,iP,Ef=y(()=>{"use strict";fe();eP=Zx(Qx),tP=.1,xf=2,Pf=30;l(nP,"parseGitLog");l(sP,"isSourceFile");l(rP,"buildMatrix");l(oP,"pairKey");iP="cochange-index";l(aP,"saveMatrix");l(Tf,"indexCoChanges")});function Mt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ps(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var mu=y(()=>{"use strict";l(Mt,"cite");l(ps,"defaultSources")});function uo(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
|
|
863
|
+
`)}function po(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
|
|
864
|
+
`)}function If(r){let e=[];return r.packageManager&&e.push(`- Package Manager: \`${r.packageManager}\``),r.sourceDir&&e.push(`- Source: \`${r.sourceDir}/\``),r.testDir&&e.push(`- Tests: \`${r.testDir}/\``),e.length>0?`
|
|
822
865
|
### Project Structure
|
|
823
866
|
|
|
824
867
|
${e.join(`
|
|
825
868
|
`)}
|
|
826
|
-
`:""}function
|
|
869
|
+
`:""}function cP(r){let e=[];return r.patterns?.length>0&&e.push(`
|
|
827
870
|
### Code Patterns (Follow These)
|
|
828
871
|
|
|
829
|
-
${
|
|
872
|
+
${uo(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
|
|
830
873
|
### Anti-Patterns (Avoid These)
|
|
831
874
|
|
|
832
|
-
${
|
|
833
|
-
`)}function
|
|
834
|
-
<!-- projectId: ${
|
|
875
|
+
${po(r.antiPatterns)}`),e.push(If(r)),e.join(`
|
|
876
|
+
`)}function lP(r,e){let t=r.sources||ps();return`# ${r.name} - Project Rules
|
|
877
|
+
<!-- projectId: ${r.projectId} -->
|
|
835
878
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
836
|
-
<!-- Ecosystem: ${
|
|
879
|
+
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
837
880
|
|
|
838
|
-
## THIS PROJECT (${
|
|
881
|
+
## THIS PROJECT (${r.ecosystem})
|
|
839
882
|
|
|
840
|
-
${
|
|
841
|
-
**Type:** ${
|
|
842
|
-
**Path:** ${
|
|
883
|
+
${Mt(t.ecosystem)}
|
|
884
|
+
**Type:** ${r.projectType}
|
|
885
|
+
**Path:** ${r.repoPath}
|
|
843
886
|
|
|
844
887
|
### Commands (USE THESE, NOT OTHERS)
|
|
845
888
|
|
|
846
|
-
${
|
|
889
|
+
${Mt(t.commands)}
|
|
847
890
|
| Action | Command |
|
|
848
891
|
|--------|---------|
|
|
849
|
-
| Install dependencies | \`${
|
|
850
|
-
| Run dev server | \`${
|
|
851
|
-
| Run tests | \`${
|
|
852
|
-
| Build | \`${
|
|
853
|
-
| Lint | \`${
|
|
854
|
-
| Format | \`${
|
|
892
|
+
| Install dependencies | \`${r.commands.install}\` |
|
|
893
|
+
| Run dev server | \`${r.commands.dev}\` |
|
|
894
|
+
| Run tests | \`${r.commands.test}\` |
|
|
895
|
+
| Build | \`${r.commands.build}\` |
|
|
896
|
+
| Lint | \`${r.commands.lint}\` |
|
|
897
|
+
| Format | \`${r.commands.format}\` |
|
|
855
898
|
|
|
856
899
|
### Code Conventions
|
|
857
900
|
|
|
858
|
-
${
|
|
859
|
-
- **Languages**: ${
|
|
860
|
-
${
|
|
861
|
-
- **Frameworks**: ${
|
|
862
|
-
${
|
|
901
|
+
${Mt(t.languages)}
|
|
902
|
+
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
903
|
+
${Mt(t.frameworks)}
|
|
904
|
+
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
905
|
+
${r.analysis?cP(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
|
|
863
906
|
---
|
|
864
907
|
|
|
865
908
|
## PRJCT RULES
|
|
866
909
|
|
|
867
910
|
### Path Resolution
|
|
868
|
-
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${
|
|
911
|
+
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\`
|
|
869
912
|
- NEVER write to \`.prjct/\`
|
|
870
913
|
- NEVER write to \`./\` for prjct data
|
|
871
914
|
|
|
@@ -885,49 +928,49 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
885
928
|
|
|
886
929
|
## PROJECT STATE
|
|
887
930
|
|
|
888
|
-
${
|
|
931
|
+
${Mt(t.name)}
|
|
889
932
|
| Field | Value |
|
|
890
933
|
|-------|-------|
|
|
891
|
-
| Name | ${
|
|
892
|
-
| Version | ${
|
|
893
|
-
| Ecosystem | ${
|
|
894
|
-
| Branch | ${
|
|
895
|
-
| Files | ~${
|
|
896
|
-
| Commits | ${
|
|
934
|
+
| Name | ${r.name} |
|
|
935
|
+
| Version | ${r.version} |
|
|
936
|
+
| Ecosystem | ${r.ecosystem} |
|
|
937
|
+
| Branch | ${r.branch} |
|
|
938
|
+
| Files | ~${r.fileCount} |
|
|
939
|
+
| Commits | ${r.commits} |
|
|
897
940
|
|
|
898
941
|
---
|
|
899
942
|
|
|
900
943
|
## AGENTS
|
|
901
944
|
|
|
902
|
-
Load from \`~/.prjct-cli/projects/${
|
|
903
|
-
|
|
904
|
-
**Workflow**: ${
|
|
905
|
-
**Domain**: ${
|
|
906
|
-
`}function
|
|
907
|
-
`)}function
|
|
908
|
-
`)}function
|
|
909
|
-
`)}function
|
|
910
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${
|
|
911
|
-
`)}function
|
|
912
|
-
`)}},
|
|
913
|
-
${
|
|
914
|
-
`)}`;return
|
|
945
|
+
Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
946
|
+
|
|
947
|
+
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
948
|
+
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
949
|
+
`}function uP(r,e){let t=r.sources||ps(),n=[];if(n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(Mt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(Mt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(po(r.analysis.antiPatterns)),n.push(""));let s=If(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
950
|
+
`)}function dP(r,e){let t=r.sources||ps(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(Mt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(po(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(Mt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
951
|
+
`)}function pP(r,e){let t=r.sources||ps(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(Mt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Mt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(uo(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(po(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
952
|
+
`)}function mP(r,e){let t=[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
|
|
953
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function gP(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(uo(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(po(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
|
|
954
|
+
`)}function Af(r){return{claude:lP,cursor:uP,copilot:dP,windsurf:pP,continue:mP,codex:gP}[r]||null}var gu=y(()=>{"use strict";mu();l(uo,"formatPatterns");l(po,"formatAntiPatterns");l(If,"formatStructure");l(cP,"formatAnalysisForClaude");l(lP,"formatForClaude");l(uP,"formatForCursor");l(dP,"formatForCopilot");l(pP,"formatForWindsurf");l(mP,"formatForContinue");l(gP,"formatForCodex");l(Af,"getFormatter")});import{exec as fP}from"node:child_process";import hP from"node:os";import qs from"node:path";import{promisify as yP}from"node:util";function jf(r){return da[r]||null}async function ua(r){try{return await wP(`which ${r}`),!0}catch{return!1}}async function pa(r=process.cwd()){let e=[];return await ua("claude")&&e.push("claude"),(await ua("cursor")||await P(qs.join(r,".cursor")))&&e.push("cursor"),await P(qs.join(r,".github"))&&e.push("copilot"),(await ua("windsurf")||await P(qs.join(r,".windsurf")))&&e.push("windsurf"),(await P(qs.join(r,".continue"))||await P(qs.join(hP.homedir(),".continue")))&&e.push("continue"),(await ua("codex")||await P(qs.join(r,".agents")))&&e.push("codex"),e}async function Df(r,e=process.cwd()){if(r==="auto"){let t=await pa(e);return t.length>0?t:["claude"]}return r==="all"?kP:r.filter(t=>da[t])}var wP,da,mo,kP,fu=y(()=>{"use strict";Te();wP=yP(fP),da={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},mo=["claude"],kP=Object.keys(da);l(jf,"getAIToolConfig");l(ua,"commandExists");l(pa,"detectInstalledTools");l(Df,"resolveToolIds")});import hu from"node:fs/promises";import yu from"node:path";async function Rf(r,e,t,n=mo){let s=[];for(let o of n){let i=jf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await SP(r,i,e,t);s.push(a)}return s}async function SP(r,e,t,n){let s=Af(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=yu.join(n,e.outputFile):i=yu.join(t,"context",e.outputFile),await hu.mkdir(yu.dirname(i),{recursive:!0});try{let a=await hu.readFile(i,"utf-8"),c=Qc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Xc(o,a)}catch{}return await hu.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var $f=y(()=>{"use strict";N();Zc();gu();fu();l(Rf,"generateAIToolContexts");l(SP,"generateForTool")});var Mf=y(()=>{"use strict";gu();$f();fu()});import go from"node:fs/promises";import fo from"node:path";var wu,Of,ku,Ff,_f=y(()=>{"use strict";N();wu=".prjct/.prjct-state.md",Of=".prjct-state.md",ku=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=fo.join(e,wu);await go.mkdir(fo.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await go.writeFile(n,s,"utf-8");try{let o=fo.join(e,Of);await go.unlink(o)}catch(o){if(!v(o))throw o}}async remove(e){for(let t of[wu,Of])try{await go.unlink(fo.join(e,t))}catch(n){if(!v(n))throw n}}async exists(e){let t=fo.join(e,wu);try{return await go.access(t),!0}catch{return!1}}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 n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${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 n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
955
|
+
`)}},Ff=new ku});import Su from"node:fs/promises";import bP from"node:os";import Nf from"node:path";function bu(){return Nf.join(bP.homedir(),".prjct-cli","skills",CP)}function vP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ho(){try{let r=await Su.readFile(bu(),"utf-8");return JSON.parse(r)}catch{return vP()}}async function Cu(r){let e=bu();await Su.mkdir(Nf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Su.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function xP(r){let e=await ho();e.skills[r.name]=r,await Cu(e)}async function PP(r){let e=await ho();return r in e.skills?(delete e.skills[r],await Cu(e),!0):!1}async function TP(r){return(await ho()).skills[r]||null}async function EP(){return(await ho()).skills}function IP(){return bu()}var CP,yo,Lf=y(()=>{"use strict";CP=".skill-lock.json";l(bu,"getLockFilePath");l(vP,"createEmptyLockFile");l(ho,"read");l(Cu,"write");l(xP,"addEntry");l(PP,"removeEntry");l(TP,"getEntry");l(EP,"getAll");l(IP,"getPath");yo={read:ho,write:Cu,addEntry:xP,removeEntry:PP,getEntry:TP,getAll:EP,getPath:IP}});import{exec as AP}from"node:child_process";import hn from"node:fs/promises";import xu from"node:os";import ct from"node:path";import{promisify as jP}from"node:util";import{glob as Hf}from"glob";function Gf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ct.join(xu.homedir(),r.slice(1)):ct.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function zf(r){let e=[];try{let s=ct.join(r,"SKILL.md");await hn.access(s);let o=ct.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Hf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Hf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function DP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
956
|
+
${s.join(`
|
|
957
|
+
`)}`;return r.replace(o,`---
|
|
915
958
|
${c}
|
|
916
959
|
---`)}return`---
|
|
917
|
-
${
|
|
960
|
+
${s.join(`
|
|
918
961
|
`)}
|
|
919
962
|
---
|
|
920
963
|
|
|
921
|
-
${
|
|
964
|
+
${r}`}function Pu(){return ct.join(xu.homedir(),".claude","skills")}async function vu(r,e,t,n){let s=Pu(),o=ct.join(s,e),i=ct.join(o,"SKILL.md"),a=await hn.readFile(r,"utf-8"),c=DP(a,t,n);return await hn.mkdir(o,{recursive:!0}),await hn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function RP(r){let e={installed:[],skipped:[],errors:[]};if(!zs.isAvailable("git")){let n=zs.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=ct.join(xu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Uf(`git clone --depth 1 ${n} ${t}`,{timeout:Ms("GIT_CLONE")});let s;try{let{stdout:a}=await Uf("git rev-parse HEAD",{cwd:t,timeout:Ms("TOOL_CHECK")});s=a.trim()}catch{}let o=await zf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${r.owner}/${r.repo}`),e;let i=r.skillName?o.filter(a=>a.name===r.skillName):o;if(r.skillName&&i.length===0)return e.errors.push(`Skill "${r.skillName}" not found in ${r.owner}/${r.repo}`),e;for(let a of i)try{let c=await vu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await yo.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await hn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function $P(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await hn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await hn.stat(t)).isFile()){let s=ct.basename(ct.dirname(t));try{let o=await vu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await yo.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await zf(t);if(s.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of s)try{let i=await vu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await yo.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function MP(r){let e=Pu(),t=ct.join(e,r);try{await hn.rm(t,{recursive:!0,force:!0})}catch{}let n=ct.join(e,`${r}.md`);try{await hn.rm(n,{force:!0})}catch{}return yo.removeEntry(r)}async function OP(r){let e=Gf(r);switch(e.type){case"github":return RP(e);case"local":return $P(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Uf,Wf,Bf=y(()=>{"use strict";N();mn();Ai();Lf();Uf=jP(AP);l(Gf,"parseSource");l(zf,"discoverSkills");l(DP,"injectSourceMetadata");l(Pu,"getInstallDir");l(vu,"installSkillFile");l(RP,"installFromGitHub");l($P,"installFromLocal");l(MP,"remove");l(OP,"install");Wf={install:OP,remove:MP,parseSource:Gf,getInstallDir:Pu}});import Ot from"node:fs/promises";import FP from"node:os";import Tt from"node:path";async function Vf(r,e,t,n){let s=[],o=Tt.join(r,"agents");try{let c=await Ot.readdir(o);for(let u of c)u.endsWith(".md")&&await Ot.unlink(Tt.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:re(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>_P(c,o)));for(let c of i)s.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>NP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function Jf(r){let e=Tt.join(r,"agents"),t=[];try{let n=await Ot.readdir(e),s=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=s.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function qf(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ye(`subagents/${o}.md`);if(!i){let a=Tt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Ot.readFile(a,"utf-8")}catch{n=n.replace(s[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(s[0],i.trim())}return n}async function _P(r,e){let t="";try{let n=Tt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Ot.readFile(n,"utf-8"),t=await qf(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:re(n)}),t=HP(r)}await Ot.writeFile(Tt.join(e,`${r}.md`),t,"utf-8")}async function NP(r,e,t,n,s){let o="";try{let i=Tt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Ot.readFile(i,"utf-8"),o=await qf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:re(i)}),o=UP(r,t,n)}o=LP(o,r,s),await Ot.writeFile(Tt.join(e,`${r}.md`),o,"utf-8")}function LP(r,e,t){if(!t)return r;let{patternsDiscovered:n,knownGotchas:s,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||s.length>0||i.length>0))return r;let c=[`
|
|
922
965
|
## Recent Learnings (from completed tasks)
|
|
923
|
-
`];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(
|
|
924
|
-
`)}function
|
|
925
|
-
name: ${
|
|
926
|
-
description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[
|
|
966
|
+
`];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
|
|
967
|
+
`)}function HP(r){return`---
|
|
968
|
+
name: ${r}
|
|
969
|
+
description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[r]||"Workflow agent"}
|
|
927
970
|
tools: Read, Write, Glob
|
|
928
971
|
---
|
|
929
972
|
|
|
930
|
-
# ${
|
|
973
|
+
# ${r.toUpperCase()}
|
|
931
974
|
|
|
932
975
|
Workflow agent for prjct operations.
|
|
933
976
|
|
|
@@ -937,16 +980,16 @@ When invoked:
|
|
|
937
980
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
938
981
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
939
982
|
3. Execute requested operation
|
|
940
|
-
`}function
|
|
941
|
-
name: ${
|
|
942
|
-
description: ${
|
|
983
|
+
`}function UP(r,e,t){return`---
|
|
984
|
+
name: ${r}
|
|
985
|
+
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
943
986
|
tools: Read, Write, Glob, Grep
|
|
944
987
|
skills: []
|
|
945
988
|
---
|
|
946
989
|
|
|
947
|
-
# ${
|
|
990
|
+
# ${r.toUpperCase()} AGENT
|
|
948
991
|
|
|
949
|
-
Domain specialist for ${
|
|
992
|
+
Domain specialist for ${r} tasks.
|
|
950
993
|
|
|
951
994
|
## Project Context
|
|
952
995
|
|
|
@@ -956,86 +999,86 @@ Domain specialist for ${s} tasks.
|
|
|
956
999
|
|
|
957
1000
|
## Your Role
|
|
958
1001
|
|
|
959
|
-
You are the ${
|
|
960
|
-
`}function
|
|
961
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await
|
|
962
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ls('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function rn(s,e){try{return await Vf.access(Su.join(s,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:re(t)}),!1}}async function qf(s){let e={fileCount:0,version:"0.0.0",name:Su.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ls('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:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:s,error:re(t)}),e.fileCount=0}try{let t=Su.join(s,"package.json"),n=JSON.parse(await Vf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:s,error:re(t)})}return await rn(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(s,"requirements.txt")||await rn(s,"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 Kf(s){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 rn(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(s,"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 rn(s,"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 rn(s,"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 rn(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Yf(s,e){let t=cs(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Xf(s){return new aa(s).detect()}var ls,Qf=y(()=>{"use strict";ln();au();Gn();Bf();ls=Dx(jx);l(Jf,"analyzeGit");l(rn,"fileExists");l(qf,"gatherStats");l(Kf,"detectCommands");l(Yf,"buildSources");l(Xf,"detectStack")});import{exec as Rx}from"node:child_process";import bu from"node:fs/promises";import ca from"node:path";import{promisify as $x}from"node:util";var Mx,Cu,Pu,Zf,eh=y(()=>{"use strict";Bt();N();Mx=$x(Rx),Cu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=ca.join(s,r);try{await bu.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=ca.basename(s);try{await L.read(n)}catch(r){P(r)||t.push(`state: ${w(r)}`)}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(s){let e=Date.now(),t=ca.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await bu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bu.readFile(ca.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cu.contextFilesExist(t),Cu.jsonFilesValid(t),Cu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Mx(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Zf=new Pu});import la from"node:fs/promises";import ua from"node:path";var da,us,vu=y(()=>{"use strict";Ms();sf();df();gf();wf();su();ln();An();qe();Se();Ti();vn();ye();jr();Wr();Ii();Dr();Rr();Mr();xf();le();Gn();kl();Sl();If();ol();Gf();Qf();eh();da=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let o=(await ia(e)).filter(i=>!ao.includes(i));r=[...ao,...o]}else t.aiTools[0]==="auto"?(r=await ia(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Cf("all",e):r=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let _=await Ei(this.projectId);_>0&&U.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){U.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([Jf(this.projectPath),qf(this.projectPath),Kf(this.projectPath),Xf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&mf(this.projectId))try{let{diff:_,currentHashes:ms}=await iu(this.projectPath,this.projectId),ko=_.added.length+_.modified.length+_.deleted.length;if(ko===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let $a=lf(_,this.projectId);f=uf($a.allAffected);let Ry=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=$a.allAffected.some(Ln=>{let $y=Ln.substring(Ln.lastIndexOf("."));return Ry.has($y)}),g=$a.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:ko,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ou(this.projectId,ms)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await iu(this.projectPath,this.projectId);ou(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([nf(this.projectPath,this.projectId),cf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId)])}catch(_){U.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await _f(this.globalPath,u,a,k):await Nf(this.globalPath),D=Uf(b,this.projectId,this.globalPath),v=g?await Hf(b):[],$=Yf(a,c),F=[],H;try{let _=await bt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(H={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:$,analysis:H},S=await Pf(ee,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Ve;try{let _=await R.readConfig(this.projectPath);Ve=await Zf.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){U.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:v,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ve,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>la.mkdir(ua.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=M.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};M.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await L.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=C(),r.lastUpdated=C(),r.context={...r.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,r);try{await Ef.generate(this.projectPath,r)}catch(o){U.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){M.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=ua.join(this.globalPath,m),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ua.join(this.globalPath,"agents",`${m.name}.md`),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:re(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let r=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await bt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:r??void 0})}catch(r){U.debug("Failed to save draft analysis (non-critical)",{error:re(r)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,n=await wl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Nm.getFeatureOutcomes(this.projectId);r.length>0&&await wl.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ua.join(__dirname,"..","..","package.json");return JSON.parse(await la.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:re(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:[]}}},us=new da});var On=y(()=>{"use strict";cm();gm();fm();km();bm();nl();Pm();ol();vm();xm();Qg();Zg();vu()});import fn from"chalk";function th(s){return Math.ceil(s.length/Ox)}function nh(s){let e=s.split(`
|
|
963
|
-
`),t=[],n=null;for(let
|
|
964
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
965
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
966
|
-
`).length}),
|
|
967
|
-
`).length}),
|
|
968
|
-
`).length}),
|
|
969
|
-
`);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),
|
|
970
|
-
`)}function
|
|
971
|
-
`))n.push(
|
|
1002
|
+
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1003
|
+
`}function Kf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Ot.writeFile(Tt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:re(o)})}),n}async function Yf(r){let e=[];try{let t=Tt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Ot.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Tt.join(FP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Tt.join(a,d,"SKILL.md"),p=Tt.join(a,`${d}.md`),g=!1;try{await Ot.access(m),g=!0}catch{try{await Ot.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Wf.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:re(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:re(t)})}return e}var Xf=y(()=>{"use strict";jn();dn();ae();Vn();Bf();l(Vf,"generateAgents");l(Jf,"loadExistingAgents");l(qf,"resolveTemplateIncludes");l(_P,"generateWorkflowAgent");l(NP,"generateDomainAgent");l(LP,"injectFeedbackSection");l(HP,"generateMinimalWorkflowAgent");l(UP,"generateMinimalDomainAgent");l(Kf,"configureSkills");l(Yf,"autoInstallSkills")});import Qf from"node:fs/promises";import Zf from"node:path";var ma,eh=y(()=>{"use strict";ma=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Zf.join(this.projectPath,"package.json"),t=await Qf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Qf.access(Zf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as GP}from"node:child_process";import th from"node:fs/promises";import Tu from"node:path";import{promisify as zP}from"node:util";async function nh(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ms("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await ms("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await ms("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await ms("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
1004
|
+
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await ms('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
1005
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ms('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function an(r,e){try{return await th.access(Tu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:re(t)}),!1}}async function sh(r){let e={fileCount:0,version:"0.0.0",name:Tu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ms('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:re(t)}),e.fileCount=0}try{let t=Tu.join(r,"package.json"),n=JSON.parse(await th.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await an(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:re(t)})}return await an(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await an(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await an(r,"requirements.txt")||await an(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 rh(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 an(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await an(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 an(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 an(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 an(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function oh(r,e){let t=ps(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function ih(r){return new ma(r).detect()}var ms,ah=y(()=>{"use strict";dn();mu();Vn();eh();ms=zP(GP);l(nh,"analyzeGit");l(an,"fileExists");l(sh,"gatherStats");l(rh,"detectCommands");l(oh,"buildSources");l(ih,"detectStack")});import{exec as WP}from"node:child_process";import Eu from"node:fs/promises";import ga from"node:path";import{promisify as BP}from"node:util";var VP,Iu,Au,ch,lh=y(()=>{"use strict";Vt();N();VP=BP(WP),Iu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ga.join(r,s);try{await Eu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=ga.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ga.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await Eu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Eu.readFile(ga.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Au=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Iu.contextFilesExist(t),Iu.jsonFilesValid(t),Iu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await VP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},ch=new Au});import fa from"node:fs/promises";import ha from"node:path";var ya,gs,ju=y(()=>{"use strict";Hs();mf();Sf();vf();Ef();lu();dn();Dn();qe();ke();Di();Tn();fe();Mr();Kr();$i();Or();Fr();Nr();Mf();ae();Vn();Pl();Tl();_f();dl();Xf();ah();lh();ya=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await pa(e)).filter(i=>!mo.includes(i));s=[...mo,...o]}else t.aiTools[0]==="auto"?(s=await pa(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Df("all",e):s=t.aiTools;try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Yr(this.projectId);try{let _=await Ri(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([nh(this.projectPath),sh(this.projectPath),rh(this.projectPath),ih(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&Cf(this.projectId))try{let{diff:_,currentHashes:ks}=await pu(this.projectPath,this.projectId),xo=_.added.length+_.modified.length+_.deleted.length;if(xo===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let La=wf(_,this.projectId);f=kf(La.allAffected);let Gy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=La.allAffected.some(Gn=>{let zy=Gn.substring(Gn.lastIndexOf("."));return Gy.has(zy)}),g=La.directlyChanged.some(Gn=>Gn==="package.json"||Gn==="tsconfig.json"||Gn.includes("Dockerfile")||Gn.includes("docker-compose")),m={isIncremental:!0,filesChanged:xo,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}du(this.projectId,ks)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await pu(this.projectPath,this.projectId);du(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([pf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId),Tf(this.projectPath,this.projectId)])}catch(_){H.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await Vf(this.globalPath,u,a,k):await Jf(this.globalPath),D=Kf(b,this.projectId,this.globalPath),x=g?await Yf(b):[],M=oh(a,c),F=[],G;try{let _=await vt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(G={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:M,analysis:G},S=await Rf(ee,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ae.installGlobalConfig(),await Ae.syncCommands();let Ze;try{let _=await $.readConfig(this.projectPath);Ze=await ch.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ze,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>fa.mkdir(ha.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=R.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};R.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await Ff.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){R.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ha.join(this.globalPath,m),g=await fa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ha.join(this.globalPath,"agents",`${m.name}.md`),g=await fa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await gn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:re(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await vt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:re(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([gt.archiveOldShipped(this.projectId).catch(()=>0),et.markDormantIdeas(this.projectId).catch(()=>0),Ee.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),ft.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=bt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Qn,n=await xl.learnFromTaskHistory(this.projectId,e,t);try{let s=await Jm.getFeatureOutcomes(this.projectId);s.length>0&&await xl.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ha.join(__dirname,"..","..","package.json");return JSON.parse(await fa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:re(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},gs=new ya});var _n=y(()=>{"use strict";fm();vm();xm();Im();jm();cl();Rm();dl();$m();Mm();cf();lf();ju()});import yn from"chalk";function uh(r){return Math.ceil(r.length/JP)}function dh(r){let e=r.split(`
|
|
1006
|
+
`),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
|
|
1007
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Du(r){return r.includes("<!-- prjct:preserve")}function ph(r,e){let t=dh(r),n=dh(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:uh(r),tokensAfter:uh(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)Du(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
1008
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Du(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1009
|
+
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1010
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Du(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
1011
|
+
`).length}),s.hasChanges=!0)}return s}function mh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?yn.green:p=>p,o=t?yn.red:p=>p,i=t?yn.yellow:p=>p,a=t?yn.dim:p=>p,c=t?yn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1012
|
+
`);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.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(s(`+${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`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
|
|
1013
|
+
`)}function gh(r,e={}){let{colorize:t=!0}=e,n=[],s=t?yn.green:c=>c,o=t?yn.red:c=>c,i=t?yn.cyan:c=>c,a=t?yn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1014
|
+
`))n.push(s(`+ ${u}`));n.push("")}for(let c of r.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
972
1015
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
973
1016
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
974
1017
|
`).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
|
|
975
|
-
`).slice(0,5))n.push(
|
|
1018
|
+
`).slice(0,5))n.push(s(`+ ${u}`));c.after.split(`
|
|
976
1019
|
`).length>5&&n.push(a(` ... ${c.after.split(`
|
|
977
|
-
`).length-5} more lines`))}n.push("")}for(let c of
|
|
1020
|
+
`).length-5} more lines`))}n.push("")}for(let c of r.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
978
1021
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
979
1022
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
980
1023
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
981
|
-
`)}var
|
|
982
|
-
`));let u=[];
|
|
983
|
-
`)}function
|
|
1024
|
+
`)}var JP,fh=y(()=>{"use strict";JP=4;l(uh,"estimateTokens");l(dh,"parseMarkdownSections");l(Du,"isPreservedSection");l(ph,"generateSyncDiff");l(mh,"formatDiffPreview");l(gh,"formatFullDiff")});import qP from"node:path";async function Ru(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
|
|
1025
|
+
`));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Pt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function hh(r){try{let e=await ft.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=z.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function $u(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function yh(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function wh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${wo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${mi(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${$u(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${wo(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(`
|
|
1026
|
+
`)}function kh(r,e){let t=[];t.push(`# Repository Analysis
|
|
984
1027
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
985
|
-
`);let n=
|
|
1028
|
+
`);let n=qP.basename(e);if(t.push(`## Project: ${n}
|
|
986
1029
|
`),t.push(`## Stack Detected
|
|
987
|
-
`),
|
|
988
|
-
`),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)`:""}`)}
|
|
1030
|
+
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1031
|
+
`),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
|
|
989
1032
|
`),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
|
|
990
|
-
`)),
|
|
1033
|
+
`)),r.goMod&&(t.push(`### Go
|
|
991
1034
|
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
992
|
-
`)),
|
|
1035
|
+
`)),r.requirements&&(t.push(`### Python
|
|
993
1036
|
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
994
|
-
`));let r
|
|
995
|
-
`),t.push(`- **Total Files**: ${
|
|
996
|
-
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),
|
|
997
|
-
`),
|
|
1037
|
+
`));let s=r.directories;t.push(`## Structure
|
|
1038
|
+
`),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${s?.slice(0,15).join(", ")||"none"}${(s?.length||0)>15?` (+${(s?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
|
|
1039
|
+
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
|
|
1040
|
+
`),r.gitLog.split(`
|
|
998
1041
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
999
1042
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1000
1043
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1001
|
-
`)}var
|
|
1002
|
-
`),Ye.init(t);let n=await
|
|
1044
|
+
`)}var Sh=y(()=>{"use strict";Dn();gi();_n();Bs();zt();at();l(Ru,"showSyncResult");l(hh,"getSessionActivity");l(wo,"formatTokens");l($u,"formatDuration");l(yh,"generateSparkline");l(wh,"generateStatsMarkdown");l(kh,"generateAnalysisSummary")});var af={};we(af,{AnalysisCommands:()=>hs});import Mu from"node:fs/promises";import bh from"node:path";import*as fs from"@clack/prompts";var hs,oa=y(()=>{"use strict";Hs();rm();Dn();gi();_n();fh();Di();fe();Kr();N();Ws();Bs();zt();Sh();at();hs=class extends ve{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1045
|
+
`),Ye.init(t);let n=await yt.build(t,e),s={packageJson:await Ye.readPackageJson(),cargoToml:await Ye.readCargoToml(),goMod:await Ye.readGoMod(),requirements:await Ye.readRequirements(),directories:await Ye.listDirectories(),fileCount:await Ye.countFiles(),gitStats:await Ye.getGitStats(),gitLog:await Ye.getGitLog(20),hasDockerfile:await Ye.fileExists("Dockerfile"),hasDockerCompose:await Ye.fileExists("docker-compose.yml"),hasReadme:await Ye.fileExists("README.md"),hasTsconfig:await Ye.fileExists("tsconfig.json"),hasViteConfig:await Ye.fileExists("vite.config.ts")||await Ye.fileExists("vite.config.js"),hasNextConfig:await Ye.fileExists("next.config.js")||await Ye.fileExists("next.config.mjs")},o=kh(s,t),i=await $.getProjectId(t),a=n.paths.analysis||E.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:z.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Je(),It(mt)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${E.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1003
1046
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1004
|
-
`),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:
|
|
1005
|
-
${oh(g)}`),!(await mh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Tu(m,i))}t.md||h.spin("Syncing project...");let d=await us.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Ai("sync"),k=Ie(tn("Sync Complete",jt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Rm("Uncommitted changes detected"):null,et(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Tu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await dn.getSummary(r),i=await dn.getDailyStats(r,30),a=await ah(r),c=await Te.getPatternsSummary(r);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=M.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await dn.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${mo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ci(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Eu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=ch(i);if(console.log(` ${p} ${mo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=lh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await bt.getStatus(r);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=ph.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,jt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?rt("Analysis",At(p),3):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)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await bt.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await bt.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let r=w(n);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=M.getDoc(r,"project")?.repoPath||e}catch{}let i=await bt.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});var pa,z,zs=y(()=>{"use strict";qe();Se();N();le();pa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,c)=>n.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};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()}},z=new pa});import _x from"node:path";var Ws,Au=y(()=>{"use strict";On();Bt();N();Ns();ot();zs();Ws=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=_x.basename(t),a=await L.getCurrentTask(o),c=await xe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=M.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(v=>({...JSON.parse(v.data),timestamp:v.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1047
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=E.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await E.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await gs.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(Se(Jt(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=bh.join(o,"context","CLAUDE.md"),c=null;try{c=await Mu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await gs.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Se("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await Mu.readFile(a,"utf-8")}catch{p=""}let g=ph(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(Se(Jt("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await Mu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Se("## \u26A1 Sync Preview",b.length>0?nt("Changes",xt(b)):"No section changes.",Rt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.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:b,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(mh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await fs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(fs.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
|
|
1048
|
+
${gh(g)}`);let b=await fs.confirm({message:"Apply these changes?",initialValue:!0});if(fs.isCancel(b)||!b)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),Ru(m,i)}t.md||h.spin("Syncing project...");let d=await gs.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Se("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Mi("sync"),k=Se(Jt("Sync Complete"),Rt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Um("Uncommitted changes detected"):null,Xe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Ru(d,i)}catch(n){return t.md?console.log(Se("## \u274C Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await gn.getSummary(s),i=await gn.getDailyStats(s,30),a=await hh(s),c=await Ie.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=R.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await gn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${mi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${$u(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=yh(i);if(console.log(` ${p} ${wo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=wh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=co(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await vt.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=bh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Se(`## \u26A1 Status: ${u}`,Rt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?nt("Analysis",xt(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await vt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await vt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=R.getDoc(s,"project")?.repoPath||e}catch{}let i=await vt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var wa,U,Ks=y(()=>{"use strict";qe();ke();N();ae();wa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:E.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},U=new wa});import KP from"node:path";var Ys,Ou=y(()=>{"use strict";_n();Vt();N();Ws();at();Ks();Ys=class extends ve{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=KP.basename(t),a=await L.getCurrentTask(o),c=await Ee.getActiveTasks(o),u=await gt.getRecent(o,5),d=await et.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=z.getDaysAgo(m),g=[];try{let b=p.toISOString();g=R.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1006
1049
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1007
1050
|
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
|
|
1008
1051
|
Activity: ${k}
|
|
1009
|
-
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await
|
|
1052
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await yt.build(t),p=await Qe.get("Read")(m.paths.roadmap);if(console.log(`
|
|
1010
1053
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1011
1054
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1012
1055
|
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
|
|
1013
1056
|
`)[0].trim();console.log(` ${k+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1014
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
1057
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${z.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let b=k.priority?` [${k.priority}]`:"";return`${k.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let b=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Se(`## \u26A1 Dashboard: ${i}`,nt("Current Focus",m),nt(`Queue (${c.length})`,xt(p,!0)),nt("Recent Ships",xt(g)),nt("Ideas",`${d.length} pending`),Xe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1015
1058
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1016
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1059
|
+
`),console.log("\u2550".repeat(50));let m=co(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1017
1060
|
${g}`),console.log(`
|
|
1018
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=
|
|
1061
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=z.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1019
1062
|
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1020
1063
|
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
|
|
1021
1064
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1022
1065
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1023
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1066
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:z.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1024
1067
|
PRJCT COMMANDS
|
|
1025
|
-
`),console.log("=".repeat(50));let i=
|
|
1068
|
+
`),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
|
|
1026
1069
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1027
1070
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1028
|
-
`),{success:!0,topic:"overview"}}let n=
|
|
1071
|
+
`),{success:!0,topic:"overview"}}let n=U.getByName(e);if(n){if(console.log(`
|
|
1029
1072
|
\u{1F4DA} HELP: /p:${n.name}
|
|
1030
1073
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
|
|
1031
1074
|
Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
|
|
1032
1075
|
Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
|
|
1033
1076
|
${"\u2550".repeat(50)}
|
|
1034
|
-
`),{success:!0,topic:e,command:n}}let
|
|
1077
|
+
`),{success:!0,topic:e,command:n}}let s={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(s))if(o.includes(i))return console.log(`
|
|
1035
1078
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1036
1079
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1037
1080
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1038
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],
|
|
1081
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import YP from"node:fs/promises";import XP from"node:path";var ys,Sz,Fu=y(()=>{"use strict";Wl();qe();ke();Vt();N();ys=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=E.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Ki.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=XP.join(e,"analysis","repo-analysis.json"),n=await YP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},Sz=new ys});async function ka(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;q.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 Sa(r){let e=await $.getProjectId(r);if(!e)return;let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;q.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function _u(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ka(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=q.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;q.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await et.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Ee.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await Sa(e),await ft.log(e,"cleanup_performed",{items:s.length,timestamp:z.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Nu=y(()=>{"use strict";_n();Vt();fe();N();at();l(ka,"cleanupMemory");l(Sa,"cleanupMemoryInternal");l(_u,"cleanup")});import Ch from"node:path";async function Lu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=Ch.join(E.getGlobalProjectPath(i),"planning","designs");await ue.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1039
1082
|
|
|
1040
1083
|
*Use templates/design/architecture.md for full design*
|
|
1041
1084
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1050,40 +1093,40 @@ ${"\u2550".repeat(50)}
|
|
|
1050
1093
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1051
1094
|
|
|
1052
1095
|
*Use templates/design/flow.md for full design*
|
|
1053
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1096
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Ch.join(a,u);return await ue.writeFile(d,c),await ft.log(t,"design_created",{type:n,target:o,timestamp:z.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var Hu=y(()=>{"use strict";_n();N();at();l(Lu,"design")});import Xs from"node:path";async function Uu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=E.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ue.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1054
1097
|
Found abandoned session:
|
|
1055
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let
|
|
1098
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let s=z.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1056
1099
|
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
|
|
1057
|
-
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function
|
|
1058
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:
|
|
1100
|
+
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Gu(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots");await ue.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Xs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ue.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ue.writeFile(a,JSON.stringify(c,null,2)),await ft.log(r,"undo_performed",{snapshotId:i,timestamp:z.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function zu(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots"),n=Xs.join(t,"history.json"),s;try{let i=await ue.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1101
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ue.writeFile(n,JSON.stringify(s,null,2)),await ft.log(r,"redo_performed",{timestamp:z.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Wu(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Xs.join(E.getGlobalProjectPath(e),"snapshots"),n=Xs.join(t,"history.json"),s;try{let o=await ue.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
|
|
1059
1102
|
SNAPSHOT HISTORY
|
|
1060
1103
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1061
1104
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
1062
1105
|
SNAPSHOT HISTORY
|
|
1063
|
-
`),console.log("=".repeat(50)),
|
|
1064
|
-
`)):(
|
|
1106
|
+
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1107
|
+
`)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1065
1108
|
`)),console.log(`${"=".repeat(50)}
|
|
1066
|
-
`),{success:!0,snapshots:
|
|
1067
|
-
${
|
|
1109
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Bu=y(()=>{"use strict";_n();N();at();l(Uu,"recover");l(Gu,"undo");l(zu,"redo");l(Wu,"history")});var Qs,Vu=y(()=>{"use strict";at();Nu();Hu();Bu();Nu();Hu();Bu();Qs=class extends ve{static{l(this,"MaintenanceCommands")}_cleanupMemory=ka;_cleanupMemoryInternal=Sa;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?_u(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Lu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Uu(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Gu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?zu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Wu(e):t}}});import De from"chalk";function ba(r,e,t){return t==="below"?r<=e?De.green("\u2713"):De.yellow("\u26A0"):r>=e?De.green("\u2713"):De.yellow("\u26A0")}var Nn,Zs,Ju=y(()=>{"use strict";li();N();at();Nn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ba,"statusIcon");Zs=class extends ve{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Yn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1110
|
+
${De.dim("No performance data yet.")}`),console.log(`${De.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1068
1111
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1069
|
-
${
|
|
1070
|
-
${
|
|
1071
|
-
`),!(await
|
|
1112
|
+
${De.cyan("Performance Report")} ${De.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ba(i.startup.avg,Nn.startup.max,"below");console.log(` Startup: avg ${De.bold(`${i.startup.avg}ms`)} ${De.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${De.dim(`target: <${Nn.startup.max}ms`)}`)}if(i.memory){let c=ba(i.memory.peakHeapMB,Nn.heapMB.max,"below");console.log(` Memory: avg ${De.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${De.dim(`target: <${Nn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ba(i.contextCorrectness.rate,Nn.contextRate.min,"above");console.log(` Context: ${De.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${De.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${De.dim(`target: ${Nn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ba(i.subtaskHandoff.rate,Nn.handoffRate.min,"above");console.log(` Handoff: ${De.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${De.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${De.dim(`target: ${Nn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1113
|
+
${De.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${De.bold(`${u.avg}ms`)} ${De.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import qu from"node:fs/promises";import QP from"node:path";import le from"chalk";var er,Ku=y(()=>{"use strict";Dn();ke();N();Te();lt();at();er=class extends ve{static{l(this,"SetupCommands")}async start(){let t=await(Je(),It(mt)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1114
|
+
`),!(await Ae.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1072
1115
|
|
|
1073
1116
|
Please install it first:
|
|
1074
|
-
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let
|
|
1075
|
-
\u2705 Installed ${
|
|
1076
|
-
${
|
|
1077
|
-
\u26A0\uFE0F ${
|
|
1117
|
+
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ae.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1118
|
+
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1119
|
+
${E.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1120
|
+
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1078
1121
|
\u{1F389} Setup complete!`),console.log(`
|
|
1079
1122
|
Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1080
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1123
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ae.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ae.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1081
1124
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1082
1125
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1083
|
-
\u{1F4DD} Installing global configuration...`);let n=await
|
|
1126
|
+
\u{1F4DD} Installing global configuration...`);let n=await Ae.installGlobalConfig(),s=n.path?E.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Je(),It(mt)).getActiveProvider()).name==="claude"){console.log(`
|
|
1084
1127
|
\u26A1 Installing status line...`);let a=await this.installStatusLine();a.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${a.error}`)}return console.log(`
|
|
1085
1128
|
\u{1F389} Setup complete!
|
|
1086
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=
|
|
1129
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=E.getClaudeDir(),t=E.getClaudeSettingsPath(),n=QP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1087
1130
|
# prjct Status Line for Claude Code
|
|
1088
1131
|
# Shows version update notifications and current task
|
|
1089
1132
|
|
|
@@ -1139,18 +1182,18 @@ fi
|
|
|
1139
1182
|
|
|
1140
1183
|
# Default: show prjct branding
|
|
1141
1184
|
echo "\u26A1 prjct"
|
|
1142
|
-
`;await
|
|
1143
|
-
${
|
|
1144
|
-
`)[0])),{success:!1,failed:o,output:c}}}async function
|
|
1185
|
+
`;await qu.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await qu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await qu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(le.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(le.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(le.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(le.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(le.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(le.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(le.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(` ${le.bold.cyan("prjct")}${le.magenta("/")}${le.green("cli")} ${le.dim.white(`v${Pe} installed`)}`),console.log(""),console.log(` ${le.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${le.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${le.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(le.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(le.bold.cyan("\u{1F680} Quick Start")),console.log(le.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(` ${le.bold("1.")} Initialize your project:`),console.log(` ${le.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${le.bold("2.")} Start your first task:`),console.log(` ${le.green('prjct task "build auth"')}`),console.log(""),console.log(` ${le.bold("3.")} Ship & celebrate:`),console.log(` ${le.green('prjct ship "user login"')}`),console.log(""),console.log(le.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(` ${le.dim("Documentation:")} ${le.cyan("https://prjct.app")}`),console.log(` ${le.dim("Report issues:")} ${le.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(le.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import wt from"node:path";async function ZP(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(wt.join(r,"pnpm-lock.yaml"))?"pnpm":await P(wt.join(r,"yarn.lock"))?"yarn":await P(wt.join(r,"bun.lockb"))||await P(wt.join(r,"bun.lock"))?"bun":(await P(wt.join(r,"package-lock.json")),"npm")}function vh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function eT(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Yu(r){let e=wt.join(r,"package.json"),t=await zn(e,null);if(t){let o=await ZP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:vh(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:vh(o,"typecheck")}),i.test&&(a.test={tool:o,command:eT(o)}),a}if(await P(wt.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await xs(wt.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(wt.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(wt.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Ps(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(wt.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(wt.join(r,"gradlew"))&&(await P(wt.join(r,"build.gradle"))||await P(wt.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var xh=y(()=>{"use strict";Te();l(ZP,"detectPackageManager");l(vh,"pmRun");l(eT,"pmTest");l(Yu,"detectProjectCommands")});import{exec as tT}from"node:child_process";import{promisify as nT}from"node:util";import Yt from"chalk";function ko(r,e){return`workflow:${r}_${e}`}async function Ph(r,e){let t=ko(e.hook,e.command);switch(e.scope){case"permanent":await Ie.recordDecision(r,t,e.action,"workflow");break;case"session":Ca.set(t,e);break;case"once":tr.set(t,e);break}}async function rT(r,e){let t={};for(let n of["before","after","skip"]){let s=ko(n,e),o=tr.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Ca.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ie.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function wn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await rT(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=ko(e,t);tr.has(i)&&tr.delete(i),console.log(`
|
|
1186
|
+
${Yt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await sT(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${Yt.green("\u2713")} ${Yt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Yt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(Yt.dim(c.split(`
|
|
1187
|
+
`)[0])),{success:!1,failed:o,output:c}}}async function Xu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=ko(o,s),a=tr.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Ca.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Ie.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function Th(r,e,t){let n=ko(e,t);return tr.delete(n),Ca.delete(n),await Ie.recordDecision(r,n,"","workflow:remove"),!0}function Eh(r){if(r.length===0)return`${Yt.dim($r.NO_PREFERENCES)}
|
|
1145
1188
|
|
|
1146
|
-
Set one: "${
|
|
1147
|
-
`)}var
|
|
1189
|
+
Set one: "${$r.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\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 t of r){let n=t.scope==="permanent"?Yt.green("permanent"):t.scope==="session"?Yt.yellow("session"):Yt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Yt.dim(`Modify: "${$r.MODIFY_EXAMPLE}"`)),e.push(Yt.dim(`Remove: "${$r.REMOVE_EXAMPLE}"`)),e.join(`
|
|
1190
|
+
`)}var sT,Ca,tr,Qu=y(()=>{"use strict";Hs();N();mn();sT=nT(tT),Ca=new Map,tr=new Map;l(ko,"prefKey");l(Ph,"setWorkflowPreference");l(rT,"getWorkflowPreferences");l(wn,"runWorkflowHooks");l(Xu,"listWorkflowPreferences");l(Th,"removeWorkflowPreference");l(Eh,"formatWorkflowPreferences")});import Ih from"node:path";var nr,Zu=y(()=>{"use strict";Hs();Vt();N();Ws();Bs();xh();Qu();at();nr=class extends ve{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Qe.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
|
|
1148
1191
|
${o.stderr}`.trim(),a=i.split(`
|
|
1149
1192
|
`),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
|
|
1150
1193
|
`).filter(m=>!m.startsWith("__EXIT:")).join(`
|
|
1151
|
-
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let
|
|
1194
|
+
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await wn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await gt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:z.getTimestamp()}),await Ie.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Ie.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Ie.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await wn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Mi("ship"),k=Se(Jt(`Shipped: ${i}`,`Version: ${d}`),nt("Results",xt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`])),Xe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),Pt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Yu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Yu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Ih.join(e,"package.json"),n=await ue.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ue.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Ih.join(n,"CHANGELOG.md"),o=await ue.readFile(s,`# Changelog
|
|
1152
1195
|
|
|
1153
|
-
`),i=`## [${t}] - ${
|
|
1196
|
+
`),i=`## [${t}] - ${z.formatDate(new Date)}
|
|
1154
1197
|
|
|
1155
1198
|
### Added
|
|
1156
1199
|
- ${e}
|
|
@@ -1159,46 +1202,48 @@ ${o.stderr}`.trim(),a=i.split(`
|
|
|
1159
1202
|
|
|
1160
1203
|
`,`# Changelog
|
|
1161
1204
|
|
|
1162
|
-
${i}`);await
|
|
1163
|
-
|
|
1164
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1165
|
-
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${
|
|
1166
|
-
${
|
|
1167
|
-
`),{success:!0,message:"No data"};let a=
|
|
1168
|
-
${
|
|
1169
|
-
${
|
|
1170
|
-
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Pn,...n.velocity}}catch{}return Pn}}});var Kx,Yx,Ch,ya,bh,Ph,vh=y(()=>{"use strict";Zn();Kx=[1,2,3,5,8,13,21],Yx={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}},Ch=l(s=>Kx.includes(s),"isValidPoint"),ya=l(s=>Yx[s],"pointsToMinutes"),bh=l(s=>{if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Ph=l(s=>{let e=ya(s);return`${bh(e.min)}\u2013${bh(e.max)}`},"pointsToTimeRange")});function Yu(){nt.clear(),Kt.clear(),er.clear(),tr.clear()}function Xu(){return{issues:nt.stats(),assignedIssues:Kt.stats(),teams:er.stats(),projects:tr.stats()}}var wa,nt,Kt,er,tr,Qu=y(()=>{"use strict";Xo();wa=300*1e3,nt=new Ut({ttl:wa,maxSize:100}),Kt=new Ut({ttl:wa,maxSize:10}),er=new Ut({ttl:wa,maxSize:5}),tr=new Ut({ttl:wa,maxSize:5});l(Yu,"clearLinearCache");l(Xu,"getLinearCacheStats")});import{exec as Xx}from"node:child_process";import{promisify as Qx}from"node:util";async function ka(s){if(process.platform!=="darwin")return xh(s);try{let{stdout:e}=await Zx(`security find-generic-password -s "${eT}" -a "${s}" -w 2>/dev/null`);return e.trim()||null}catch{return xh(s)}}function xh(s){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[s];return process.env[t]||null}var Zx,eT,Zu=y(()=>{"use strict";N();Zx=Qx(Xx),eT="prjct-cli";l(ka,"getCredential");l(xh,"getEnvFallback")});var tT,nT,Th,Sa,yt,ed=y(()=>{"use strict";N();Zu();tT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},nT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Th={none:0,urgent:1,high:2,medium:3,low:4},Sa=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ka("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(r){throw this.sdk=null,new Error(`Linear connection failed: ${w(r)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let r=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,r,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===r);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let r=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Th[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!r)throw new Error("Failed to create issue");return this.mapIssue(r)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let r={};t.title!==void 0&&(r.title=t.title),t.description!==void 0&&(r.description=t.description),t.priority!==void 0&&(r.priority=Th[t.priority]),t.assigneeId!==void 0&&(r.assigneeId=t.assigneeId),t.stateId!==void 0&&(r.stateId=t.stateId),t.projectId!==void 0&&(r.projectId=t.projectId),t.labels!==void 0&&n.team&&(r.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,r);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,r=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:tT[t?.type||"backlog"]||"backlog",priority:nT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:r?{id:r.id,name:r.name,key:r.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),r=t.map(o=>o.toLowerCase());return r.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":r.includes("feature")||n.includes("add")||n.includes("implement")?"feature":r.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":r.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new Sa});var ba,Ot,td=y(()=>{"use strict";Qu();ed();ba=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let r=await yt.fetchAssignedIssues(e);Kt.set(t,r);for(let o of r)nt.set(`issue:${o.id}`,o),nt.set(`issue:${o.externalId}`,o);return r}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,r=Kt.get(n);if(r)return r;let o=await yt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)nt.set(`issue:${i.id}`,i),nt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=nt.get(t);if(n)return n;let r=await yt.fetchIssue(e);return r&&(nt.set(`issue:${r.id}`,r),nt.set(`issue:${r.externalId}`,r)),r}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return nt.set(`issue:${t.id}`,t),nt.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return nt.set(`issue:${n.id}`,n),nt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),nt.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),nt.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=er.get("teams");if(e)return e;let t=await yt.getTeams();return er.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=tr.get("projects");if(e)return e;let t=await yt.getProjects();return tr.set("projects",t),t}clearCache(){Yu()}getCacheStats(){return Xu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new ba});var Eh,Ca,sT,Ih=y(()=>{"use strict";cc();ye();N();td();Eh=1800*1e3,Ca=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let r=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of r)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Eh,issues:o};return M.setDoc(e,"issues",i),{provider:"linear",fetched:r.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(r){return n.push({issueId:"all",error:w(r)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let r=n.issues[t],o=new Date(r.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return r}try{let r=await Ot.fetchIssue(t);if(!r)return null;let o=new Date().toISOString(),i=this.toCachedIssue(r,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ot.markInProgress(t):n==="done"&&await Ot.markDone(t);let r=this.loadIssues(e);if(r?.issues[t]){let o=n==="done"?"done":"in_progress";r.issues[t].status=o,r.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,r)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),r=Date.now(),o=t.staleAfter||Eh;return r-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return M.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){M.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let r=this.loadIssues(e);r||(r=Xd("linear")),r.issues[t]=n,this.saveIssues(e,r)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},sT=new Ca});var Ah=y(()=>{"use strict";Qu();ed();td();Ih()});import rT from"node:fs/promises";import oT from"node:os";import iT from"node:path";function aT(s){return iT.join(oT.homedir(),".prjct-cli","projects",s,"config","credentials.json")}async function Pa(s){let e=aT(s);if(!await x(e))return{};try{return JSON.parse(await rT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function nd(s){let e=await Pa(s);return e.linear?.apiKey?e.linear.apiKey:ka("linear-api-key")}var jh=y(()=>{"use strict";N();ve();Zu();l(aT,"getCredentialsPath");l(Pa,"getProjectCredentials");l(nd,"getLinearApiKey")});import cT from"node:fs/promises";import lT from"node:path";function Dh(s){if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`}async function uT(){try{let{execSync:s}=await import("node:child_process");return s("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function dT(s){try{let e=lT.join(s,"analysis","repo-analysis.json"),t=await cT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}function pT(s,e){if(!s&&!e)return null;let t=e?.ecosystem||null,n=s?.languages?.join(", ")||null,r=s?.frameworks?.join(", ")||null,o=s?.packageManager||null,i=s?.sourceDir||e?.structure?.srcDir||null,a=s?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=jt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: ${k}`);m=`Commands
|
|
1171
|
-
${
|
|
1205
|
+
${i}`);await ue.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Qe.get("Bash")("git add .");let n=`feat: ${e}
|
|
1206
|
+
|
|
1207
|
+
Generated with [p/](https://www.prjct.app/)`;return await Qe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Qe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import oT from"node:fs/promises";import iT from"node:path";import sr from"chalk";var rr,ed=y(()=>{"use strict";qe();ke();$i();N();zt();at();rr=class extends ve{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(sr.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1208
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${sr.dim("would update")} ${m}`);continue}try{let p=await Yr(d),g=await Ri(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${sr.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${sr.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${sr.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${sr.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=iT.join(E.getGlobalBasePath(),"projects");try{return(await oT.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import Re from"chalk";var or,td=y(()=>{"use strict";Fl();Ds();kl();N();ss();at();or=class extends ve{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await ht.getAll(s);if(i.length===0)return console.log(`
|
|
1209
|
+
${Re.dim("No velocity data yet.")}`),console.log(`${Re.dim("Complete tasks with estimates to build velocity history.")}
|
|
1210
|
+
`),{success:!0,message:"No data"};let a=zi(i,o);await wl.saveMetrics(s,a),console.log(`
|
|
1211
|
+
${Re.cyan("Sprint Velocity")} ${Re.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?Re.green:m.estimationAccuracy>=60?Re.yellow:Re.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Re.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Re.green("\u2191"):a.velocityTrend==="declining"?Re.red("\u2193"):Re.dim("\u2192");if(console.log(` Average: ${Re.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Re.bold(`${a.estimationAccuracy}%`)} ${Re.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1212
|
+
${Re.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Re.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Re.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Re.green("\u2713")} ${m.category} tasks estimated within ${Re.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=hg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1213
|
+
${Re.dim("Projection:")}`),console.log(` Backlog: ${Re.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Re.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Pn,...n.velocity}}catch{}return Pn}}});var aT,cT,jh,va,Ah,Dh,Rh=y(()=>{"use strict";ss();aT=[1,2,3,5,8,13,21],cT={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}},jh=l(r=>aT.includes(r),"isValidPoint"),va=l(r=>cT[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"),Dh=l(r=>{let e=va(r);return`${Ah(e.min)}\u2013${Ah(e.max)}`},"pointsToTimeRange")});function nd(){rt.clear(),Xt.clear(),ir.clear(),ar.clear()}function sd(){return{issues:rt.stats(),assignedIssues:Xt.stats(),teams:ir.stats(),projects:ar.stats()}}var xa,rt,Xt,ir,ar,rd=y(()=>{"use strict";ni();xa=300*1e3,rt=new Ut({ttl:xa,maxSize:100}),Xt=new Ut({ttl:xa,maxSize:10}),ir=new Ut({ttl:xa,maxSize:5}),ar=new Ut({ttl:xa,maxSize:5});l(nd,"clearLinearCache");l(sd,"getLinearCacheStats")});import{exec as lT}from"node:child_process";import{promisify as uT}from"node:util";async function Pa(r){if(process.platform!=="darwin")return $h(r);try{let{stdout:e}=await dT(`security find-generic-password -s "${pT}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return $h(r)}}function $h(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var dT,pT,od=y(()=>{"use strict";N();dT=uT(lT),pT="prjct-cli";l(Pa,"getCredential");l($h,"getEnvFallback")});var mT,gT,Mh,Ta,kt,id=y(()=>{"use strict";N();od();mT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},gT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Mh={none:0,urgent:1,high:2,medium:3,low:4},Ta=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await Pa("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Mh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=Mh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:mT[t?.type||"backlog"]||"backlog",priority:gT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},kt=new Ta});var Ea,Ft,ad=y(()=>{"use strict";rd();id();Ea=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&kt.isConfigured()}async initialize(e){this.initialized||(await kt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Xt.get(t);if(n)return n;let s=await kt.fetchAssignedIssues(e);Xt.set(t,s);for(let o of s)rt.set(`issue:${o.id}`,o),rt.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Xt.get(n);if(s)return s;let o=await kt.fetchTeamIssues(e,t);Xt.set(n,o);for(let i of o)rt.set(`issue:${i.id}`,i),rt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=rt.get(t);if(n)return n;let s=await kt.fetchIssue(e);return s&&(rt.set(`issue:${s.id}`,s),rt.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await kt.createIssue(e);return rt.set(`issue:${t.id}`,t),rt.set(`issue:${t.externalId}`,t),Xt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await kt.updateIssue(e,t);return rt.set(`issue:${n.id}`,n),rt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await kt.markInProgress(e),rt.delete(`issue:${e}`),Xt.clear()}async markDone(e){this.ensureInitialized(),await kt.markDone(e),rt.delete(`issue:${e}`),Xt.clear()}async addComment(e,t){this.ensureInitialized(),await kt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ir.get("teams");if(e)return e;let t=await kt.getTeams();return ir.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=ar.get("projects");if(e)return e;let t=await kt.getProjects();return ar.set("projects",t),t}clearCache(){nd()}getCacheStats(){return sd()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ft=new Ea});var Oh,Ia,fT,Fh=y(()=>{"use strict";gc();fe();N();ad();Oh=1800*1e3,Ia=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ft.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Oh,issues:o};return R.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Ft.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ft.markInProgress(t):n==="done"&&await Ft.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Oh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return R.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){R.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=sp("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},fT=new Ia});var _h=y(()=>{"use strict";rd();id();ad();Fh()});import{exec as hT}from"node:child_process";import{promisify as yT}from"node:util";var Nh,cr,wT,cd,Ln,Lh=y(()=>{"use strict";ke();fe();ae();Nh=yT(hT),cr="session-snapshot",wT=30,cd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:C(),resumeHint:c};return R.setDoc(e,cr,u),u}getSnapshot(e){try{return R.getDoc(e,cr)}catch{return null}}clearSnapshot(e){try{R.deleteDoc(e,cr)}catch{}}async listAllSnapshots(){let e=await E.listProjects(),t=[];for(let n of e)try{if(!R.exists(n))continue;let s=R.getDoc(n,cr);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=wT){let t=await E.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!R.exists(o))continue;let i=R.getDoc(o,cr);i&&new Date(i.timestamp).getTime()<n&&(R.deleteDoc(o,cr),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${pn(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${pn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
|
|
1214
|
+
`)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${pn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await Nh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await Nh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
|
|
1215
|
+
`).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},Ln=new cd});import kT from"node:fs/promises";import ST from"node:os";import bT from"node:path";function CT(r){return bT.join(ST.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function Aa(r){let e=CT(r);if(!await P(e))return{};try{return JSON.parse(await kT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function ld(r){let e=await Aa(r);return e.linear?.apiKey?e.linear.apiKey:Pa("linear-api-key")}var Hh=y(()=>{"use strict";N();Te();od();l(CT,"getCredentialsPath");l(Aa,"getProjectCredentials");l(ld,"getLinearApiKey")});import vT from"node:fs/promises";import xT from"node:path";function Uh(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 PT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function TT(r){try{let e=xT.join(r,"analysis","repo-analysis.json"),t=await vT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e),null}}function ET(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=Rt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
|
|
1216
|
+
${xt(g)}`}return[u?`### Project
|
|
1172
1217
|
${u}`:null,m].filter(Boolean).join(`
|
|
1173
1218
|
|
|
1174
|
-
`)||null}function
|
|
1175
|
-
${
|
|
1176
|
-
`)}`)}let n=
|
|
1177
|
-
${
|
|
1219
|
+
`)||null}function IT(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Hm(e)}function AT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"";return`- **${o.name}**: ${o.description}${i}`});e.push(`### Patterns (follow these)
|
|
1220
|
+
${s.join(`
|
|
1221
|
+
`)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s=n.map(o=>`- **${o.issue}** \u2014 \`${o.file}\` \u2192 ${o.suggestion}`);e.push(`### Anti-patterns (avoid these)
|
|
1222
|
+
${s.join(`
|
|
1178
1223
|
`)}`)}return e.length>0?e.join(`
|
|
1179
1224
|
|
|
1180
|
-
`):null}function fT(s){let e=s>=0?"+":"-",t=Math.abs(s);if(t>=60){let n=Math.floor(t/60),r=t%60;return r>0?`${e}${n}h ${r}m`:`${e}${n}h`}return`${e}${t}m`}var nr,sd=y(()=>{"use strict";Xl();Jl();vh();Se();Ah();Lt();Bt();Li();N();Ns();Ls();jh();Vu();Zn();ot();nr=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await hn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Pa(o),k=await nd(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let b=await Ot.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ot.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return pn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,v,$]=await Promise.all([uT(),bt.getActive(o).catch(()=>null),dT(k),es(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=gl({description:c,branch:b,linearId:a}),H=pT(D,v),ee=jm($.files.map(Ve=>({path:Ve.path,description:Ve.reasons.join(", ")}))),S=mT(v),j=gT(D),te=et([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Ie(F,H,ee,S,j,te)),await this.logToMemory(t,"task_started",{task:e,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Yi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await Vl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Jr("working"),Ct("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Ch,pointsToMinutes:ya,pointsToTimeRange:Ph,storeEstimate:l(async f=>{let k=ya(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=gl({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Am(u,d):"",p=et([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=w(r);return n.md?o.includes("Cannot run")||o.includes("working state")?pn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(r);if(!o)return t.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await hn(r,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Dh(d):"0m",actualDuration:c||"0m",variance:d?fT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Dh(d)}) \u2192 ${b}${k}%`}await L.completeTask(r,t.feedback);let g=o.linearId;if(g)try{let f=await Pa(r),k=await nd(r);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(tn("Completed",`${a}${f}`),jt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),et([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Jr("completed"),Ct("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await hn(r,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await xe.getActiveTasks(r);if(o.length===0)return t.md?pn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(rt("Queue",`${o.length} task${o.length!==1?"s":""}`),At(i,!0),et([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Ct("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(tn("Task Paused",`**Paused:** ${i.description}`),jt({Reason:e||void 0,"Duration worked":a||void 0}),et([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Jr("paused"),Ct("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async resume(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?pn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(tn("Task Resumed",`**Resumed:** ${a.description}`),et([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Jr("working"),Ct("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?pn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Bu(r);return console.log(kh(o)),{success:!0,preferences:o}}return{success:!0,projectId:r,input:e,setWorkflowPreference:l(async o=>{await yh(r,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await wh(r,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Bu(r),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Dh,"formatMinutesToDuration");l(uT,"getGitBranch");l(dT,"loadRepoAnalysis");l(pT,"buildProjectContext");l(mT,"buildRules");l(gT,"buildPatterns");l(fT,"formatVariance")});var yn,YB,Rh=y(()=>{"use strict";Zi();Au();ju();Uu();Hu();Qi();zu();Ju();qu();Ku();sd();yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new nr,this.planning=new as,this.shipping=new Ys,this.analytics=new Ws,this.performanceCmds=new Js,this.maintenance=new Vs,this.analysis=new ds,this.setupCmds=new qs,this.updateCmds=new Qs,this.velocityCmds=new Zs,this.contextCmds=new ps,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},YB=new yn});var fo,sr,rd=y(()=>{"use strict";fo={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}},sr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Fh={};he(Fh,{UninstallCommands:()=>yo,uninstall:()=>Oh});import{execSync as va}from"node:child_process";import wt from"node:fs/promises";import hT from"node:os";import wn from"node:path";import yT from"node:readline";import Ce from"chalk";async function od(s){let e=0;try{let t=await wt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name);if(n.isDirectory())e+=await od(r);else try{let o=await wt.stat(r);e+=o.size}catch{}}}catch{}return e}function $h(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}async function wT(s){try{return(await wt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function kT(){let s={homebrew:!1,npm:!1};try{va("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{va("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function ST(){let s=[],e=em(),t=I.getGlobalBasePath(),n=await x(t),r=n?await wT(wn.join(t,"projects")):0,o=n?await od(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=wn.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let H=await wt.readFile(i,"utf-8");c=H.includes(xa)&&H.includes(ho)}catch{}s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await x(u),m=d?await od(u):0;s.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await x(p);s.push({path:p,type:"file",description:"Claude router",exists:g});let f=wn.join(e.claude.config,"prjct-statusline.sh"),k=await x(f);s.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await x(b);s.push({path:b,type:"file",description:"Gemini router",exists:D});let v=wn.join(e.gemini.config,"GEMINI.md"),$=await x(v),F=!1;if($)try{let H=await wt.readFile(v,"utf-8");F=H.includes(xa)&&H.includes(ho)}catch{}return $&&F&&s.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function bT(s){try{let e=await wt.readFile(s,"utf-8");if(!e.includes(xa)||!e.includes(ho))return!1;let t=e.indexOf(xa),n=e.indexOf(ho)+ho.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
|
|
1225
|
+
`):null}function jT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var lr,ud=y(()=>{"use strict";su();Zl();Rh();ke();_h();Ht();Lh();Vt();Bi();N();Ws();Bs();Hh();Qu();ss();at();lr=class extends ve{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await wn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Aa(o),k=await ld(o);if(k&&f.linear?.teamId){await Ft.initializeFromApiKey(k,f.linear.teamId);let b=await Ft.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ft.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return sn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a});let k=E.getGlobalProjectPath(o),[b,D,x,M]=await Promise.all([PT(),vt.getActive(o).catch(()=>null),TT(k),rs(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=null;try{let _=Ln.getSnapshot(o);_&&(F=Ln.formatContinuityContext(_),Ln.clearSnapshot(o))}catch{}let G=bl({description:c,branch:b,linearId:a}),ee=ET(D,x),S=Lm(M.files.map(_=>({path:_.path,description:_.reasons.join(", ")}))),j=IT(x),te=AT(D),Ze=Xe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Se(F,G,ee,S,j,te,Ze)),await this.logToMemory(t,"task_started",{task:e,timestamp:z.getTimestamp()}),await wn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await na.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a});let m=await Ql.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Qr("working"),Pt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:z.getTimestamp()}),await wn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:jh,pointsToMinutes:va,pointsToTimeRange:Dh,storeEstimate:l(async f=>{let k=va(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?sn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?z.calculateDuration(new Date(i.startedAt)):void 0,c=bl({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Nm(u,d):"",p=Xe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Se(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=w(s);return n.md?o.includes("Cannot run")||o.includes("working state")?sn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return t.md?sn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await wn(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=z.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await ht.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:z.getTimestamp(),estimatedDuration:d?Uh(d):"0m",actualDuration:c||"0m",variance:d?jT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Uh(d)}) \u2192 ${b}${k}%`}await L.completeTask(s,t.feedback);try{Ln.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Aa(s),k=await ld(s);k&&f.linear?.teamId&&(await Ft.initializeFromApiKey(k,f.linear.teamId),await Ft.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Se(Jt("Completed",`${a}${f}`),Rt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Xe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Qr("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await wn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Ee.getActiveTasks(s);if(o.length===0)return t.md?sn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Se(nt("Queue",`${o.length} task${o.length!==1?"s":""}`),xt(i,!0),Xe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?sn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e);try{await Ln.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(Se(Jt("Task Paused",`**Paused:** ${i.description}`),Rt({Reason:e||void 0,"Duration worked":a||void 0}),Xe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Qr("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?sn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Se(Jt("Task Resumed",`**Resumed:** ${a.description}`),Xe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Qr("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?sn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Xu(s);return console.log(Eh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await Ph(s,{...o,createdAt:z.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Th(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Xu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await Ln.cleanup();return t.md?console.log(Jt("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await Ln.listAllSnapshots();if(n.length===0)return t.md?sn("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=z.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(Se(nt("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),xt(s),Xe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=z.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Uh,"formatMinutesToDuration");l(PT,"getGitBranch");l(TT,"loadRepoAnalysis");l(ET,"buildProjectContext");l(IT,"buildRules");l(AT,"buildPatterns");l(jT,"formatVariance")});var kn,xV,Gh=y(()=>{"use strict";oa();Ou();Fu();Vu();Ju();ra();Ku();Zu();ed();td();ud();kn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new lr,this.planning=new ds,this.shipping=new nr,this.analytics=new Ys,this.performanceCmds=new Zs,this.maintenance=new Qs,this.analysis=new hs,this.setupCmds=new er,this.updateCmds=new rr,this.velocityCmds=new or,this.contextCmds=new ys,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},xV=new kn});var So,ur,dd=y(()=>{"use strict";So={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}},ur=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Vh={};we(Vh,{UninstallCommands:()=>Co,uninstall:()=>Bh});import{execSync as ja}from"node:child_process";import St from"node:fs/promises";import DT from"node:os";import Sn from"node:path";import RT from"node:readline";import xe from"chalk";async function pd(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let n of t){let s=Sn.join(r,n.name);if(n.isDirectory())e+=await pd(s);else try{let o=await St.stat(s);e+=o.size}catch{}}}catch{}return e}function zh(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 $T(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function MT(){let r={homebrew:!1,npm:!1};try{ja("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ja("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function OT(){let r=[],e=am(),t=E.getGlobalBasePath(),n=await P(t),s=n?await $T(Sn.join(t,"projects")):0,o=n?await pd(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=Sn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let G=await St.readFile(i,"utf-8");c=G.includes(Da)&&G.includes(bo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await pd(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Sn.join(e.claude.config,"prjct-statusline.sh"),k=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=Sn.join(e.gemini.config,"GEMINI.md"),M=await P(x),F=!1;if(M)try{let G=await St.readFile(x,"utf-8");F=G.includes(Da)&&G.includes(bo)}catch{}return M&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function FT(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes(Da)||!e.includes(bo))return!1;let t=e.indexOf(Da),n=e.indexOf(bo)+bo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1181
1226
|
|
|
1182
|
-
`).trim(),!
|
|
1183
|
-
`,"utf-8"),!0}catch{return!1}}async function
|
|
1184
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=
|
|
1185
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1186
|
-
${a.length} errors:`));for(let c of a)console.log(
|
|
1187
|
-
`))!==-1;){let
|
|
1227
|
+
`).trim(),!s||s.trim().length===0?await St.unlink(r):await St.writeFile(r,`${s}
|
|
1228
|
+
`,"utf-8"),!0}catch{return!1}}async function _T(){let r=DT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Sn.join(r,`.prjct-backup-${e}`);try{await St.mkdir(t,{recursive:!0});let n=E.getGlobalBasePath();return await P(n)&&await Wh(n,Sn.join(t,".prjct-cli")),t}catch{return null}}async function Wh(r,e){await St.mkdir(e,{recursive:!0});let t=await St.readdir(r,{withFileTypes:!0});for(let n of t){let s=Sn.join(r,n.name),o=Sn.join(e,n.name);n.isDirectory()?await Wh(s,o):await St.copyFile(s,o)}}async function NT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await FT(o.path)&&n.push(o.path):o.type==="directory"?(await St.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await St.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ja(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||ja("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function LT(r){let e=RT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Bh(r={},e=process.cwd()){let t=await OT(),n=MT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(xe.yellow(`
|
|
1229
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(xe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(xe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=E.getDisplayPath(c.path),d="";c.type==="section"?d=xe.dim("(section only)"):c.size&&(d=xe.dim(`(${zh(c.size)})`)),console.log(` ${xe.cyan(u.padEnd(35))} ${d}`),console.log(` ${xe.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${xe.cyan("Homebrew".padEnd(35))} ${xe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${xe.cyan("npm global".padEnd(35))} ${xe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(xe.dim(` Total size: ${zh(o)}`)),console.log("")),r.dryRun)return console.log(xe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(xe.blue("Creating backup..."));let c=await _T();c?(console.log(xe.green(`Backup created: ${E.getDisplayPath(c)}`)),console.log("")):console.log(xe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(xe.yellow('Type "uninstall" to confirm:')),!await LT("> ")))return console.log(xe.yellow(`
|
|
1230
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(xe.blue("Removing prjct..."));let{deleted:i,errors:a}=await NT(t,n,r);if(console.log(""),i.length>0&&console.log(xe.green(`Removed ${i.length} items`)),a.length>0){console.log(xe.yellow(`
|
|
1231
|
+
${a.length} errors:`));for(let c of a)console.log(xe.red(` - ${c}`))}return console.log(""),console.log(xe.green("prjct has been uninstalled.")),console.log(xe.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 Da,bo,Co,md=y(()=>{"use strict";Dn();ke();N();Te();at();Da="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",bo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(pd,"getDirectorySize");l(zh,"formatSize");l($T,"countDirectoryItems");l(MT,"detectInstallation");l(OT,"gatherUninstallItems");l(FT,"removePrjctSection");l(_T,"createBackup");l(Wh,"copyDirectory");l(NT,"performUninstall");l(LT,"promptConfirmation");l(Bh,"uninstall");Co=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Bh(e,t)}}});function VT(){for(let[r,e]of Object.entries(So))U.registerCategory(r,e)}function Kh(){if(U.has("work"))return;VT();let r=l(e=>ur.find(t=>t.name===e),"getMeta");U.registerMethod("task",ws,"now",r("task")),U.registerMethod("done",ws,"done",r("done")),U.registerMethod("next",ws,"next",r("next")),U.registerMethod("pause",ws,"pause",r("pause")),U.registerMethod("resume",ws,"resume",r("resume")),U.registerMethod("workflow",ws,"workflow",r("workflow")),U.registerMethod("sessions",ws,"sessions",r("sessions")),U.registerMethod("init",Ra,"init",r("init")),U.registerMethod("bug",Ra,"bug",r("bug")),U.registerMethod("idea",Ra,"idea",r("idea")),U.registerMethod("spec",Ra,"spec",r("spec")),U.registerMethod("ship",HT,"ship",r("ship")),U.registerMethod("dash",Jh,"dash",r("dash")),U.registerMethod("help",Jh,"help",r("help")),U.registerMethod("perf",UT,"perf",r("perf")),U.registerMethod("velocity",zT,"velocity",r("velocity")),U.registerMethod("cleanup",dr,"cleanup",r("cleanup")),U.registerMethod("design",dr,"design",r("design")),U.registerMethod("recover",dr,"recover",r("recover")),U.registerMethod("undo",dr,"undo",r("undo")),U.registerMethod("redo",dr,"redo",r("redo")),U.registerMethod("history",dr,"history",r("history")),U.registerMethod("analyze",pr,"analyze",r("analyze")),U.registerMethod("sync",pr,"sync",r("sync")),U.registerMethod("stats",pr,"stats",r("stats")),U.registerMethod("status",pr,"status",r("status")),U.registerMethod("seal",pr,"seal",r("seal")),U.registerMethod("verify",pr,"verify",r("verify")),U.registerMethod("start",qh,"start",r("start")),U.registerMethod("setup",qh,"setup",r("setup")),U.registerMethod("uninstall",WT,"uninstall",r("uninstall")),U.registerMethod("update",BT,"update",r("update")),U.registerMethod("context",GT,"context",r("context"))}var ws,Ra,HT,Jh,UT,dr,pr,qh,GT,zT,WT,BT,$a=y(()=>{"use strict";oa();Ou();dd();Fu();Vu();Ju();ra();Ks();Ku();Zu();md();ed();td();ud();ws=new lr,Ra=new ds,HT=new nr,Jh=new Ys,UT=new Zs,dr=new Qs,pr=new hs,qh=new er,GT=new ys,zT=new or,WT=new Co,BT=new rr;l(VT,"registerCategories");l(Kh,"registerAllCommands");Kh()});var gd=y(()=>{"use strict";Cc();Gh();$a();Ks()});var Xh={};we(Xh,{shutdown:()=>gr,startDaemon:()=>qT});import _t from"node:fs";import{createServer as JT}from"node:net";async function qT(r){let e=Ge.socket(),t=Ge.pid(),n=Ge.runDir();if(_t.mkdirSync(n,{recursive:!0}),_t.existsSync(t)){let s=parseInt(_t.readFileSync(t,"utf-8").trim(),10);ZT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),_t.unlinkSync(t)}if(_t.existsSync(e)&&_t.unlinkSync(e),Ve={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ha,idleTimer:null},Ne=new kn,mr=JT(s=>KT(s)),mr.listen(e,()=>{_t.chmodSync(e,384),_t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Yh()}),mr.on("error",s=>{console.error("Daemon socket error:",s.message),gr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||oi;vo=ri({port:i,projectId:o,projectPath:s,enableLogging:!1}),await vo.start()}}catch{}if(process.on("SIGTERM",()=>gr(0)),process.on("SIGINT",()=>gr(0)),process.on("SIGHUP",()=>{Ne=new kn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function KT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1232
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await YT(o);r.write(Ss(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Ss(i))}}}),r.on("error",()=>{})}async function YT(r){if(!Ve||!Ne)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Yh(),Ve.commandsServed++,Ve.lastActivity=Date.now(),r.command==="daemon")return QT(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await XT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1188
1233
|
`)||o.message||void 0,stderr:t.join(`
|
|
1189
|
-
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=
|
|
1234
|
+
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function XT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Ne.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Ne.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Ne.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Ne.seal(r.cwd,{json:t.json===!0});case"verify":return Ne.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Ne.task(e,r.cwd,{md:n});case"done":return Ne.done(r.cwd,{md:n});case"next":return Ne.next(r.cwd,{md:n});case"pause":return Ne.pause(e||"",r.cwd,{md:n});case"resume":return Ne.resume(e,r.cwd,{md:n});case"bug":return Ne.bug(e||"",r.cwd,{md:n});case"idea":return Ne.idea(e||"",r.cwd,{md:n});case"ship":return Ne.ship(e,r.cwd,{md:n});case"dash":return Ne.dash(e||"default",r.cwd,{md:n});case"sessions":return Ne.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return Ne.design(e||"",t);case"analyze":return Ne.analyze(t);case"cleanup":return Ne.cleanup(t);default:return U.execute(r.command,e,r.cwd)}}function QT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ge.socket(),uptime:Ve?Date.now()-Ve.startedAt:0,commandsServed:Ve?.commandsServed??0,lastActivity:Ve?new Date(Ve.lastActivity).toISOString():null,registeredCommands:U.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>gr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Yh(){Ve&&(Ve.idleTimer&&clearTimeout(Ve.idleTimer),Ve.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ve.idleTimeoutMs/1e3/60} minutes, shutting down`),gr(0)},Ve.idleTimeoutMs),Ve.idleTimer.unref&&Ve.idleTimer.unref())}function gr(r){console.log("Daemon shutting down..."),Ve?.idleTimer&&clearTimeout(Ve.idleTimer),vo&&(vo.stop(),vo=null),mr&&(mr.close(),mr=null);let e=Ge.socket(),t=Ge.pid();try{_t.existsSync(e)&&_t.unlinkSync(e)}catch{}try{_t.existsSync(t)&&_t.unlinkSync(t)}catch{}process.exit(r)}function ZT(r){try{return process.kill(r,0),!0}catch{return!1}}var mr,vo,Ne,Ve,Qh=y(()=>{"use strict";gd();Ks();$a();qe();$c();Po();mr=null,vo=null,Ne=null,Ve=null;l(qT,"startDaemon");l(KT,"handleConnection");l(YT,"handleRequest");l(XT,"executeCommand");l(QT,"handleDaemonCommand");l(Yh,"resetIdleTimer");l(gr,"shutdown");l(ZT,"isProcessRunning")});var ty={};we(ty,{runStart:()=>lE});import Nt from"node:fs/promises";import Zh from"node:os";import Qt from"node:path";import V from"chalk";function nE(){console.clear(),console.log(eE),console.log(tE)}function ey(r,e){console.log(`
|
|
1190
1235
|
${V.bold(" Select AI providers to configure:")}
|
|
1191
1236
|
`),console.log(` ${V.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1192
|
-
`),
|
|
1237
|
+
`),r.forEach((t,n)=>{let s=n===e?V.cyan("\u276F"):" ",o=t.selected?V.green("[\u2713]"):V.dim("[ ]"),i=t.installed?V.green("(installed)"):V.yellow("(will install)"),a=n===e?V.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function sE(){let r=await un(),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}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),ey(e,n)},"render");ey(e,n),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(`
|
|
1193
1238
|
Cancelled.
|
|
1194
1239
|
`),process.exit(0)),a==="\r"||a===`
|
|
1195
|
-
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),
|
|
1240
|
+
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
|
|
1196
1241
|
${V.bold(" Detected providers:")}
|
|
1197
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function
|
|
1242
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function rE(r){let e=Oe[r];if(!e.configDir)return!1;try{let t=Qt.join(e.configDir,"commands");await Nt.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(lt(),No)),s=n(),o=r==="claude"?"p.md":"p.toml",i=Qt.join(s,"templates","commands",o),a=Qt.join(t,o);return await P(i)?(await Nt.copyFile(i,a),!0):!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function oE(r){let e=Oe[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Qt.join(e.configDir,"commands"):Qt.join(e.configDir,"commands","p");await Nt.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=An("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=ye(`commands/${i}`);a&&await Nt.writeFile(Qt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} subcommands: ${w(t)}`),!1}}async function iE(r){let e=Oe[r];if(!e.configDir)return!1;try{await Nt.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(lt(),No)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Qt.join(n,"templates","global",s),i=Qt.join(e.configDir,s);if(await P(o)){let a=await Nt.readFile(o,"utf-8");if(await P(i)){let c=await Nt.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 m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await Nt.writeFile(i,m+g+p)}else await Nt.writeFile(i,`${c}
|
|
1198
1243
|
|
|
1199
|
-
${a}`)}else await
|
|
1244
|
+
${a}`)}else await Nt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function aE(r){let e=Qt.join(Zh.homedir(),".prjct-cli","config");await Nt.mkdir(e,{recursive:!0});let t=Qt.join(e,"installed-editors.json"),n={version:Pe,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Qt.join(Zh.homedir(),`.${r[0]}`,"commands")};await Nt.writeFile(t,JSON.stringify(n,null,2))}function cE(r){console.log(`
|
|
1200
1245
|
${V.green.bold(" \u2713 Setup complete!")}
|
|
1201
|
-
`),console.log(` ${V.dim("Configured providers:")}`),
|
|
1246
|
+
`),console.log(` ${V.dim("Configured providers:")}`),r.forEach(e=>{let t=Oe[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1202
1247
|
${V.bold("Next steps:")}
|
|
1203
1248
|
|
|
1204
1249
|
${V.cyan("1.")} Navigate to your project directory
|
|
@@ -1211,30 +1256,30 @@ ${V.green.bold(" \u2713 Setup complete!")}
|
|
|
1211
1256
|
${V.dim("\u2022")} Use ${V.bold("p. ship")} to create PRs
|
|
1212
1257
|
|
|
1213
1258
|
${V.dim("Learn more: https://prjct.app/docs")}
|
|
1214
|
-
`)}async function
|
|
1259
|
+
`)}async function lE(){nE();let r=await sE();console.log(`
|
|
1215
1260
|
${V.cyan("Setting up...")}
|
|
1216
|
-
`);for(let e of
|
|
1261
|
+
`);for(let e of r){let t=Oe[e];process.stdout.write(` ${V.dim("\u2022")} ${t.displayName}... `);let n=await rE(e),s=await oE(e),o=await iE(e);console.log(n&&s&&o?V.green("\u2713"):n||o?V.yellow("partial"):V.yellow("skipped"))}await aE(r),cE(r)}var fr,hr,yr,wr,kr,eE,tE,ny=y(()=>{"use strict";jn();Je();N();Te();lt();fr=V.rgb(0,255,255),hr=V.rgb(80,180,255),yr=V.rgb(140,120,255),wr=V.rgb(200,80,220),kr=V.rgb(255,80,180),eE=`
|
|
1217
1262
|
|
|
1218
|
-
${
|
|
1219
|
-
${
|
|
1220
|
-
${
|
|
1221
|
-
${
|
|
1222
|
-
${
|
|
1223
|
-
${
|
|
1263
|
+
${fr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${hr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${yr(" \u2588\u2588\u2557")}${wr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${kr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1264
|
+
${fr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${hr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${yr(" \u2588\u2588\u2551")}${wr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${kr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1265
|
+
${fr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${hr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${yr(" \u2588\u2588\u2551")}${wr("\u2588\u2588\u2551 ")}${kr(" \u2588\u2588\u2551 ")}
|
|
1266
|
+
${fr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${hr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${yr("\u2588\u2588 \u2588\u2588\u2551")}${wr("\u2588\u2588\u2551 ")}${kr(" \u2588\u2588\u2551 ")}
|
|
1267
|
+
${fr(" \u2588\u2588\u2551 ")}${hr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${yr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${wr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${kr(" \u2588\u2588\u2551 ")}
|
|
1268
|
+
${fr(" \u255A\u2550\u255D ")}${hr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${yr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${wr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${kr(" \u255A\u2550\u255D ")}
|
|
1224
1269
|
|
|
1225
|
-
`,
|
|
1270
|
+
`,tE=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${Pe}`)}
|
|
1226
1271
|
|
|
1227
1272
|
${V.dim(`Project context layer for AI coding agents.
|
|
1228
1273
|
Works with Claude Code, Gemini CLI, and more.`)}
|
|
1229
1274
|
${V.cyan("https://prjct.app")}
|
|
1230
|
-
`;l(
|
|
1231
|
-
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==
|
|
1275
|
+
`;l(nE,"showBanner");l(ey,"showProviderSelection");l(sE,"selectProviders");l(rE,"installRouter");l(oE,"installSubcommands");l(iE,"installGlobalConfig");l(aE,"saveSetupConfig");l(cE,"showCompletion");l(lE,"runStart")});import{exec as uE}from"node:child_process";import oy from"node:fs/promises";import cn from"node:path";import{promisify as dE}from"node:util";async function Sr(r,e=process.cwd(),t={}){let n=cn.isAbsolute(r)?r:cn.join(e,r),s;try{s=await oy.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=cn.extname(r).toLowerCase(),i=hE[o]||"unknown",a=fE[i]||[],c=await yE(s,a,n,e),u=[];t.reverse&&(u=await kE(r,e));let d;t.depth&&t.depth>0&&(d=await iy(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function yE(r,e,t,n){let s=[],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 p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await wE(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function wE(r,e,t){let n=cn.dirname(e);if(r.startsWith("@/")){let o=cn.join(t,"src",r.slice(2));return ry(o,t)}let s=cn.resolve(n,r);return ry(s,t)}async function ry(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await oy.stat(s)).isFile())return cn.relative(e,s)}catch{}}return null}async function kE(r,e){let t=[],n=cn.basename(r,cn.extname(r)),s=cn.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await pE(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
|
|
1276
|
+
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function iy(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await Sr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await iy(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var pE,sy,mE,gE,fE,hE,fd=y(()=>{"use strict";N();pE=dE(uE),sy=[{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}],mE=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],gE=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],fE={typescript:sy,javascript:sy,python:mE,go:gE},hE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Sr,"analyzeImports");l(yE,"extractImports");l(wE,"resolveImport");l(ry,"tryResolve");l(kE,"findImportedBy");l(iy,"buildDependencyTree")});import ay from"node:fs/promises";import ln from"node:path";async function Ma(r,e=process.cwd()){let t=ln.isAbsolute(r)?r:ln.join(e,r),n;try{n=await ay.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:os("")};throw p}let s=ln.extname(r).toLowerCase(),o=cy[s]||"unknown",i=await On(r,e),a=await Sr(r,e),c=bE(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?CE(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=vE(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ro(n,m)}}async function hd(r,e=process.cwd(),t={}){let n=ln.isAbsolute(r)?r:ln.join(e,r),s=[];async function o(i){let a=await ay.readdir(i,{withFileTypes:!0});for(let c of a){let u=ln.join(i,c.name),d=ln.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 m=ln.extname(c.name).toLowerCase();if(cy[m]){let p=await Ma(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function bE(r,e){let t=SE[e]||[],n=r.split(`
|
|
1232
1277
|
`);for(let o=0;o<Math.min(30,n.length);o++){let i=n[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<n.length&&a.start.test(n[u].trim());)c.push(n[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<n.length&&(c+=`${n[u]}
|
|
1233
1278
|
`,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1234
|
-
`).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.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 r
|
|
1235
|
-
`)[0]||"";return`Module: ${
|
|
1236
|
-
`)[0].trim()}function
|
|
1237
|
-
`)}var
|
|
1279
|
+
`).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.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 s=r.split(`
|
|
1280
|
+
`)[0]||"";return`Module: ${ln.basename(s,ln.extname(s))}`}function CE(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1281
|
+
`)[0].trim()}function vE(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
|
|
1282
|
+
`)}var SE,cy,ly=y(()=>{"use strict";N();fd();qi();oo();SE={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}]},cy={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ma,"summarizeFile");l(hd,"summarizeDirectory");l(bE,"extractFilePurpose");l(CE,"extractDescriptionFromDocstring");l(vE,"buildSummaryText")});var uy=y(()=>{"use strict"});var dy={};we(dy,{analyzeImports:()=>Sr,combineMetrics:()=>Ji,countTokens:()=>Vi,extractDirectorySignatures:()=>Hl,extractSignatures:()=>On,findRelevantFiles:()=>rs,formatCompressionRate:()=>Av,formatCostSaved:()=>Ll,formatTokenCount:()=>Iv,getRecentFiles:()=>so,measureCompression:()=>ro,noCompression:()=>os,runContextTool:()=>xE,summarizeDirectory:()=>hd,summarizeFile:()=>Ma});async function xE(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await PE(o,t);break;case"signatures":i=await TE(o,t);break;case"imports":i=await EE(o,t);break;case"recent":i=await IE(o,t);break;case"summary":i=await AE(o,t);break;case"help":return{tool:"error",result:{error:$E(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=jE(i),u=DE(i);return await RE(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function PE(r,e){let t={},n=[];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:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await rs(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function TE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Hl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Ji(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await On(t,e)}}async function EE(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 n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await Sr(t,e,n)}}async function IE(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await so(e,t)}}async function AE(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 n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await hd(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(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Ji(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ma(t,e)}}function jE(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 DE(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 RE(r,e){try{await gn.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function $E(){return`
|
|
1238
1283
|
Context Tools - Smart context filtering for AI agents
|
|
1239
1284
|
|
|
1240
1285
|
USAGE:
|
|
@@ -1295,7 +1340,7 @@ TOOLS:
|
|
|
1295
1340
|
OUTPUT:
|
|
1296
1341
|
All tools output JSON for easy parsing by AI agents.
|
|
1297
1342
|
Each output includes metrics showing token savings.
|
|
1298
|
-
`.trim()}var
|
|
1343
|
+
`.trim()}var py=y(()=>{"use strict";Kr();N();ae();Bi();fd();_l();qi();ly();oo();oo();uy();l(xE,"runContextTool");l(PE,"runFilesTool");l(TE,"runSignaturesTool");l(EE,"runImportsTool");l(IE,"runRecentTool");l(AE,"runSummaryTool");l(jE,"getTokensSaved");l(DE,"getCompressionRate");l(RE,"recordToolUsage");l($E,"getHelpText")});var hy={};we(hy,{hooksService:()=>HE});import Ue from"node:fs/promises";import $e from"node:path";import Et from"chalk";function gy(){return`#!/bin/sh
|
|
1299
1344
|
# prjct auto-sync hook (post-commit)
|
|
1300
1345
|
# Syncs project context after each commit
|
|
1301
1346
|
# Installed by: prjct hooks install
|
|
@@ -1316,7 +1361,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1316
1361
|
fi
|
|
1317
1362
|
|
|
1318
1363
|
exit 0
|
|
1319
|
-
`}function
|
|
1364
|
+
`}function fy(){return`#!/bin/sh
|
|
1320
1365
|
# prjct auto-sync hook (post-checkout)
|
|
1321
1366
|
# Syncs project context after branch switch
|
|
1322
1367
|
# Installed by: prjct hooks install
|
|
@@ -1348,43 +1393,43 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1348
1393
|
fi
|
|
1349
1394
|
|
|
1350
1395
|
exit 0
|
|
1351
|
-
`}async function
|
|
1396
|
+
`}async function yd(r){let e=[];return(await P($e.join(r,"lefthook.yml"))||await P($e.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P($e.join(r,".husky"))||await P($e.join(r,".husky","_")))&&e.push("husky"),await P($e.join(r,".git"))&&e.push("direct"),e}function my(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ME(r,e){let t=await P($e.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=$e.join(r,t),s=await Ue.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
|
|
1352
1397
|
${i}:
|
|
1353
1398
|
commands:
|
|
1354
1399
|
${a}:
|
|
1355
1400
|
run: prjct sync --quiet --yes
|
|
1356
1401
|
fail_text: "prjct sync failed (non-blocking)"
|
|
1357
|
-
`,u=new RegExp(`^${i}:\\s*$`,"m");u.test(
|
|
1402
|
+
`,u=new RegExp(`^${i}:\\s*$`,"m");u.test(s)?s=s.replace(u,`${i}:
|
|
1358
1403
|
commands:
|
|
1359
1404
|
${a}:
|
|
1360
1405
|
run: prjct sync --quiet --yes
|
|
1361
|
-
fail_text: "prjct sync failed (non-blocking)"`):
|
|
1362
|
-
${c}`}return await Ue.writeFile(n,
|
|
1406
|
+
fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
|
|
1407
|
+
${c}`}return await Ue.writeFile(n,s,"utf-8"),!0}async function OE(r,e){let t=$e.join(r,".husky");for(let n of e){let s=$e.join(t,n),o=n==="post-commit"?gy():fy();if(await P(s)){if((await Ue.readFile(s,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(s,`
|
|
1363
1408
|
# prjct auto-sync
|
|
1364
1409
|
prjct sync --quiet --yes &
|
|
1365
|
-
`)}else await Ue.writeFile(
|
|
1410
|
+
`)}else await Ue.writeFile(s,o,{mode:493})}return!0}async function FE(r,e){let t=$e.join(r,".git","hooks");await P(t)||await Ue.mkdir(t,{recursive:!0});for(let n of e){let s=$e.join(t,n),o=n==="post-commit"?gy():fy();if(await P(s)){if((await Ue.readFile(s,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(s,`
|
|
1366
1411
|
# prjct auto-sync
|
|
1367
1412
|
${o.split(`
|
|
1368
1413
|
`).slice(1).join(`
|
|
1369
|
-
`)}`)}else await Ue.writeFile(
|
|
1370
|
-
`,"utf-8"),!0}async function
|
|
1414
|
+
`)}`)}else await Ue.writeFile(s,o,{mode:493})}return!0}async function _E(r){let e=await P($e.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=$e.join(r,e);if(!await P(t))return!1;let n=await Ue.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ue.writeFile(t,`${n.trimEnd()}
|
|
1415
|
+
`,"utf-8"),!0}async function NE(r){let e=$e.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await P(n))continue;let s=await Ue.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
|
|
1371
1416
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1372
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ue.unlink(n):await Ue.writeFile(n,o,{mode:493})}return!0}async function
|
|
1417
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ue.unlink(n):await Ue.writeFile(n,o,{mode:493})}return!0}async function LE(r){let e=$e.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=$e.join(e,t);if(!await P(n))continue;let s=await Ue.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await Ue.unlink(n);else{let o=s.split(`
|
|
1373
1418
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1374
|
-
`);await Ue.writeFile(n,o,{mode:493})}}return!0}var
|
|
1375
|
-
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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 L.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${Pe}`)}printSection(e,t){h.section(e);let n=t.map(
|
|
1376
|
-
\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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(
|
|
1377
|
-
${
|
|
1378
|
-
`)}function
|
|
1379
|
-
`)}function
|
|
1380
|
-
`)}function
|
|
1381
|
-
${K.yellow(`Command '${
|
|
1419
|
+
`);await Ue.writeFile(n,o,{mode:493})}}return!0}var wd,HE,yy=y(()=>{"use strict";qe();fe();N();Te();zt();l(gy,"getPostCommitScript");l(fy,"getPostCheckoutScript");l(yd,"detectHookManagers");l(my,"selectStrategy");l(ME,"installLefthook");l(OE,"installHusky");l(FE,"installDirect");l(_E,"uninstallLefthook");l(NE,"uninstallHusky");l(LE,"uninstallDirect");wd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await yd(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||my(s);try{let i=!1;switch(o){case"lefthook":i=await ME(e,n);break;case"husky":i=await OE(e,n);break;case"direct":i=await FE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await _E(e);break;case"husky":s=await NE(e);break;case"direct":s=await LE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await yd(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.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){h.start(),h.section("Git Hooks Installation");let t=await yd(e),n=my(t);console.log(` Strategy: ${Et.cyan(n)}`),console.log(` Hooks: ${Et.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${Et.green("\u2713")} ${o}`);console.log(""),console.log(Et.dim(" Context will auto-sync on commit and branch switch.")),console.log(Et.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${Et.green("Active")}`),console.log(` Strategy: ${Et.cyan(t.strategy)}`)):console.log(` Status: ${Et.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?Et.green("\u2713"):Et.dim("\u25CB"),o=n.installed?n.name:Et.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${Et.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(Et.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P($e.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=$e.join(e,o);return await P(i)?(await Ue.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=$e.join(e,".husky",t);return await P(o)?(await Ue.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=$e.join(e,".git","hooks",t);return await P(s)?(await Ue.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P($e.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await $.getProjectId(e);if(!t)return null;try{let n=R.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await $.getProjectId(e);if(n)try{let s=R.getDoc(n,"project")||{};s.hooks=t,R.setDoc(n,"project",s)}catch{}}},HE=new wd});var Sy={};we(Sy,{DoctorService:()=>Oa,doctorService:()=>UE});import{execSync as kd}from"node:child_process";import wy from"node:fs/promises";import ky from"node:path";import Hn from"chalk";var Oa,UE,by=y(()=>{"use strict";qe();ke();Vt();zt();lt();Oa=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=E.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,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,n,s,o){try{let a=kd(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}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}async checkPrjctConfig(){let e=ky.join(this.projectPath,".prjct","prjct.config.json");try{return await wy.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{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=ky.join(this.globalPath,"context","CLAUDE.md");try{let t=await wy.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>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{kd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=kd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
|
|
1420
|
+
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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 L.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${Pe}`)}printSection(e,t){h.section(e);let n=t.map(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Hn.dim(" (optional)"):"";return`${o} ${i} ${Hn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Hn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Hn.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return Hn.green("\u2713");case"warn":return Hn.yellow("\u26A0");case"error":return t?Hn.dim("\u25CB"):Hn.red("\u2717")}}},UE=new Oa});var Cy={};we(Cy,{WatchService:()=>Fa,watchService:()=>VE});import GE from"node:path";import ot from"chalk";import zE from"chokidar";var WE,BE,Fa,VE,vy=y(()=>{"use strict";qe();N();ae();ju();WE=["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"],BE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Fa=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=zE.watch(WE,{cwd:this.projectPath,ignored:BE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),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(ot.dim(`
|
|
1421
|
+
\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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(ot.dim(` ${n} ${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 n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(ot.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);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=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
|
|
1422
|
+
${ot.dim(`[${t}]`)} ${ot.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await gs.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${ot.dim(`[${t}]`)} ${ot.green("\u2713")} Synced${o}`)}}else console.error(`${ot.dim(`[${t}]`)} ${ot.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${ot.dim(`[${t}]`)} ${ot.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(ot.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(ot.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(ot.dim(` Project: ${GE.basename(this.projectPath)}`)),console.log(ot.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(ot.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(ot.dim(" Press Ctrl+C to stop")),console.log("")}},VE=new Fa});var jy={};we(jy,{formatAgentCommandHelp:()=>Ey,formatCommandHelp:()=>Iy,formatCommandList:()=>Ay,formatMainHelp:()=>Py,formatTerminalCommandHelp:()=>Ty,getHelp:()=>qE});import K from"chalk";function Py(){let r=[];r.push(""),r.push(`${K.cyan.bold("prjct")} v${Pe} - Context layer for AI coding agents`),r.push(K.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(K.bold("QUICK START")),r.push(K.dim("\u2500".repeat(60))),r.push(` ${K.green("1.")} prjct start ${K.dim("# Configure AI providers")}`),r.push(` ${K.green("2.")} cd my-project && prjct init`),r.push(` ${K.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${K.green("4.")} p. sync ${K.dim("# Analyze project")}`),r.push(""),r.push(K.bold("TERMINAL COMMANDS")),r.push(K.dim("\u2500".repeat(60)));for(let t of xy){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${K.bold("AI AGENT COMMANDS")} ${K.dim("(inside Claude/Gemini/Cursor)")}`),r.push(K.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${K.dim("\u2500".repeat(56))}`);let e=ur.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${K.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(K.bold("FLAGS")),r.push(K.dim("\u2500".repeat(60)));for(let t of JE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(K.bold("MORE INFO")),r.push(K.dim("\u2500".repeat(60))),r.push(` Documentation: ${K.cyan("https://prjct.app")}`),r.push(` GitHub: ${K.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1423
|
+
`)}function Ty(r){let e=xy.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(K.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(K.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
|
|
1424
|
+
`)}function Ey(r){let e=ur.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.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(K.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(K.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(K.bold("REQUIREMENTS")),t.push(` ${K.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=So[e.group];return n&&(t.push(K.dim(`Category: ${n.title}`)),e.isOptional&&t.push(K.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1425
|
+
`)}function Iy(r){let e=Ty(r);if(e)return e;let t=Ey(r);return t||`
|
|
1426
|
+
${K.yellow(`Command '${r}' not found.`)}
|
|
1382
1427
|
|
|
1383
1428
|
Run 'prjct help' to see all available commands.
|
|
1384
|
-
`}function
|
|
1385
|
-
`)}function
|
|
1429
|
+
`}function Ay(){let r=[];r.push(""),r.push(K.cyan.bold("All Commands")),r.push("");let e=Object.entries(So).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=ur.filter(o=>o.group===t);if(s.length!==0){r.push(`${K.bold(n.title)} ${K.dim(`(${s.length} commands)`)}`),r.push(K.dim(n.description)),r.push("");for(let o of s){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(K.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1430
|
+
`)}function qE(r){return r?r==="commands"||r==="all"?Ay():Iy(r):Py()}var xy,JE,Dy=y(()=>{"use strict";dd();lt();xy=[{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:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],JE=[{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(Py,"formatMainHelp");l(Ty,"formatTerminalCommandHelp");l(Ey,"formatAgentCommandHelp");l(Iy,"formatCommandHelp");l(Ay,"formatCommandList");l(qE,"getHelp")});var _y={};we(_y,{installAntigravitySkill:()=>Oy,installCodexSkill:()=>Fy,needsAntigravityInstallation:()=>ZE,run:()=>My});import{execSync as KE}from"node:child_process";import J from"node:fs/promises";import Un from"node:os";import Z from"node:path";import ge from"chalk";async function YE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!zs.isAvailable("npm"))return console.log(`${ge.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ge.dim(`Install ${r.displayName} using one of:`)}`),console.log(ge.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ge.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(ge.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ge.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),KE(`npm install -g ${e}`,{stdio:"inherit",timeout:Ms("NPM_INSTALL")}),console.log(""),console.log(`${ge.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(ge.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(ge.dim("The npm install took too long. Try:")),console.log(ge.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ge.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ge.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(ge.dim("Alternative installation methods:")),console.log(ge.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ge.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ge.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ge.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function My(){let r=await un(),e=await Ya(),t=Oe[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=Oe[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await YE(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectClaude()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ae.installDocs(),await tI(),await nI()}}else if(a==="gemini"){await XE()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await QE();p.success&&(d.configAction=p.action)}n.providers.push(d)}(await Ts()).installed&&(await Oy()).success&&console.log(` ${ge.green("\u2713")} Antigravity skill installed`),(await Ka()).installed&&(await Fy()).success&&console.log(` ${ge.green("\u2713")} Codex skill installed`),await ic.saveConfig(Pe,await Ae.getInstallPath(),e.provider),await eI();for(let a of n.providers)sI(a,Oe[a.provider]);return n}async function XE(){try{let r=Z.join(Un.homedir(),".gemini","commands"),e=Z.join(r,"p.toml");await J.mkdir(r,{recursive:!0});let t=ye("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=Z.join(pe,"templates","commands","p.toml");return await P(n)?(await J.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function QE(){try{let r=Z.join(Un.homedir(),".gemini"),e=Z.join(r,"GEMINI.md");await J.mkdir(r,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=Z.join(pe,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",s=!1;try{n=await J.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await J.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
|
|
1386
1431
|
|
|
1387
|
-
${t}`;return await J.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await J.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(
|
|
1432
|
+
${t}`;return await J.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await J.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function Oy(){try{let r=Z.join(Un.homedir(),".gemini","antigravity","skills"),e=Z.join(r,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await P(t),s=ye("antigravity/SKILL.md");if(!s){let o=Z.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await J.readFile(o,"utf-8")}return await J.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function ZE(){let r=await Ts();return r.installed&&!r.skillInstalled}async function Fy(){try{let r=Z.join(Un.homedir(),".codex","skills"),e=Z.join(r,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await P(t),s=ye("codex/SKILL.md");if(!s){let o=Z.join(pe,"templates","codex","SKILL.md");if(!await P(o))return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};s=await J.readFile(o,"utf-8")}return await J.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Codex skill warning: ${w(r)}`),{success:!1,action:null}}}async function eI(){try{let r=Z.join(Un.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await J.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=R.getDoc(n,"project");if(!s)continue;s.cliVersion!==Pe&&(s.cliVersion=Pe,R.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${ge.green("\u2713")} Updated ${t} project(s) to v${Pe}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function Ry(r,e){let t={};if(await P(r))try{t=JSON.parse(await J.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await J.writeFile(r,JSON.stringify(t,null,2))}async function tI(){try{let r=Z.join(Un.homedir(),".claude"),e=Z.join(r,"settings.json"),t=Z.join(r,"prjct-statusline.sh"),n=Z.join(Un.homedir(),".prjct-cli","statusline"),s=Z.join(n,"statusline.sh"),o=Z.join(n,"themes"),i=Z.join(n,"lib"),a=Z.join(n,"components"),c=Z.join(n,"config.json"),u=Z.join(pe,"assets","statusline"),d=Z.join(u,"statusline.sh"),m=Z.join(u,"themes"),p=Z.join(u,"lib"),g=Z.join(u,"components"),f=Z.join(u,"default-config.json");if(await P(r)||await J.mkdir(r,{recursive:!0}),await P(n)||await J.mkdir(n,{recursive:!0}),await P(o)||await J.mkdir(o,{recursive:!0}),await P(i)||await J.mkdir(i,{recursive:!0}),await P(a)||await J.mkdir(a,{recursive:!0}),await P(s)){let k=await J.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let b=k.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==Pe){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`);await J.writeFile(s,D,{mode:493})}await _a(p,i),await _a(g,a),await $y(t,s),await Ry(e,t);return}}if(await P(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`),await J.writeFile(s,k,{mode:493}),await _a(p,i),await _a(g,a),await P(m)){let b=await J.readdir(m);for(let D of b){let x=Z.join(m,D),M=Z.join(o,D);await J.copyFile(x,M)}}!await P(c)&&await P(f)&&await J.copyFile(f,c)}else{let k=`#!/bin/bash
|
|
1388
1433
|
# prjct Status Line for Claude Code
|
|
1389
1434
|
CLI_VERSION="${Pe}"
|
|
1390
1435
|
input=$(cat)
|
|
@@ -1415,14 +1460,14 @@ if [ -f "$CONFIG" ]; then
|
|
|
1415
1460
|
fi
|
|
1416
1461
|
fi
|
|
1417
1462
|
echo "prjct"
|
|
1418
|
-
`;await J.writeFile(
|
|
1419
|
-
${
|
|
1420
|
-
${
|
|
1421
|
-
|
|
1422
|
-
${
|
|
1423
|
-
${
|
|
1424
|
-
${
|
|
1425
|
-
`)}function
|
|
1463
|
+
`;await J.writeFile(s,k,{mode:493})}await $y(t,s),await Ry(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function nI(){try{let r=Z.join(Un.homedir(),".claude"),e=Z.join(r,"mcp.json");await P(r)||await J.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await J.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function _a(r,e){if(!await P(r))return;let t=await J.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=Z.join(r,n),o=Z.join(e,n);await J.copyFile(s,o),await J.chmod(o,493)}}async function $y(r,e){try{if(await P(r)){if((await J.lstat(r)).isSymbolicLink()&&await J.readlink(r)===e)return;await J.unlink(r)}await J.symlink(e,r)}catch{try{await P(e)&&(await J.copyFile(e,r),await J.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function sI(r,e){if(console.log(""),r.cliInstalled?console.log(` ${ge.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ge.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${ge.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${ge.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${ge.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${ge.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${ge.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var rI,Ny=y(()=>{"use strict";jn();Ai();fe();N();mn();Te();Vn();lt();Je();Dn();ac();l(YE,"installAICLI");l(My,"run");l(XE,"installGeminiRouter");l(QE,"installGeminiGlobalConfig");l(Oy,"installAntigravitySkill");l(ZE,"needsAntigravityInstallation");l(Fy,"installCodexSkill");l(eI,"migrateProjectsCliVersion");l(Ry,"ensureStatusLineSettings");l(tI,"installStatusLine");l(nI,"installContext7MCP");l(_a,"installStatusLineModules");l($y,"ensureStatusLineSymlink");l(sI,"showResults");rI=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");rI&&My().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var Ly=Ky((Jq,oI)=>{oI.exports={name:"prjct-cli",version:"1.32.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","@linear/sdk":"^29.0.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:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var mI={};import Hy from"node:os";import Na from"node:path";import Me from"chalk";async function iI(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Yy(Ly()));await dI(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(pI(),process.exit(0)),h.start();try{let t=U.getByName(r);if(!t){let d=cI(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Kn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=uI(t,e),o=aI(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await $.getProjectId(process.cwd()),i&&(await In.expireIfStale(i),await In.touch(i))}catch{}let c=new kn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),sessions:l(()=>c.sessions(process.cwd(),{md:m,cleanup:s.cleanup===!0}),"sessions"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await In.trackCommand(i,r,d)}catch{}try{await Yn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Yn.recordTiming(i,"startup_time",p)}await Yn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Eo(t)),h.end(),process.exit(1)}}function aI(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 n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Kn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function cI(r){let e=U.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=lI(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function lI(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function uI(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function dI(r){let e=await un(),t=Na.join(Hy.homedir(),".claude","commands","p.md"),n=Na.join(Hy.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Na.join(process.cwd(),".cursor","commands","sync.md")),P(Na.join(process.cwd(),".cursor"))]),c=await Ts();if(console.log(`
|
|
1464
|
+
${Me.cyan("p/")} prjct v${r}
|
|
1465
|
+
${Me.dim("Context layer for AI coding agents")}
|
|
1466
|
+
|
|
1467
|
+
${Me.dim("Providers:")}`),e.claude.installed){let u=s?Me.green("\u2713 ready"):Me.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Me.dim(d)}`)}else console.log(` Claude Code ${Me.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Me.green("\u2713 ready"):Me.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Me.dim(d)}`)}else console.log(` Gemini CLI ${Me.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?Me.green("\u2713 ready"):Me.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${Me.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Me.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Me.green("\u2713 ready")} ${Me.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Me.yellow("\u25CF detected")} ${Me.dim("(run prjct init)")}`:` Cursor IDE ${Me.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1468
|
+
${Me.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1469
|
+
${Me.cyan("https://prjct.app")}
|
|
1470
|
+
`)}function pI(){console.log(`
|
|
1426
1471
|
prjct - Context layer for AI coding agents
|
|
1427
1472
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1428
1473
|
|
|
@@ -1481,15 +1526,15 @@ MORE INFO
|
|
|
1481
1526
|
---------
|
|
1482
1527
|
Documentation: https://prjct.app
|
|
1483
1528
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1484
|
-
`)}var
|
|
1529
|
+
`)}var Uy=y(()=>{"use strict";gd();Ks();$a();Je();qe();li();ci();N();Hr();Te();zt();l(iI,"main");l(aI,"validateCommandParams");l(cI,"findClosestCommand");l(lI,"editDistance");l(uI,"parseCommandArgs");l(dI,"displayVersion");l(pI,"displayHelp");iI().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(Eo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var br=process.argv.slice(2),Sd=br.find(r=>!r.startsWith("--")&&!r.startsWith("-")),gI=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(Sd&&!gI.has(Sd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Po(),Cd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(Cs(),bs)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<br.length;a++){let c=br[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<br.length&&!br[a+1].startsWith("--")?i[u]=br[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:Sd,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 fI(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Je(),mt)),s=(await Promise.resolve().then(()=>(qe(),Jd))).default,o=(await Promise.resolve().then(()=>(ac(),Kd))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>($c(),qp)),{fileExists:c}=await Promise.resolve().then(()=>(Te(),ue)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ba(),Od)),{VERSION:d}=await Promise.resolve().then(()=>(lt(),No));async function m(){let x=r.homedir(),M=await n();if(M.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(M.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!M.claude.installed&&!M.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(zt(),Qp));x(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(x){let M=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:G}=await Promise.resolve().then(()=>(ci(),tm));return await G.expireIfStale(F),await G.touch(F),()=>{let ee=Date.now()-M;G.trackCommand(F,x,ee).catch(()=>{}),Promise.resolve().then(()=>(li(),sm)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ee,{command:x}).catch(()=>{}),S.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:M,spawnDaemon:F}=await Promise.resolve().then(()=>(Cs(),bs));if(await M())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ee}=await Promise.resolve().then(()=>(Qh(),Xh)),S=parseInt(p.find(te=>te.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await ee({port:S,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(x==="stop"){let{isDaemonRunning:M,stopDaemon:F}=await Promise.resolve().then(()=>(Cs(),bs));if(await M()){let G=await F();console.log(G?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=G?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:M}=await Promise.resolve().then(()=>(Cs(),bs)),F=await M();if(F.running){let G=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${G}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(ny(),ty));await x()}else if(p[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(p[0]==="web"||p[0]==="serve")try{let x=process.cwd(),M=await s.getProjectId(x);if(!M)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(M,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),M=await s.getProjectId(x);if(!M)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:G}=await Promise.resolve().then(()=>(py(),dy)),ee=await G(p.slice(1),M,x);console.log(JSON.stringify(ee,null,2)),process.exitCode=ee.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:M}=await Promise.resolve().then(()=>(yy(),hy)),F=p[1]||"status",G=await M.run(process.cwd(),F);process.exitCode=G,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:M}=await Promise.resolve().then(()=>(by(),Sy)),F=await M.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(md(),Vh)),M=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),G=p.includes("--dry-run")||p.includes("-n"),ee=p.includes("--keep-package"),S=await x({force:M,backup:F,dryRun:G,keepPackage:ee});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(vy(),Cy)),G=p.includes("--verbose")||p.includes("-v"),ee=p.find(_=>_.startsWith("--debounce=")),S=ee?parseInt(ee.split("=")[1],10):void 0,j=p.find(_=>_.startsWith("--interval=")),te=j?parseInt(j.split("=")[1],10)*1e3:void 0,Ze=await F.start(x,{verbose:G,quiet:f,debounceMs:S,minIntervalMs:te});Ze.success||(console.error(Ze.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),M=await import("node:fs"),F=process.cwd(),G=await s.getProjectId(F);if(!G)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let ee=e.join(__dirname,"..","core","cli","linear.ts"),S=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),te,Ze;if(M.existsSync(ee)?(te=ee,Ze="bun"):M.existsSync(j)?(te=j,Ze="node"):M.existsSync(S)?(te=S,Ze="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,te="",Ze=""),te){let _=["--project",G,...p.slice(1)];x(Ze,[te,..._],{stdio:"inherit",cwd:F}).on("close",xo=>{process.exitCode=xo||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(Dy(),jy)),M=p[1];console.log(x(M)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),M=r.homedir(),F=process.cwd(),[G,ee,S,j,te,Ze]=await Promise.all([c(e.join(M,".claude","commands","p.md")),c(e.join(M,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
|
|
1485
1530
|
${t.cyan("p/")} prjct v${d}
|
|
1486
1531
|
${t.dim("Context layer for AI coding agents")}
|
|
1487
1532
|
|
|
1488
|
-
${t.dim("Providers:")}`),
|
|
1533
|
+
${t.dim("Providers:")}`),x.claude.installed){let _=G?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ks=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${_}${t.dim(ks)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let _=ee?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ks=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${_}${t.dim(ks)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(S){let _=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${_}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(te){let _=Ze?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${_}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
|
|
1489
1534
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1490
1535
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1491
1536
|
${t.cyan("https://prjct.app")}
|
|
1492
|
-
`)}else{let
|
|
1537
|
+
`)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),M=await m();if(!await c(x)||!M)console.log(`
|
|
1493
1538
|
${t.cyan.bold(" Welcome to prjct!")}
|
|
1494
1539
|
|
|
1495
1540
|
Run ${t.bold("prjct start")} to configure your AI providers.
|
|
@@ -1498,4 +1543,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
|
|
|
1498
1543
|
Claude Code, Gemini CLI, or both.`)}
|
|
1499
1544
|
`),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
|
|
1500
1545
|
${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
|
|
1501
|
-
`);let{default:
|
|
1546
|
+
`);let{default:G}=await Promise.resolve().then(()=>(Ny(),_y));await G.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Cs(),bs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Uy(),mI))}}}l(fI,"main");fI().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|