prjct-cli 1.25.0 → 1.27.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 +75 -1
- package/dist/bin/prjct-core.mjs +363 -646
- package/dist/cli/linear.mjs +10 -10
- package/dist/daemon/entry.mjs +322 -605
- package/dist/templates.json +1 -1
- package/package.json +3 -1
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -2,34 +2,15 @@ import { fileURLToPath as __fileURLToPath } from 'url';
|
|
|
2
2
|
import { dirname as __pathDirname } from 'path';
|
|
3
3
|
const __filename = __fileURLToPath(import.meta.url);
|
|
4
4
|
const __dirname = __pathDirname(__filename);
|
|
5
|
-
var
|
|
6
|
-
`)}function
|
|
7
|
-
`);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
|
|
8
|
-
`,"utf-8")}async function
|
|
9
|
-
`)}async function
|
|
10
|
-
`);await np(r,t)}function Rw(r){return Cs.extname(r)}function $w(r){return Cs.basename(r,Cs.extname(r))}var be=y(()=>{"use strict";tp();F();l(Wn,"readJson");l(jr,"writeJson");l(vs,"readFile");l(np,"writeFile");l(bw,"atomicWrite");l(Pw,"appendToFile");l(Ya,"appendLine");l(Cw,"prependToFile");l(T,"fileExists");l(Mo,"dirExists");l(ft,"ensureDir");l(vw,"deleteFile");l(xw,"deleteDir");l(xs,"listFiles");l(Tw,"getFileSize");l(Ew,"getFileModifiedTime");l(Aw,"copyFile");l(Iw,"moveFile");l(jw,"readLines");l(Dw,"writeLines");l(Rw,"getFileExtension");l($w,"getFileNameWithoutExtension")});var op={};pe(op,{invalidateProviderCache:()=>Fw,readProviderCache:()=>Za,writeProviderCache:()=>ec});import Oo from"node:fs/promises";import Mw from"node:os";import sp from"node:path";async function Za(){try{let r=await Oo.readFile(Qa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Ow?null:e.detection}catch{return null}}async function ec(r){let e={timestamp:new Date().toISOString(),detection:r};await Oo.mkdir(rp,{recursive:!0}),await Oo.writeFile(Qa,JSON.stringify(e,null,2))}async function Fw(){try{await Oo.unlink(Qa)}catch{}}var rp,Qa,Ow,tc=y(()=>{"use strict";rp=sp.join(Mw.homedir(),".prjct-cli","cache"),Qa=sp.join(rp,"providers.json"),Ow=600*1e3;l(Za,"readProviderCache");l(ec,"writeProviderCache");l(Fw,"invalidateProviderCache")});var at={};pe(at,{AntigravityProvider:()=>sc,ClaudeProvider:()=>Fo,CursorProvider:()=>cp,GeminiProvider:()=>nc,Providers:()=>Oe,WindsurfProvider:()=>lp,detectAllProviders:()=>dn,detectAntigravity:()=>Es,detectCursorProject:()=>dp,detectProvider:()=>_o,detectWindsurfProject:()=>pp,getActiveProvider:()=>Hw,getCommandsDir:()=>qw,getGlobalContextPath:()=>Ww,getGlobalSettingsPath:()=>Bw,getProjectCommandsPath:()=>Kw,getProviderBranding:()=>No,getSkillsPath:()=>Vw,hasProviderConfig:()=>Gw,needsCursorRouterRegeneration:()=>zw,needsWindsurfRouterRegeneration:()=>Jw,selectProvider:()=>rc,validateCliVersion:()=>up});import{exec as _w}from"node:child_process";import Ts from"node:os";import Ze from"node:path";import{promisify as Nw}from"node:util";async function Lw(r){try{let{stdout:e}=await ip(`which ${r}`,{timeout:ap});return e.trim()}catch{return null}}async function Uw(r){try{let{stdout:e}=await ip(`${r} --version`,{timeout:ap}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function _o(r){let e=Oe[r];if(!e.cliCommand)return{installed:!1};let t=await Lw(e.cliCommand);if(!t)return{installed:!1};let n=await Uw(e.cliCommand),s=up(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function up(r,e){let t=Oe[r];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 dn(r=!1){if(!r){let s=await Za();if(s)return s}let[e,t]=await Promise.all([_o("claude"),_o("gemini")]),n={claude:e,gemini:t};return await ec(n).catch(()=>{}),n}async function Hw(r){if(r&&Oe[r])return Oe[r];let e=await dn();return e.claude.installed&&!e.gemini.installed?Fo:e.gemini.installed&&!e.claude.installed?nc:Fo}async function Gw(r){let e=Oe[r];return e.configDir?T(e.configDir):!1}function No(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"}[r]||"\u26A1 prjct"}}async function dp(r){let e=Ze.join(r,".cursor"),t=Ze.join(e,"rules"),n=Ze.join(t,"prjct.mdc"),[s,o]=await Promise.all([T(e),T(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function zw(r){let e=await dp(r);return e.detected&&!e.routerInstalled}async function pp(r){let e=Ze.join(r,".windsurf"),t=Ze.join(e,"rules"),n=Ze.join(t,"prjct.md"),[s,o]=await Promise.all([T(e),T(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Jw(r){let e=await pp(r);return e.detected&&!e.routerInstalled}async function Es(){let r=sc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ze.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([T(r),T(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function Ww(r){let e=Oe[r];return e.configDir?Ze.join(e.configDir,e.contextFile):null}function Bw(r){let e=Oe[r];return!e.configDir||!e.settingsFile?null:Ze.join(e.configDir,e.settingsFile)}function Vw(r){return Oe[r].skillsDir}function qw(r){return Oe[r].commandsDir}function Kw(r,e){let t=Oe[r];return Ze.join(e,t.commandsDir)}async function rc(){let r=await dn(),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 ip,ap,Fo,nc,sc,cp,lp,Oe,ze=y(()=>{"use strict";Ir();be();tc();ip=Nw(_w),ap=2e3,Fo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ze.join(Ts.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ze.join(Ts.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0"},nc={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ze.join(Ts.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ze.join(Ts.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0"},sc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ze.join(Ts.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ze.join(Ts.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null},cp={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},lp={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},Oe={claude:Fo,gemini:nc,cursor:cp,antigravity:sc,windsurf:lp};l(Lw,"whichCommand");l(Uw,"getCliVersion");l(_o,"detectProvider");l(up,"validateCliVersion");l(dn,"detectAllProviders");l(Hw,"getActiveProvider");l(Gw,"hasProviderConfig");l(No,"getProviderBranding");l(dp,"detectCursorProject");l(zw,"needsCursorRouterRegeneration");l(pp,"detectWindsurfProject");l(Jw,"needsWindsurfRouterRegeneration");l(Es,"detectAntigravity");l(Ww,"getGlobalContextPath");l(Bw,"getGlobalSettingsPath");l(Vw,"getSkillsPath");l(qw,"getCommandsDir");l(Kw,"getProjectCommandsPath");l(rc,"selectProvider")});import{z as ye}from"zod";function Xw(r){return r instanceof As}function te(r){return Xw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Is,AI,II,jI,DI,RI,$I,As,Lo,Uo,Dr,pn=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}},AI=Is.create("FileError",ye.object({path:ye.string(),operation:ye.enum(["read","write","delete","create","copy"]),reason:ye.string().optional()})),II=Is.create("ValidationError",ye.object({field:ye.string(),expected:ye.string(),received:ye.string().optional(),message:ye.string().optional()})),jI=Is.create("PermissionError",ye.object({action:ye.string(),resource:ye.string(),reason:ye.string().optional()})),DI=Is.create("TaskError",ye.object({taskId:ye.string().optional(),operation:ye.enum(["create","update","complete","pause","resume","delete"]),reason:ye.string()})),RI=Is.create("SessionError",ye.object({sessionId:ye.string().optional(),reason:ye.string()})),$I=Is.create("SyncError",ye.object({projectId:ye.string().optional(),operation:ye.enum(["push","pull","auth","connect"]),reason:ye.string()})),As=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)}},Lo=class r extends As{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")}},Uo=class r extends As{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")}},Dr=class r extends As{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Xw,"isPrjctError");l(te,"getErrorMessage")});var W={};pe(W,{calculateDuration:()=>ok,formatDate:()=>Ho,formatDuration:()=>Rr,formatMonth:()=>Qw,getDateKey:()=>Zw,getDateRange:()=>nk,getDaysAgo:()=>xn,getDaysFromNow:()=>tk,getEndOfDay:()=>ak,getStartOfDay:()=>ik,getTimestamp:()=>b,getTodayKey:()=>Go,getYearMonthDay:()=>oc,isToday:()=>sk,isWithinLastDays:()=>rk,parseDate:()=>ek,toRelative:()=>ht});import{formatDistanceToNowStrict as Yw}from"date-fns";function Ho(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 Qw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Go(){return Ho(new Date)}function Zw(r){return Ho(r)}function oc(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function ek(r){return new Date(r)}function b(){return new Date().toISOString()}function xn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function tk(r){let e=new Date;return e.setDate(e.getDate()+r),e}function nk(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 sk(r){return Ho(r)===Go()}function rk(r,e){let t=xn(e);return r>=t}function Rr(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 ok(r,e=new Date){let t=e.getTime()-r.getTime();return Rr(t)}function ik(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function ak(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function ht(r){let e=typeof r=="string"?new Date(r):r;return Yw(e,{addSuffix:!0})}var re=y(()=>{"use strict";l(Ho,"formatDate");l(Qw,"formatMonth");l(Go,"getTodayKey");l(Zw,"getDateKey");l(oc,"getYearMonthDay");l(ek,"parseDate");l(b,"getTimestamp");l(xn,"getDaysAgo");l(tk,"getDaysFromNow");l(nk,"getDateRange");l(sk,"isToday");l(rk,"isWithinLastDays");l(Rr,"formatDuration");l(ok,"calculateDuration");l(ik,"getStartOfDay");l(ak,"getEndOfDay");l(ht,"toRelative")});var Wo={};pe(Wo,{PACKAGE_ROOT:()=>me,VERSION:()=>fe,compareVersions:()=>mp,getPackageInfo:()=>ck,getPackageRoot:()=>cc,getVersion:()=>Mr,isCompatible:()=>lk,needsMigration:()=>uk});import ic from"node:fs";import Jo from"node:path";function cc(){if($r)return $r;let r=__dirname;for(let e=0;e<5;e++){let t=Jo.join(r,"package.json");if(ic.existsSync(t))try{if(JSON.parse(ic.readFileSync(t,"utf-8")).name==="prjct-cli")return $r=r,r}catch{}r=Jo.dirname(r)}return $r=Jo.join(__dirname,"..","..",".."),$r}function Mr(){if(zo)return zo;try{let r=Jo.join(cc(),"package.json"),e=JSON.parse(ic.readFileSync(r,"utf-8"));return zo=e.version,ac=e,zo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function ck(){return ac||Mr(),ac}function mp(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 lk(r){let e=Mr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function uk(r,e=null){let t=e||Mr();return mp(r,t)<0}var zo,ac,$r,fe,me,ct=y(()=>{"use strict";F();zo=null,ac=null,$r=null;l(cc,"getPackageRoot");l(Mr,"getVersion");l(ck,"getPackageInfo");l(mp,"compareVersions");l(lk,"isCompatible");l(uk,"needsMigration");fe=Mr(),me=cc()});import{exec as dk}from"node:child_process";import{promisify as pk}from"node:util";async function Bo(r){try{let{stdout:e}=await mk(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function gk(){let r=await Bo("gh api user --jq .login");return r.success&&r.output||(r=await Bo("git config --global github.user"),r.success&&r.output)?r.output:null}async function fk(){let r=await Bo("git config user.name");return r.success&&r.output?r.output:null}async function hk(){let r=await Bo("git config user.email");return r.success&&r.output?r.output:null}async function js(){let[r,e,t]=await Promise.all([gk(),fk(),hk()]);return{github:r,email:t,name:e||r||"Unknown"}}var mk,Vo=y(()=>{"use strict";mk=pk(dk);l(Bo,"execCommand");l(gk,"detectGitHubUsername");l(fk,"detectGitName");l(hk,"detectGitEmail");l(js,"detect")});import yk from"node:crypto";import Xt from"node:fs/promises";import uc from"node:os";import U from"node:path";import{globSync as wk}from"glob";var dc,kk,P,ne=y(()=>{"use strict";re();be();dc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(uc.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return yk.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Mo(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await T(t)}async ensureGlobalStructure(){await ft(this.globalBaseDir),await ft(this.globalProjectsDir),await ft(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 ft(U.join(t,s));return await ft(U.join(t,"planning","tasks")),await ft(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=oc(t);return U.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 ft(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Xt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Xt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Xt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.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 U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Xt.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 Mo(t)}getDisplayPath(e){let t=uc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(ze(),vt(at)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(ze(),vt(at)).getActiveProvider();return(ze(),vt(at)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(uc.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.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=U.join(e,s.file);if(await T(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await T(s))try{let o=await Xt.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 Xt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
11
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await
|
|
12
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=
|
|
13
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=
|
|
14
|
-
`,"utf-8"),!0}catch(t){return L.error(`JSON write error: ${w(t)}`),!1}}function Rk(r){return P.getGlobalProjectPath(r)}function bp(r,e){let t=new jk,n=Rk(r);return t.get("/state",async s=>{let o=await Yt(yt.join(n,Mt.state));return o?s.json(o):s.json({currentTask:null,lastUpdated:""})}),t.get("/queue",async s=>{let o=await Yt(yt.join(n,Mt.queue));return o?s.json(o):s.json({tasks:[],lastUpdated:""})}),t.get("/ideas",async s=>{let o=await Yt(yt.join(n,Mt.ideas));return o?s.json(o):s.json({ideas:[],lastUpdated:""})}),t.get("/roadmap",async s=>{let o=await Yt(yt.join(n,Mt.roadmap));return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Yt(yt.join(n,Mt.shipped));return o?s.json(o):s.json({items:[],lastUpdated:""})}),t.get("/dashboard",async s=>{let[o,i,a,c,u]=await Promise.all([Yt(yt.join(n,Mt.state)),Yt(yt.join(n,Mt.queue)),Yt(yt.join(n,Mt.ideas)),Yt(yt.join(n,Mt.roadmap)),Yt(yt.join(n,Mt.shipped))]);return s.json({projectId:r,state:o||{currentTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},shipped:u||{items:[],lastUpdated:""},timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json(),i=yt.join(n,Mt.state);return await Dk(i,o)?s.json({success:!0}):s.json({success:!1,error:"Failed to write"},500)}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=yt.join(n,"context",`${o}.md`),c=await Xo.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return k(a)||L.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Mt,Pp=y(()=>{"use strict";ne();F();Vn();Mt={state:"storage/state.json",queue:"storage/queue.json",ideas:"storage/ideas.json",shipped:"storage/shipped.json",roadmap:"planning/roadmap.json"};l(Yt,"readJsonFile");l(Dk,"writeJsonFile");l(Rk,"getProjectDataPath");l(bp,"createRoutes")});import mn from"node:fs/promises";import we from"node:path";import{Hono as $k}from"hono";import*as Cp from"jsonc-parser";async function De(r){try{let e=await mn.readFile(r,"utf-8"),t=[],n=Cp.parse(e,t);return t.length>0?null:n}catch(e){if(k(e))return null;throw e}}async function Or(r,e){try{return await mn.mkdir(we.dirname(r),{recursive:!0}),await mn.writeFile(r,`${JSON.stringify(e,null,2)}
|
|
15
|
-
`,"utf-8"),!0}catch(t){if(k(t))return!1;throw t}}function Qt(r){return we.join(qn,r)}async function Yo(r){let e=we.join(Qt(r),"project.json");return await De(e)}async function yc(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 vp(){let r=new $k;return r.get("/projects",async e=>{try{await mn.mkdir(qn,{recursive:!0});let n=(await mn.readdir(qn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Qt(o),a=await Yo(o),c=await De(we.join(i,"storage/state.json")),u=await De(we.join(i,"storage/queue.json")),d=await De(we.join(i,"storage/ideas.json")),m=await De(we.join(i,"storage/shipped.json")),p=c?.currentTask,g=await yc(p?.startedAt);return{id:o,name:a?.name||o.slice(0,8),path:a?.path||null,currentTask:p?{...p,duration:g}:null,pausedTask:c?.previousTask||null,stats:{queueCount:u?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:d?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:m?.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"),n=Qt(t);try{let[s,o,i,a,c,u]=await Promise.all([Yo(t),De(we.join(n,"storage/state.json")),De(we.join(n,"storage/queue.json")),De(we.join(n,"storage/ideas.json")),De(we.join(n,"storage/shipped.json")),De(we.join(n,"planning/roadmap.json"))]);o?.currentTask?.startedAt&&(o.currentTask.duration=await yc(o.currentTask.startedAt));let d=new Date,m=new Date(d.getFullYear(),d.getMonth(),d.getDate()),p=new Date(m);p.setDate(p.getDate()-p.getDay());let g=i?.tasks?.filter(S=>!S.completed||!S.completedAt?!1:new Date(S.completedAt)>=m)?.length||0,f=i?.tasks?.filter(S=>!S.completed||!S.completedAt?!1:new Date(S.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:o||{currentTask:null,previousTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},shipped:c||{shipped:[],lastUpdated:""},roadmap:u||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:g,tasksThisWeek:f,queueCount:i?.tasks?.filter(S=>!S.completed)?.length||0,ideasCount:a?.ideas?.filter(S=>S.status==="pending")?.length||0,shippedCount:c?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id"),n=Qt(t),s=we.join(n,"storage/state.json");try{let o=await De(s);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i=o.currentTask,a={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await Or(s,a),e.json({success:!0,completedTask:i,message:`Completed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id"),n=Qt(t),s=we.join(n,"storage/state.json");try{let i=(await e.req.json().catch(()=>({}))).reason,a=await De(s);if(!a?.currentTask)return e.json({success:!1,error:"No active task"},400);let c={id:a.currentTask.id,description:a.currentTask.description,status:"paused",startedAt:a.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:i},u={currentTask:null,previousTask:c,lastUpdated:new Date().toISOString()};return await Or(s,u),e.json({success:!0,pausedTask:c,message:`Paused: ${c.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id"),n=Qt(t),s=we.join(n,"storage/state.json");try{let o=await De(s);if(!o?.previousTask)return e.json({success:!1,error:"No paused task"},400);let i={id:o.previousTask.id,description:o.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},a={currentTask:i,previousTask:null,lastUpdated:new Date().toISOString()};return await Or(s,a),e.json({success:!0,resumedTask:i,message:`Resumed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id"),n=Qt(t),s=we.join(n,"storage/state.json"),o=we.join(n,"storage/queue.json");try{let i=await e.req.json(),{taskId:a}=i;if(!a)return e.json({success:!1,error:"taskId required"},400);let c=await De(s),u=await De(o);if(c?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let d=u?.tasks?.find(g=>g.id===a);if(!d)return e.json({success:!1,error:"Task not found in queue"},404);let m={id:d.id,description:d.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:d.featureId},p={currentTask:m,previousTask:null,lastUpdated:new Date().toISOString()};return await Or(s,p),e.json({success:!0,task:m,message:`Started: ${m.description}`})}catch(i){return e.json({success:!1,error:String(i)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id"),n=Qt(t),s=we.join(n,"storage/ideas.json");try{let o=await e.req.json(),{text:i,priority:a="medium",tags:c=[]}=o;if(!i)return e.json({success:!1,error:"text required"},400);let u=await De(s)||{ideas:[],lastUpdated:""},d={id:`idea_${Date.now().toString(36)}`,text:i,status:"pending",priority:a||"medium",tags:c,addedAt:new Date().toISOString()};return u.ideas.unshift(d),u.lastUpdated=new Date().toISOString(),await Or(s,u),e.json({success:!0,idea:d,message:`Captured: ${i.slice(0,50)}...`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.get("/stats/global",async e=>{try{await mn.mkdir(qn,{recursive:!0});let n=(await mn.readdir(qn,{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=Qt(c),d=await De(we.join(u,"storage/state.json")),m=await De(we.join(u,"storage/queue.json")),p=await De(we.join(u,"storage/ideas.json")),g=await De(we.join(u,"storage/shipped.json"));d?.currentTask&&a++,s+=m?.tasks?.filter(f=>!f.completed)?.length||0,o+=p?.ideas?.filter(f=>f.status==="pending")?.length||0,i+=g?.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 mn.mkdir(qn,{recursive:!0});let s=(await mn.readdir(qn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=await Yo(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=Qt(d),p=await De(we.join(m,"storage/state.json")),g=await Yo(d);if(p?.currentTask){i={id:d,name:g?.name||d,path:g?.repoPath||g?.path},a={...p.currentTask,duration:await yc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:g?.name||d,path:g?.repoPath||g?.path},c=p.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 Mk,qn,xp=y(()=>{"use strict";ne();F();Mk=P.getGlobalBasePath(),qn=we.join(Mk,"projects");l(De,"readJsonFile");l(Or,"writeJsonFile");l(Qt,"getProjectPath");l(Yo,"getProjectConfig");l(yc,"calculateDuration");l(vp,"createExtendedRoutes")});var wc=y(()=>{"use strict"});import{streamSSE as Fk}from"hono/streaming";function Ep(){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()>Tp&&t(i)},_k),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 Fk(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)}},Nk),p=setTimeout(()=>{t(a)},Tp);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 Tp,_k,Nk,Ap=y(()=>{"use strict";wc();Tp=3600*1e3,_k=300*1e3,Nk=3e4;l(Ep,"createSSEManager")});var Ip={};pe(Ip,{DEFAULT_PORT:()=>Zo,createServer:()=>Qo,startServer:()=>Gk});import{Hono as Lk}from"hono";import{cors as Uk}from"hono/cors";import{logger as Hk}from"hono/logger";function Qo(r){let e=new Lk,t=Ep();r.enableCors!==!1&&e.use("*",Uk({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Hk()),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=bp(r.projectId,r.projectPath);e.route("/api",n);let s=vp();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(hc())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: ${hc()?"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 Gk(r,e,t=Zo){let n=Qo({port:t,projectId:r,projectPath:e});return await n.start(),n}var Zo,kc=y(()=>{"use strict";wp();Pp();xp();Ap();l(Qo,"createServer");Zo=3478;l(Gk,"startServer")});import Kn from"chalk";var jp,zk,Jk,Ot,Dp=y(()=>{"use strict";ze();jp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],zk=80,Jk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:jp,speed:zk},cli:{header:l(()=>`${Kn.cyan.bold("\u26A1")} ${Kn.cyan("prjct")}`,"header"),footer:l(()=>Kn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Kn.cyan("\u26A1")} ${Kn.cyan("prjct")} ${Kn.cyan(jp[r%10])} ${Kn.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")=>No(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>No(r).signature,"getSignature")},Ot=Jk});function $s(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 Wk[r]}var se,Sc,bc,ei,Wk,Tt,Fr,Rp,_r,Zt=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Sc=["feature","spec","design","refactor","migrate"],bc=["ship","cleanup","git","migrate"],ei=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Wk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l($s,"getTimeout");Tt={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},Fr={JSONL_MAX_LINES:1e3,ROTATION_SIZE_MB:10,LARGE_FILE_WARN_MB:50},Rp={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"}});var Ms,ti=y(()=>{"use strict";Ms={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Xn(r,e){return{...Ms[r],...e}}function Nr(r,e,t){return{message:r,hint:e,...t}}var Lr=y(()=>{"use strict";ti();ti();l(Xn,"getError");l(Nr,"createError")});var Mp={};pe(Mp,{ERRORS:()=>Ms,ICONS:()=>Tn,OUTPUT_TIERS:()=>$p,createError:()=>Nr,default:()=>h,formatForHuman:()=>Xk,getError:()=>Xn,getOutputTier:()=>Vk,getTierConfig:()=>si,isQuietMode:()=>Kk,limitLines:()=>ni,setOutputTier:()=>Bk,setQuietMode:()=>qk});import Z from"chalk";function Bk(r){Fs=r}function Vk(){return Fs}function si(){return $p[Fs]}function qk(r){st=r}function Kk(){return st}function ni(r,e){let t=e??si().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
16
|
-
`);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
|
|
17
|
-
`)}
|
|
18
|
-
${Z.dim(`...${o} more lines`)}`}function Xk(r){let e=si();if(Fs==="silent")return"";if(Fs==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(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&&Fs==="compact"&&o.push(Z.dim(String(t.url))),ni(o.join(`
|
|
19
|
-
`),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} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(Z.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
20
|
-
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?ni(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
21
|
-
`),e.maxLines):ni(JSON.stringify(r,null,2),e.maxLines)}var r0,Pc,$p,Fs,Tn,Os,Cc,st,Et,Yk,Qk,h,en=y(()=>{"use strict";Dp();Zt();Lr();Lr();r0=Ot.spinner.frames,Pc=Ot.spinner.speed,$p={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}},Fs="compact";l(Bk,"setOutputTier");l(Vk,"getOutputTier");l(si,"getTierConfig");Tn={success:Z.green("\u2713"),fail:Z.red("\u2717"),warn:Z.yellow("\u26A0"),info:Z.blue("\u2139"),debug:Z.dim("\u{1F527}"),bullet:Z.dim("\u2022"),arrow:Z.dim("\u2192"),check:Z.green("\u2713"),cross:Z.red("\u2717"),spinner:Z.cyan("\u25D0")},Os=null,Cc=0,st=!1;l(qk,"setQuietMode");l(Kk,"isQuietMode");Et=l((r,e)=>{let t=e??(si().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(ni,"limitLines");l(Xk,"formatForHuman");Yk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),Qk={start(){return st||console.log(Ot.cli.header()),this},end(){return st||console.log(Ot.cli.footer()),this},spin(r){return st?this:(this.stop(),process.stdout.isTTY?(Os=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Cc++,Et(r,Tt.SPINNER_MSG))}`)},Pc),this):(process.stdout.write(`${Ot.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
|
|
22
|
-
`),this))},done(r,e){if(this.stop(),!st){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=Z.dim(` [${n.join(" | ")}]`))}console.log(`${Tn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Tn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Xn(r):r;return console.error(),console.error(`${Tn.fail} ${e.message}`),e.file&&console.error(Z.dim(` File: ${e.file}`)),e.hint&&console.error(Z.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(Z.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),st||console.log(`${Tn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),st||console.log(`${Tn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!st&&e&&console.log(`${Tn.debug} ${Z.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),st)return this;let t=e.bullet||Tn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),st||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(Z.dim(s)),console.log(Z.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),st)return this;let t=e.split(`
|
|
23
|
-
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(Z.dim(`\u250C${s}\u2510`)),console.log(`${Z.dim("\u2502")} ${Z.bold(r.padEnd(n))} ${Z.dim("\u2502")}`),console.log(Z.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${Z.dim("\u2502")} ${o.padEnd(n)} ${Z.dim("\u2502")}`);return console.log(Z.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),st?this:(console.log(`
|
|
24
|
-
${Z.bold(r)}`),console.log(Z.dim("\u2500".repeat(r.length))),this)},stop(){return Os&&(clearInterval(Os),Os=null,Yk()),this},step(r,e,t){if(st)return this;this.stop();let n=Z.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Os=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Cc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Pc),this):(process.stdout.write(`${Ot.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
|
|
25
|
-
`),this)},progress(r,e,t){if(st)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=Z.cyan("\u2588".repeat(s))+Z.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Os=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Cc++,`[${i}] ${n}%${a}`)}`)},Pc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
26
|
-
`),this)}},h=Qk});var _p={};pe(_p,{default:()=>nS,sessionTracker:()=>En});import vc from"node:fs/promises";import Zk from"node:path";var eS,tS,Op,Fp,xc,En,nS,ri=y(()=>{"use strict";ne();F();re();eS="session.json",tS=1800*1e3,Op=50,Fp=200,xc=class{static{l(this,"SessionTracker")}getPath(e){return P.getStoragePath(e,eS)}async read(e){let t=this.getPath(e);try{let n=await vc.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(k(n)||n instanceof SyntaxError)return this.getDefault();throw n}}async write(e,t){let n=this.getPath(e);await vc.mkdir(Zk.dirname(n),{recursive:!0}),await vc.writeFile(n,JSON.stringify(t,null,2),"utf-8")}getDefault(){return{current:null,config:{idleTimeoutMs:tS}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Op&&(s.current.commands=s.current.commands.slice(-Op)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>Fp&&(s.current.files=s.current.files.slice(-Fp)),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:Rr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Rr(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}},En=new xc,nS=En});var Ft={};pe(Ft,{appendJsonLine:()=>_s,appendJsonLineWithRotation:()=>Ns,appendJsonLines:()=>oS,checkFileSizeWarning:()=>uS,countJsonLines:()=>Lp,filterJsonLines:()=>Ec,getFileSizeMB:()=>Ic,getFirstJsonLines:()=>iS,getLastJsonLines:()=>Ac,isJsonLinesEmpty:()=>cS,mergeJsonLines:()=>aS,parseJsonLines:()=>Np,readJsonLines:()=>gn,readJsonLinesStreaming:()=>lS,rotateJsonLinesIfNeeded:()=>Up,stringifyJsonLines:()=>Tc,writeJsonLines:()=>oi});import sS from"node:fs";import Qn from"node:fs/promises";import Yn from"node:path";import rS from"node:readline";function Np(r){let e=r.split(`
|
|
27
|
-
`).filter(n=>n.trim()),t=[];for(let n of e)try{t.push(JSON.parse(n))}catch{}return t}function Tc(r){return`${r.map(e=>JSON.stringify(e)).join(`
|
|
28
|
-
`)}
|
|
29
|
-
`}async function gn(r){try{let e=await Qn.readFile(r,"utf-8");return Np(e)}catch(e){if(k(e))return[];throw e}}async function oi(r,e){let t=Tc(e);await Qn.writeFile(r,t,"utf-8")}async function _s(r,e){let t=`${JSON.stringify(e)}
|
|
30
|
-
`;await Qn.appendFile(r,t,"utf-8")}async function oS(r,e){let t=Tc(e);await Qn.appendFile(r,t,"utf-8")}async function Ec(r,e){return(await gn(r)).filter(e)}async function Lp(r){try{return(await Qn.readFile(r,"utf-8")).split(`
|
|
31
|
-
`).filter(n=>n.trim()).length}catch(e){if(k(e))return 0;throw e}}async function Ac(r,e){return(await gn(r)).slice(-e)}async function iS(r,e){return(await gn(r)).slice(0,e)}async function aS(r){let e=[];for(let t of r){let n=await gn(t);e.push(...n)}return e}async function cS(r){return await Lp(r)===0}async function lS(r,e=Fr.JSONL_MAX_LINES){try{let t=sS.createReadStream(r),n=rS.createInterface({input:t,crlfDelay:1/0}),s=[];for await(let o of n)if(o.trim()){try{s.push(JSON.parse(o))}catch{}s.length>e&&s.shift()}return s}catch(t){if(k(t))return[];throw t}}async function Ic(r){try{return(await Qn.stat(r)).size/(1024*1024)}catch(e){if(k(e))return 0;throw e}}async function Up(r,e=Fr.ROTATION_SIZE_MB){let t=await Ic(r);if(t<e)return!1;let n=new Date().toISOString().split("T")[0],s=Yn.dirname(r),o=Yn.extname(r),i=Yn.basename(r,o),a=Yn.join(s,`${i}-${n}${o}`);return await Qn.rename(r,a),console.log(`\u{1F4E6} Rotated ${Yn.basename(r)} (${t.toFixed(1)}MB) \u2192 ${Yn.basename(a)}`),!0}async function Ns(r,e,t=Fr.ROTATION_SIZE_MB){await Up(r,t),await _s(r,e)}async function uS(r,e=Fr.LARGE_FILE_WARN_MB){let t=await Ic(r),n=t>e;return n&&console.warn(`\u26A0\uFE0F Large file detected: ${Yn.basename(r)} (${t.toFixed(1)}MB). Reading may use significant memory.`),{sizeMB:t,isLarge:n}}var Ur=y(()=>{"use strict";F();Zt();l(Np,"parseJsonLines");l(Tc,"stringifyJsonLines");l(gn,"readJsonLines");l(oi,"writeJsonLines");l(_s,"appendJsonLine");l(oS,"appendJsonLines");l(Ec,"filterJsonLines");l(Lp,"countJsonLines");l(Ac,"getLastJsonLines");l(iS,"getFirstJsonLines");l(aS,"mergeJsonLines");l(cS,"isJsonLinesEmpty");l(lS,"readJsonLinesStreaming");l(Ic,"getFileSizeMB");l(Up,"rotateJsonLinesIfNeeded");l(Ns,"appendJsonLineWithRotation");l(uS,"checkFileSizeWarning")});var Gp={};pe(Gp,{default:()=>Zn,performanceTracker:()=>Hp});import dS from"node:fs/promises";import pS from"node:path";var mS,ii,jc,Hp,Zn,ai=y(()=>{"use strict";re();Ur();ne();mS="performance.jsonl",ii=5,jc=class{static{l(this,"PerformanceTracker")}marks=new Map;getPath(e){return P.getStoragePath(e,mS)}async ensureDir(e){let t=this.getPath(e);await dS.mkdir(pS.dirname(t),{recursive:!0})}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}async recordTiming(e,t,n,s){await this.ensureDir(e);let o={timestamp:b(),metric:t,value:Math.round(n*100)/100,unit:"ms",context:s};await Ns(this.getPath(e),o,ii)}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}async recordMemory(e,t){await this.ensureDir(e);let n=this.snapshotMemory(),s=this.getPath(e),o=b(),i=[{timestamp:o,metric:"heap_used",value:n.heapUsed,unit:"bytes",context:t},{timestamp:o,metric:"heap_total",value:n.heapTotal,unit:"bytes",context:t},{timestamp:o,metric:"rss",value:n.rss,unit:"bytes",context:t},{timestamp:o,metric:"external_memory",value:n.external,unit:"bytes",context:t}];for(let a of i)await Ns(s,a,ii);return n}async recordContextCorrectness(e,t){await this.ensureDir(e);let n={timestamp:b(),metric:"context_correctness",...t};await Ns(this.getPath(e),n,ii)}async recordSubtaskHandoff(e,t){await this.ensureDir(e);let n={timestamp:b(),metric:"subtask_handoff",...t};await Ns(this.getPath(e),n,ii)}async getMetrics(e,t){let n=this.getPath(e);t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return Ec(n,o=>o.timestamp>=s)}async getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t);let s=await 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(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,v)=>S+v,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,v)=>S+v,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((S,v)=>S+v,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Hp=new jc,Zn=Hp});var zp=y(()=>{"use strict"});var ci,Jp=y(()=>{"use strict";ci={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 Wp=y(()=>{"use strict"});var Bp=y(()=>{"use strict";Wp()});function li(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Vp,Ls=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Vp=["frontend","backend","devops","docs","testing","database","general"];l(li,"calculateConfidence")});var Dc=y(()=>{"use strict";zp();Jp();ti();F();Bp();Ls();wc()});import Hr from"node:fs/promises";import An from"node:path";import{z as ue}from"zod";async function SS(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=An.join(e,"package.json"),s=await Hr.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 k(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 bS(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 xS(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=kS[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 PS(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=An.join(e,a);try{await Hr.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 CS(r,e){let t=Date.now();try{let n=await TS(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 vS(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=An.join(e,o.file);try{await Hr.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 qp(r,e){let t=Date.now(),n=await Promise.all([SS(r,e),bS(r,e),PS(r,e),CS(r,e),vS(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 xS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Hr.readdir(s,{withFileTypes:!0});for(let i of o){let a=An.join(s,i.name),c=An.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=An.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function TS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Hr.readdir(s,{withFileTypes:!0});for(let i of o){let a=An.join(s,i.name),c=An.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 hS,yS,wS,Rc,Y0,kS,$c=y(()=>{"use strict";F();Ir();hS=ue.enum(["draft","verified","sealed"]),yS=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),wS=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(yS),antiPatterns:ue.array(wS),analyzedAt:ue.string(),modelMetadata:Ar.optional(),status:hS.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),Y0={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},kS={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(SS,"verifyFrameworks");l(bS,"verifyLanguages");l(PS,"verifyPatternLocations");l(CS,"verifyFileCount");l(vS,"verifyAntiPatternFiles");l(qp,"semanticVerify");l(xS,"getProjectExtensions");l(TS,"countProjectFiles")});import Kp from"node:fs/promises";import Xp from"node:path";var ui,ES,Yp=y(()=>{"use strict";pn();ne();Dc();Zt();Vn();ui=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Rp.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"&&L.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(ci.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(ci.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 L.error("Event callback error:",n),n}}async logEvent(e){try{let t=P.getGlobalProjectPath(this.projectId),n=Xp.join(t,"memory","events.jsonl");await Kp.mkdir(Xp.dirname(n),{recursive:!0});let s=`${JSON.stringify(e)}
|
|
32
|
-
`;await Kp.appendFile(n,s)}catch(t){L.debug("Failed to log event:",te(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())}},ES=new ui});function pi(r,e){let t=r[0];return e==="delete"?`${t}.deleted`:`${t}.updated`}var di,Us,Qp=y(()=>{"use strict";ne();re();be();l(pi,"inferEventType");di=class{static{l(this,"SyncEventBus")}async publish(e){let t=P.getSyncPendingPath(e.projectId),n=await Wn(t,[])??[];n.push(e),await jr(t,n)}async getPending(e){let t=P.getSyncPendingPath(e);return await Wn(t,[])??[]}async clearPending(e){let t=P.getSyncPendingPath(e);await jr(t,[])}async updateLastSync(e){let t=P.getLastSyncPath(e),n={timestamp:b(),success:!0};await jr(t,n)}async getLastSync(e){let t=P.getLastSyncPath(e);return await Wn(t,null)}},Us=new di});var Mc=y(()=>{"use strict";Yp();Qp()});var _t,mi=y(()=>{"use strict";_t=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import{Database as AS}from"bun:sqlite";import Oc from"node:fs";import Zp from"node:path";var IS,gi,N,At,wt=y(()=>{"use strict";ne();IS=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
5
|
+
var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDescriptor;var Py=Object.getOwnPropertyNames;var Ty=Object.getPrototypeOf,Ey=Object.prototype.hasOwnProperty;var l=(r,e)=>fr(r,"name",{value:e,configurable:!0}),hr=(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')}),dd=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Iy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ge=(r,e)=>{for(var t in e)fr(r,t,{get:e[t],enumerable:!0})},pd=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Py(e))!Ey.call(r,s)&&s!==t&&fr(r,s,{get:()=>e[s],enumerable:!(n=xy(e,s))||n.enumerable});return r};var Ay=(r,e,t)=>(t=r!=null?vy(Ty(r)):{},pd(e||!r||!r.__esModule?fr(t,"default",{value:r,enumerable:!0}):t,r)),xt=r=>pd(fr({},"__esModule",{value:!0}),r);var md={};ge(md,{DAEMON_PATHS:()=>Ue,IDLE_TIMEOUT_MS:()=>Ea,decodeMessage:()=>jy,encodeMessage:()=>ds});function ds(r){return Buffer.from(`${JSON.stringify(r)}
|
|
6
|
+
`)}function jy(r){return JSON.parse(r.trim())}var Ue,Ea,ho=y(()=>{"use strict";Ue={runDir:l(()=>`${process.env.HOME||hr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ue.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ue.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ue.runDir()}/daemon.log`,"log")},Ea=1800*1e3;l(ds,"encodeMessage");l(jy,"decodeMessage")});var ps={};ge(ps,{executeViaDaemon:()=>$y,getDaemonStatus:()=>Ry,isDaemonRunning:()=>gd,sendRequest:()=>yr,spawnDaemon:()=>fd,stopDaemon:()=>My});import yo from"node:crypto";import Pt from"node:fs";import{connect as Dy}from"node:net";async function gd(){let r=Ue.socket();if(!Pt.existsSync(r))return!1;try{return(await yr({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Pt.unlinkSync(r)}catch{}return!1}}async function Ry(){let r=Ue.socket(),e=Ue.pid();if(!Pt.existsSync(r))return{running:!1};try{let t=await yr({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Pt.existsSync(e)?{running:!1,pid:parseInt(Pt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function yr(r){return new Promise((e,t)=>{let n=Ue.socket(),s=Dy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(ds(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
7
|
+
`);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 $y(r,e,t,n,s,o=!0){let i=Ue.socket();if(!Pt.existsSync(i))return o&&fd().catch(()=>{}),null;try{return await yr({id:yo.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function My(){try{return(await yr({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function fd(){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(Pt.existsSync(t))o=t,i="bun";else if(Pt.existsSync(n))o=n,i="node";else if(Pt.existsSync(s))o=s,i="node";else return!1;let a=Ue.runDir();Pt.mkdirSync(a,{recursive:!0});let c=Ue.log(),u=Pt.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Pt.closeSync(u),await new Promise(m=>setTimeout(m,500)),gd()}var ms=y(()=>{"use strict";ho();l(gd,"isDaemonRunning");l(Ry,"getDaemonStatus");l(yr,"sendRequest");l($y,"executeViaDaemon");l(My,"stopDaemon");l(fd,"spawnDaemon")});import{z as Kt}from"zod";function hd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var BE,VE,JE,wr,qE,Sr=y(()=>{"use strict";BE=Kt.enum(["opus","sonnet","haiku"]),VE=Kt.enum(["2.5-pro","2.5-flash","2.0-flash"]),JE=Kt.string().min(1),wr=Kt.object({provider:Kt.string(),model:Kt.string(),cliVersion:Kt.string().optional(),recordedAt:Kt.string()}),qE=Kt.object({preferredModel:Kt.string().optional(),lastAnalysisModel:wr.optional()});l(hd,"compareSemver")});function yd(r){return r instanceof Error&&"code"in r}function v(r){return yd(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function wo(r){if(r instanceof Error)return r.stack}var _=y(()=>{"use strict";l(yd,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(wo,"getErrorStack")});import kd from"node:fs/promises";async function bd(r,e){let t;try{t=await kd.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await wd(r,t),Sd(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await wd(r,t),Sd(r,Oy(s.error)),null)}async function wd(r,e){let t=`${r}.backup`;try{await kd.writeFile(t,e,"utf-8")}catch{}}function Sd(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 Oy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Cd=y(()=>{"use strict";_();l(bd,"safeRead");l(wd,"createBackup");l(Sd,"logCorruption");l(Oy,"formatZodError")});var ce={};ge(ce,{appendLine:()=>Ia,appendToFile:()=>_y,atomicWrite:()=>Fy,copyFile:()=>zy,deleteDir:()=>Hy,deleteFile:()=>Ly,dirExists:()=>So,ensureDir:()=>Mt,fileExists:()=>P,getFileExtension:()=>Jy,getFileModifiedTime:()=>Gy,getFileNameWithoutExtension:()=>qy,getFileSize:()=>Uy,listFiles:()=>hs,moveFile:()=>Wy,prependToFile:()=>Ny,readFile:()=>fs,readJson:()=>_n,readLines:()=>By,writeFile:()=>vd,writeJson:()=>kr,writeLines:()=>Vy});import ye from"node:fs/promises";import gs from"node:path";async function _n(r,e=null,t){if(t)return await bd(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function kr(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function fs(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function vd(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function Fy(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function _y(r,e){await ye.appendFile(r,e,"utf-8")}async function Ia(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
|
|
8
|
+
`,"utf-8")}async function Ny(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await ye.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function So(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Mt(r){await ye.mkdir(r,{recursive:!0})}async function Ly(r){try{return await ye.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function Hy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function hs(r,e={}){try{let n=await ye.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function Uy(r){return(await ye.stat(r)).size}async function Gy(r){return(await ye.stat(r)).mtime}async function zy(r,e){await ye.copyFile(r,e)}async function Wy(r,e){await ye.rename(r,e)}async function By(r){return(await fs(r,"")).split(`
|
|
9
|
+
`)}async function Vy(r,e){let t=e.join(`
|
|
10
|
+
`);await vd(r,t)}function Jy(r){return gs.extname(r)}function qy(r){return gs.basename(r,gs.extname(r))}var xe=y(()=>{"use strict";Cd();_();l(_n,"readJson");l(kr,"writeJson");l(fs,"readFile");l(vd,"writeFile");l(Fy,"atomicWrite");l(_y,"appendToFile");l(Ia,"appendLine");l(Ny,"prependToFile");l(P,"fileExists");l(So,"dirExists");l(Mt,"ensureDir");l(Ly,"deleteFile");l(Hy,"deleteDir");l(hs,"listFiles");l(Uy,"getFileSize");l(Gy,"getFileModifiedTime");l(zy,"copyFile");l(Wy,"moveFile");l(By,"readLines");l(Vy,"writeLines");l(Jy,"getFileExtension");l(qy,"getFileNameWithoutExtension")});var Td={};ge(Td,{invalidateProviderCache:()=>Xy,readProviderCache:()=>ja,writeProviderCache:()=>Da});import ko from"node:fs/promises";import Ky from"node:os";import xd from"node:path";async function ja(){try{let r=await ko.readFile(Aa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Yy?null:e.detection}catch{return null}}async function Da(r){let e={timestamp:new Date().toISOString(),detection:r};await ko.mkdir(Pd,{recursive:!0}),await ko.writeFile(Aa,JSON.stringify(e,null,2))}async function Xy(){try{await ko.unlink(Aa)}catch{}}var Pd,Aa,Yy,Ra=y(()=>{"use strict";Pd=xd.join(Ky.homedir(),".prjct-cli","cache"),Aa=xd.join(Pd,"providers.json"),Yy=600*1e3;l(ja,"readProviderCache");l(Da,"writeProviderCache");l(Xy,"invalidateProviderCache")});var ut={};ge(ut,{AntigravityProvider:()=>Ma,ClaudeProvider:()=>bo,CursorProvider:()=>Ad,GeminiProvider:()=>$a,Providers:()=>Fe,WindsurfProvider:()=>jd,detectAllProviders:()=>an,detectAntigravity:()=>ws,detectCursorProject:()=>Rd,detectProvider:()=>Co,detectWindsurfProject:()=>$d,getActiveProvider:()=>nw,getCommandsDir:()=>lw,getGlobalContextPath:()=>iw,getGlobalSettingsPath:()=>aw,getProjectCommandsPath:()=>uw,getProviderBranding:()=>vo,getSkillsPath:()=>cw,hasProviderConfig:()=>sw,needsCursorRouterRegeneration:()=>rw,needsWindsurfRouterRegeneration:()=>ow,selectProvider:()=>Oa,validateCliVersion:()=>Dd});import{exec as Qy}from"node:child_process";import ys from"node:os";import nt from"node:path";import{promisify as Zy}from"node:util";async function ew(r){try{let{stdout:e}=await Ed(`which ${r}`,{timeout:Id});return e.trim()}catch{return null}}async function tw(r){try{let{stdout:e}=await Ed(`${r} --version`,{timeout:Id}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Fe[r];if(!e.cliCommand)return{installed:!1};let t=await ew(e.cliCommand);if(!t)return{installed:!1};let n=await tw(e.cliCommand),s=Dd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Dd(r,e){let t=Fe[r];return!t.minCliVersion||!e?null:hd(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 an(r=!1){if(!r){let s=await ja();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Da(n).catch(()=>{}),n}async function nw(r){if(r&&Fe[r])return Fe[r];let e=await an();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?$a:bo}async function sw(r){let e=Fe[r];return e.configDir?P(e.configDir):!1}function vo(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"}[r]||"\u26A1 prjct"}}async function Rd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.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 rw(r){let e=await Rd(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.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 ow(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function ws(){let r=Ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.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}}function iw(r){let e=Fe[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function aw(r){let e=Fe[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function cw(r){return Fe[r].skillsDir}function lw(r){return Fe[r].commandsDir}function uw(r,e){let t=Fe[r];return nt.join(e,t.commandsDir)}async function Oa(){let r=await an(),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 Ed,Id,bo,$a,Ma,Ad,jd,Fe,Be=y(()=>{"use strict";Sr();xe();Ra();Ed=Zy(Qy),Id=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ys.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ys.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"},$a={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ys.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ys.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"},Ma={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ys.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ys.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},Ad={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},jd={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},Fe={claude:bo,gemini:$a,cursor:Ad,antigravity:Ma,windsurf:jd};l(ew,"whichCommand");l(tw,"getCliVersion");l(Co,"detectProvider");l(Dd,"validateCliVersion");l(an,"detectAllProviders");l(nw,"getActiveProvider");l(sw,"hasProviderConfig");l(vo,"getProviderBranding");l(Rd,"detectCursorProject");l(rw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(ow,"needsWindsurfRouterRegeneration");l(ws,"detectAntigravity");l(iw,"getGlobalContextPath");l(aw,"getGlobalSettingsPath");l(cw,"getSkillsPath");l(lw,"getCommandsDir");l(uw,"getProjectCommandsPath");l(Oa,"selectProvider")});import{z as we}from"zod";function dw(r){return r instanceof Ss}function ne(r){return dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var ks,bI,CI,vI,xI,PI,TI,Ss,xo,Po,br,cn=y(()=>{"use strict";ks={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}},bI=ks.create("FileError",we.object({path:we.string(),operation:we.enum(["read","write","delete","create","copy"]),reason:we.string().optional()})),CI=ks.create("ValidationError",we.object({field:we.string(),expected:we.string(),received:we.string().optional(),message:we.string().optional()})),vI=ks.create("PermissionError",we.object({action:we.string(),resource:we.string(),reason:we.string().optional()})),xI=ks.create("TaskError",we.object({taskId:we.string().optional(),operation:we.enum(["create","update","complete","pause","resume","delete"]),reason:we.string()})),PI=ks.create("SessionError",we.object({sessionId:we.string().optional(),reason:we.string()})),TI=ks.create("SyncError",we.object({projectId:we.string().optional(),operation:we.enum(["push","pull","auth","connect"]),reason:we.string()})),Ss=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)}},xo=class r extends Ss{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")}},Po=class r extends Ss{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")}},br=class r extends Ss{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(ne,"getErrorMessage")});var B={};ge(B,{calculateDuration:()=>kw,formatDate:()=>To,formatDuration:()=>Cr,formatMonth:()=>mw,getDateKey:()=>gw,getDateRange:()=>yw,getDaysAgo:()=>yn,getDaysFromNow:()=>hw,getEndOfDay:()=>Cw,getStartOfDay:()=>bw,getTimestamp:()=>C,getTodayKey:()=>Md,getYearMonthDay:()=>Fa,isToday:()=>ww,isWithinLastDays:()=>Sw,parseDate:()=>fw,toRelative:()=>vw});import{formatDistanceToNowStrict as pw}from"date-fns";function To(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 mw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Md(){return To(new Date)}function gw(r){return To(r)}function Fa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function fw(r){return new Date(r)}function C(){return new Date().toISOString()}function yn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function hw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function yw(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 ww(r){return To(r)===Md()}function Sw(r,e){let t=yn(e);return r>=t}function Cr(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 kw(r,e=new Date){let t=e.getTime()-r.getTime();return Cr(t)}function bw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Cw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function vw(r){let e=typeof r=="string"?new Date(r):r;return pw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(mw,"formatMonth");l(Md,"getTodayKey");l(gw,"getDateKey");l(Fa,"getYearMonthDay");l(fw,"parseDate");l(C,"getTimestamp");l(yn,"getDaysAgo");l(hw,"getDaysFromNow");l(yw,"getDateRange");l(ww,"isToday");l(Sw,"isWithinLastDays");l(Cr,"formatDuration");l(kw,"calculateDuration");l(bw,"getStartOfDay");l(Cw,"getEndOfDay");l(vw,"toRelative")});var Ao={};ge(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>fe,compareVersions:()=>Od,getPackageInfo:()=>xw,getPackageRoot:()=>La,getVersion:()=>xr,isCompatible:()=>Pw,needsMigration:()=>Tw});import _a from"node:fs";import Io from"node:path";function La(){if(vr)return vr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(_a.existsSync(t))try{if(JSON.parse(_a.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=r,r}catch{}r=Io.dirname(r)}return vr=Io.join(__dirname,"..","..",".."),vr}function xr(){if(Eo)return Eo;try{let r=Io.join(La(),"package.json"),e=JSON.parse(_a.readFileSync(r,"utf-8"));return Eo=e.version,Na=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function xw(){return Na||xr(),Na}function Od(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 Pw(r){let e=xr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Tw(r,e=null){let t=e||xr();return Od(r,t)<0}var Eo,Na,vr,fe,pe,dt=y(()=>{"use strict";_();Eo=null,Na=null,vr=null;l(La,"getPackageRoot");l(xr,"getVersion");l(xw,"getPackageInfo");l(Od,"compareVersions");l(Pw,"isCompatible");l(Tw,"needsMigration");fe=xr(),pe=La()});import{exec as Ew}from"node:child_process";import{promisify as Iw}from"node:util";async function jo(r){try{let{stdout:e}=await Aw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function jw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Rw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function bs(){let[r,e,t]=await Promise.all([jw(),Dw(),Rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Aw,Do=y(()=>{"use strict";Aw=Iw(Ew);l(jo,"execCommand");l(jw,"detectGitHubUsername");l(Dw,"detectGitName");l(Rw,"detectGitEmail");l(bs,"detect")});import $w from"node:crypto";import Yt from"node:fs/promises";import Ua from"node:os";import U from"node:path";import{globSync as Mw}from"glob";var Ga,Ow,A,Ce=y(()=>{"use strict";le();xe();Ga=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(Ua.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return $w.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await So(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Mt(this.globalBaseDir),await Mt(this.globalProjectsDir),await Mt(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 Mt(U.join(t,s));return await Mt(U.join(t,"planning","tasks")),await Mt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Fa(t);return U.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 Mt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Yt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Yt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Yt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.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 U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Yt.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 So(t)}getDisplayPath(e){let t=Ua.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ua.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.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=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Yt.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 Yt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
11
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Yt.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=U.join(e,"lerna.json");if(await P(c)){let u=await Yt.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=U.join(e,"package.json"),i=await Yt.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=Mw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Yt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.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=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},Ow=new Ga,A=Ow});var _d={};ge(_d,{default:()=>R});import Nn from"node:fs/promises";import Fw from"node:path";import*as Ro from"jsonc-parser";function Fd(r){let e=[],t=Ro.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}: ${Ro.printParseErrorCode(n.error)}`)}return t}var za,_w,R,Ve=y(()=>{"use strict";cn();_();le();dt();Do();Ce();l(Fd,"parseJsonc");za=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${ne(t)}`),null}}async writeConfig(e,t){let n=A.getLocalConfigPath(e),s=A.getLegacyPrjctPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
|
|
12
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${ne(t)}`),null}}async writeGlobalConfig(e,t){let n=A.getGlobalProjectConfigPath(e),s=A.getGlobalProjectPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
|
|
13
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:fe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=A.generateProjectId(e),s=A.getGlobalProjectPath(n),o=A.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:fe,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 A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=A.getGlobalProjectPath(s.projectId);try{return(await Nn.readdir(Fw.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:A.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 bs(),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=A.generateProjectId(e);return{projectId:n,dataPath:A.getDisplayPath(A.getGlobalProjectPath(n))}}},_w=new za,R=_w});var Ld={};ge(Ld,{default:()=>Ba});import Cs from"node:fs/promises";import Nw from"node:os";import Nd from"node:path";var Wa,Lw,Ba,Va=y(()=>{"use strict";_();Wa=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Nw.homedir(),this.configDir=Nd.join(this.homeDir,".prjct-cli","config"),this.configFile=Nd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Cs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await Cs.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 Cs.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 Cs.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 Cs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Cs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Lw=new Wa,Ba=Lw});function Hw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Pr(){return Hw()==="bun"}var Ja=y(()=>{"use strict";l(Hw,"detectRuntime");l(Pr,"isBun")});import qa from"node:fs";import Hd from"node:path";function Uw(r){if(Pr()){let{Database:s}=hr("bun:sqlite");return new s(r,{create:!0})}let e=hr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Gw,$o,$,V,he=y(()=>{"use strict";Ce();Ja();l(Uw,"openDatabase");Gw=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
33
14
|
-- =======================================================================
|
|
34
15
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
35
16
|
-- =======================================================================
|
|
@@ -260,14 +241,13 @@ ${Z.bold(r)}`),console.log(Z.dim("\u2500".repeat(r.length))),this)},stop(){retur
|
|
|
260
241
|
CREATE INDEX idx_archives_entity_type ON archives(entity_type);
|
|
261
242
|
CREATE INDEX idx_archives_archived_at ON archives(archived_at);
|
|
262
243
|
CREATE INDEX idx_archives_entity_id ON archives(entity_id);
|
|
263
|
-
`)},"up")}]
|
|
244
|
+
`)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Hd.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Hd.dirname(n);qa.existsSync(s)||qa.mkdirSync(s,{recursive:!0});let o=Uw(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 qa.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(`
|
|
264
245
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
265
246
|
version INTEGER PRIMARY KEY,
|
|
266
247
|
name TEXT NOT NULL,
|
|
267
248
|
applied_at TEXT NOT NULL
|
|
268
249
|
)
|
|
269
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of IS)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}},N=new gi,At=N});import em from"node:fs/promises";import jS from"node:path";var Ue,tn=y(()=>{"use strict";Mc();ne();mi();re();wt();Ue=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new _t({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}getContextPath(e,t){let n=this.getLayer();return P.getFilePath(e,n,t)}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=N.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){let n=this.getContextPath(e,this.getMdFilename());await em.mkdir(jS.dirname(n),{recursive:!0}),N.setDoc(e,this.getStoreKey(),t);let s=this.toMarkdown(t);await em.writeFile(n,s,"utf-8"),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await Us.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return N.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as DS}from"node:crypto";var Fc,nn,fi=y(()=>{"use strict";$c();re();tn();Fc=class extends Ue{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getMdFilename(){return"analysis.md"}getLayer(){return"analysis"}getEventType(e){return`analysis.${e}d`}toMarkdown(e){let t=["# Analysis Status",""];return e.sealed&&(t.push("## Sealed Analysis"),t.push("- **Status**: sealed"),t.push(`- **Commit**: \`${e.sealed.commitHash||"unknown"}\``),t.push(`- **Sealed at**: ${e.sealed.sealedAt||"unknown"}`),t.push(`- **Languages**: ${e.sealed.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.sealed.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.sealed.fileCount}`),e.sealed.patterns.length>0&&t.push(`- **Patterns**: ${e.sealed.patterns.map(n=>n.name).join(", ")}`),t.push("")),e.draft&&e.draft.status==="draft"&&(t.push("## Draft Analysis"),t.push("- **Status**: draft (not yet sealed)"),t.push(`- **Commit**: \`${e.draft.commitHash||"unknown"}\``),t.push(`- **Analyzed at**: ${e.draft.analyzedAt}`),t.push(`- **Languages**: ${e.draft.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.draft.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.draft.fileCount}`),t.push("")),!e.sealed&&!e.draft&&(t.push("_No analysis available. Run `p. sync` to generate._"),t.push("")),t.join(`
|
|
270
|
-
`)}async saveDraft(e,t){let n={...t,status:"draft"};Rc.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Rc.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 qp(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 DS("sha256").update(JSON.stringify(t)).digest("hex")}},nn=new Fc});var tm=y(()=>{"use strict"});import{z as Re}from"zod";var hi,In,RS,GD,_c,nm,Gr=y(()=>{"use strict";hi=Re.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),In=Re.object({primaryDomain:hi,secondaryDomains:Re.array(hi),confidence:Re.number().min(0).max(1),filePatterns:Re.array(Re.string()),relevantAgents:Re.array(Re.string())}),RS=Re.object({classification:In,classifiedAt:Re.string(),source:Re.enum(["cache","history","llm","heuristic"]),descriptionHash:Re.string(),projectId:Re.string()}),GD=Re.object({entries:Re.record(Re.string(),RS),confirmedPatterns:Re.array(Re.object({descriptionHash:Re.string(),classification:In,confirmedAt:Re.string(),taskDescription:Re.string()}))}),_c={entries:{},confirmedPatterns:[]},nm={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as H}from"zod";var $S,MS,sm,OS,FS,_S,NS,LS,rm,WD,Nc=y(()=>{"use strict";$S=H.enum(["low","medium","high"]),MS=H.enum(["pending","converted","completed","archived","dormant"]),sm=H.enum(["high","medium","low"]),OS=H.object({impact:sm,effort:sm}),FS=H.object({frontend:H.string().optional(),backend:H.string().optional(),payments:H.string().optional(),ai:H.string().optional(),deploy:H.string().optional(),other:H.array(H.string()).optional()}),_S=H.object({name:H.string(),description:H.string()}),NS=H.object({name:H.string(),description:H.string().optional()}),LS=H.object({id:H.string(),text:H.string(),details:H.string().optional(),priority:$S,status:MS,tags:H.array(H.string()),addedAt:H.string(),completedAt:H.string().optional(),convertedTo:H.string().optional(),source:H.string().optional(),sourceFiles:H.array(H.string()).optional(),painPoints:H.array(H.string()).optional(),solutions:H.array(H.string()).optional(),filesAffected:H.array(H.string()).optional(),impactEffort:OS.optional(),implementationNotes:H.string().optional(),stack:FS.optional(),modules:H.array(_S).optional(),roles:H.array(NS).optional(),risks:H.array(H.string()).optional(),risksCount:H.number().optional()}),rm=H.object({ideas:H.array(LS),lastUpdated:H.string()}),WD={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as q}from"zod";function im(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var om,US,HS,GS,zS,KD,XD,Lc=y(()=>{"use strict";om=q.enum(["linear","jira","github","monday","asana","none"]),US=q.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),HS=q.enum(["none","urgent","high","medium","low"]),GS=q.enum(["feature","bug","improvement","task","chore","epic"]),zS=q.object({id:q.string(),identifier:q.string(),title:q.string(),description:q.string().optional(),status:US,priority:HS,type:GS.optional(),assignee:q.object({id:q.string(),name:q.string(),email:q.string().optional()}).optional(),labels:q.array(q.string()).default([]),team:q.object({id:q.string(),name:q.string(),key:q.string().optional()}).optional(),project:q.object({id:q.string(),name:q.string()}).optional(),url:q.string(),createdAt:q.string(),updatedAt:q.string(),fetchedAt:q.string()}),KD=q.object({provider:om,lastSync:q.string(),staleAfter:q.number().default(18e5),issues:q.record(q.string(),zS)}),XD=q.object({provider:om,fetched:q.number(),updated:q.number(),errors:q.array(q.object({issueId:q.string(),error:q.string()})),timestamp:q.string()});l(im,"createEmptyIssues")});var dm={};pe(dm,{AgentAssignmentSchema:()=>am,OUTPUT_SCHEMAS:()=>lm,SubtaskBreakdownSchema:()=>cm,TaskClassificationSchema:()=>In,renderSchemaForPrompt:()=>Uc});import{z as Je}from"zod";function Uc(r){let e=lm[r];return e?`## OUTPUT FORMAT
|
|
250
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Gw)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}},$=new $o,V=$});var Ud=y(()=>{"use strict"});import Tr from"node:fs/promises";import wn from"node:path";import{z as ue}from"zod";async function Jw(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=wn.join(e,"package.json"),s=await Tr.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 qw(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 Qw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Vw[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 Kw(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=wn.join(e,a);try{await Tr.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 Yw(r,e){let t=Date.now();try{let n=await Zw(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 Xw(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=wn.join(e,o.file);try{await Tr.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 Gd(r,e){let t=Date.now(),n=await Promise.all([Jw(r,e),qw(r,e),Kw(r,e),Yw(r,e),Xw(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 Qw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=wn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Zw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.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 zw,Ww,Bw,Ka,wA,Vw,Ya=y(()=>{"use strict";_();Sr();zw=ue.enum(["draft","verified","sealed"]),Ww=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Bw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ka=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(Ww),antiPatterns:ue.array(Bw),analyzedAt:ue.string(),modelMetadata:wr.optional(),status:zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),wA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Vw={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(Jw,"verifyFrameworks");l(qw,"verifyLanguages");l(Kw,"verifyPatternLocations");l(Yw,"verifyFileCount");l(Xw,"verifyAntiPatternFiles");l(Gd,"semanticVerify");l(Qw,"getProjectExtensions");l(Zw,"countProjectFiles")});import{z as Me}from"zod";var Mo,Sn,eS,CA,Xa,zd,Er=y(()=>{"use strict";Mo=Me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Sn=Me.object({primaryDomain:Mo,secondaryDomains:Me.array(Mo),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),eS=Me.object({classification:Sn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),CA=Me.object({entries:Me.record(Me.string(),eS),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Sn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Xa={entries:{},confirmedPatterns:[]},zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var tS,nS,Wd,sS,rS,oS,iS,aS,Bd,PA,Qa=y(()=>{"use strict";tS=z.enum(["low","medium","high"]),nS=z.enum(["pending","converted","completed","archived","dormant"]),Wd=z.enum(["high","medium","low"]),sS=z.object({impact:Wd,effort:Wd}),rS=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),oS=z.object({name:z.string(),description:z.string()}),iS=z.object({name:z.string(),description:z.string().optional()}),aS=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:tS,status:nS,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:sS.optional(),implementationNotes:z.string().optional(),stack:rS.optional(),modules:z.array(oS).optional(),roles:z.array(iS).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Bd=z.object({ideas:z.array(aS),lastUpdated:z.string()}),PA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Jd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Vd,cS,lS,uS,dS,AA,jA,Za=y(()=>{"use strict";Vd=Y.enum(["linear","jira","github","monday","asana","none"]),cS=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),lS=Y.enum(["none","urgent","high","medium","low"]),uS=Y.enum(["feature","bug","improvement","task","chore","epic"]),dS=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:cS,priority:lS,type:uS.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()}),AA=Y.object({provider:Vd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),dS)}),jA=Y.object({provider:Vd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Jd,"createEmptyIssues")});var Qd={};ge(Qd,{AgentAssignmentSchema:()=>qd,OUTPUT_SCHEMAS:()=>Yd,SubtaskBreakdownSchema:()=>Kd,TaskClassificationSchema:()=>Sn,renderSchemaForPrompt:()=>ec});import{z as Je}from"zod";function ec(r){let e=Yd[r];return e?`## OUTPUT FORMAT
|
|
271
251
|
|
|
272
252
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
273
253
|
|
|
@@ -276,11 +256,51 @@ ${e.example}
|
|
|
276
256
|
\`\`\`
|
|
277
257
|
|
|
278
258
|
Fields:
|
|
279
|
-
${
|
|
280
|
-
`)}return"(see example above)"}function um(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${um(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var am,cm,lm,yi=y(()=>{"use strict";Gr();Gr();am=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),cm=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:hi,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),lm={classification:{schema:In,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:am,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:cm,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(Uc,"renderSchemaForPrompt");l(JS,"describeSchema");l(um,"describeField")});import{z as I}from"zod";var pm,WS,BS,mm,VS,qS,KS,XS,YS,QS,ZS,gm,eb,tb,rR,fm,hm,ym,wm,nb,wi,Hc=y(()=>{"use strict";pm=I.number().min(1).max(5),WS=I.enum(["exceeded","met","partial","failed"]),BS=I.enum(["definitely","probably","maybe","no"]),mm=I.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),VS=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:mm.optional(),explanation:I.string().optional()})}),qS=I.object({name:I.string(),baseline:I.number().nullable(),target:I.number(),actual:I.number(),unit:I.string(),achieved:I.boolean(),percentOfTarget:I.number()}),KS=I.object({criteria:I.string(),met:I.boolean(),notes:I.string().optional()}),XS=I.object({metrics:I.array(qS),acceptanceCriteria:I.array(KS),overallSuccess:WS,successScore:I.number().min(0).max(100)}),YS=I.object({category:I.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:I.string(),actionable:I.boolean(),action:I.string().optional()}),QS=I.object({whatWorked:I.array(I.string()),whatDidnt:I.array(I.string()),surprises:I.array(I.string()),recommendations:I.array(YS)}),ZS=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:BS,worthItReason:I.string().optional(),alternativeConsidered:I.string().optional(),betterAlternativeExists:I.boolean().optional()}),gm=I.object({id:I.string(),taskId:I.string(),description:I.string(),estimatedMinutes:I.number().optional(),actualMinutes:I.number(),completedAsPlanned:I.boolean(),qualityScore:pm,blockers:I.array(I.string()),agentUsed:I.string().optional(),skillsUsed:I.array(I.string()).optional(),startedAt:I.string(),completedAt:I.string()}),eb=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:VS,success:XS.optional(),learnings:QS,roi:ZS,rating:pm,taskOutcomes:I.array(gm).optional(),startedAt:I.string(),shippedAt:I.string(),reviewedAt:I.string().optional(),reviewedBy:I.string().optional(),legacy:I.boolean().optional()}),tb=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:mm,count:I.number(),averageVariance:I.number()})),topLearnings:I.array(I.object({insight:I.string(),frequency:I.number()}))}),rR=I.object({outcomes:I.array(eb),taskOutcomes:I.array(gm).optional(),aggregates:tb.optional(),lastUpdated:I.string(),lastAggregated:I.string().optional()}),fm={outcomes:[],taskOutcomes:[],lastUpdated:""},hm=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"),ym=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),wm=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),nb=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),wi=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=>nb(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 He}from"zod";function cb(){let r={};for(let e of ob)r[e]="allow";for(let e of ib)r[e]="ask";for(let e of ab)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var ki,cR,sb,Gc,rb,lR,ob,ib,ab,uR,km=y(()=>{"use strict";ki=He.enum(["allow","deny","ask"]),cR=He.enum(["read","write","delete","create"]),sb=He.record(He.string(),ki),Gc=He.record(He.string(),ki),rb=He.object({enabled:He.boolean().default(!0),allowedDomains:He.array(He.string()).optional(),blockedDomains:He.array(He.string()).optional()}),lR=He.object({bash:sb.optional(),files:He.object({read:Gc.optional(),write:Gc.optional(),delete:Gc.optional()}).optional(),web:rb.optional(),skills:He.record(He.string(),ki).optional(),doomLoop:He.object({enabled:He.boolean().default(!0),maxRetries:He.number().default(3)}).optional(),externalDirectories:ki.default("ask")}),ob=["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*"],ib=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],ab=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(cb,"buildDefaultPermissions");uR=cb()});import{z as rt}from"zod";var gR,fR,Sm=y(()=>{"use strict";gR=rt.object({projectId:rt.string(),name:rt.string(),repoPath:rt.string(),description:rt.string().optional(),version:rt.string().optional(),cliVersion:rt.string().optional(),techStack:rt.array(rt.string()),fileCount:rt.number(),commitCount:rt.number(),createdAt:rt.string(),lastSync:rt.string(),lastSyncCommit:rt.string().optional(),lastSyncBranch:rt.string().optional()}),fR={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as j}from"zod";var lb,ub,db,pb,mb,gb,fb,hb,yb,wb,kb,Sb,bb,Pb,Cb,vb,xb,Tb,kR,SR,bm=y(()=>{"use strict";lb=j.enum(["planned","active","completed","shipped"]),ub=j.enum(["low","medium","high"]),db=j.enum(["feature","breaking_change","refactor","infrastructure"]),pb=j.enum(["completed","active","planned"]),mb=j.enum(["planned","active","completed"]),gb=j.enum(["git","git-branch","manual","prd"]),fb=j.object({id:j.string(),description:j.string(),completed:j.boolean(),completedAt:j.string().optional()}),hb=j.object({id:j.string(),name:j.string(),status:pb,completedAt:j.string().optional()}),yb=j.object({goal:j.string(),phases:j.array(hb),successMetrics:j.array(j.string()).optional()}),wb=j.object({hours:j.number(),minutes:j.number(),totalMinutes:j.number(),display:j.string().optional()}),kb=j.object({hash:j.string(),message:j.string(),date:j.string(),author:j.string().optional()}),Sb=j.object({hours:j.number(),confidence:j.enum(["low","medium","high"]).optional(),breakdown:j.array(j.object({area:j.string(),hours:j.number()})).optional()}),bb=j.object({hours:j.number().optional(),commits:j.number().optional(),linesAdded:j.number().optional(),linesRemoved:j.number().optional()}),Pb=j.object({estimated:Sb.nullable(),actual:bb.nullable()}),Cb=j.object({totalHours:j.number(),allocatedHours:j.number(),bufferPercent:j.number().optional()}),vb=j.object({id:j.string(),name:j.string(),theme:j.string().optional(),goals:j.array(j.string()).optional(),features:j.array(j.string()),capacity:Cb.optional(),status:mb,startDate:j.string().optional(),endDate:j.string().optional()}),xb=j.object({id:j.string(),name:j.string(),description:j.string().optional(),date:j.string(),status:lb,impact:ub,effort:j.string().optional(),progress:j.number(),type:db.optional(),roi:j.number().optional(),why:j.array(j.string()).optional(),technicalNotes:j.array(j.string()).optional(),compatibility:j.string().optional(),phase:j.string().optional(),tasks:j.array(fb),createdAt:j.string(),shippedAt:j.string().optional(),version:j.string().optional(),duration:wb.optional(),taskCount:j.number().optional(),agent:j.string().optional(),sprintName:j.string().optional(),completedDate:j.string().optional(),prdId:j.string().nullable().optional(),legacy:j.boolean().optional(),inferredFrom:gb.optional(),quarter:j.string().nullable().optional(),dependencies:j.array(j.string()).optional(),blockedBy:j.array(j.string()).optional(),effortTracking:Pb.optional(),valueScore:j.number().optional(),commits:j.array(kb).optional(),branch:j.string().optional(),commitsAhead:j.number().optional()}),Tb=j.object({id:j.string(),title:j.string(),prdId:j.string().nullable().optional(),valueScore:j.number().optional(),effortEstimate:j.number().optional(),reason:j.string().optional()}),kR=j.object({strategy:yb.nullable().optional(),features:j.array(xb),backlog:j.array(j.union([j.string(),Tb])),lastUpdated:j.string(),quarters:j.array(vb).optional(),generatedFrom:j.enum(["git-history","manual","prd"]).optional(),generatedAt:j.string().optional()}),SR={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 Eb from"node:crypto";import{homedir as Ab}from"node:os";import{join as Ib}from"node:path";function ke(){return Eb.randomUUID()}var jb,Pm=y(()=>{"use strict";l(ke,"generateUUID");jb=Ib(Ab(),".prjct-cli","projects")});import{z as X}from"zod";var Db,Cm,Rb,$b,Mb,Ob,Fb,_b,Nb,vm,zc=y(()=>{"use strict";Db=X.enum(["feature","fix","improvement","refactor"]),Cm=X.enum(["pass","warning","fail","skipped"]),Rb=X.enum(["added","changed","fixed","removed"]),$b=X.object({hours:X.number(),minutes:X.number(),totalMinutes:X.number()}),Mb=X.object({filesChanged:X.number().nullable().optional(),linesAdded:X.number().nullable().optional(),linesRemoved:X.number().nullable().optional(),commits:X.number().nullable().optional()}),Ob=X.object({description:X.string(),type:Rb.optional()}),Fb=X.object({lintStatus:Cm.nullable().optional(),lintDetails:X.string().optional(),testStatus:Cm.nullable().optional(),testDetails:X.string().optional()}),_b=X.object({hash:X.string().optional(),message:X.string().optional(),branch:X.string().optional()}),Nb=X.object({id:X.string(),name:X.string(),version:X.string().nullable().optional(),type:Db,agent:X.string().optional(),description:X.string().optional(),changes:X.array(Ob).optional(),codeSnippets:X.array(X.string()).optional(),commit:_b.optional(),codeMetrics:Mb.optional(),qualityMetrics:Fb.optional(),quantitativeImpact:X.string().optional(),duration:$b.optional(),tasksCompleted:X.number().nullable().optional(),shippedAt:X.string(),featureId:X.string().optional()}),vm=X.object({shipped:X.array(Nb),lastUpdated:X.string()})});import{z as A}from"zod";var Lb,Tm,Ub,Hb,Gb,Jc,Em,zb,Jb,Am,xm,Wb,Bb,Im,jm,Dm,Vb,qb,$R,Si=y(()=>{"use strict";Ir();Lb=A.enum(["low","medium","high","critical"]),Tm=A.enum(["feature","bug","improvement","chore"]),Ub=A.enum(["active","backlog","previously_active"]),Hb=A.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Gb=A.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Jc=A.object({title:A.string(),description:A.string(),filesChanged:A.array(A.object({path:A.string(),action:A.enum(["created","modified","deleted"])})),whatWasDone:A.array(A.string()).min(1),outputForNextAgent:A.string().min(1),notes:A.string().optional()}),Em=A.object({output:A.string().min(1,"Subtask output is required"),summary:Jc}),zb=A.object({id:A.string(),description:A.string(),domain:A.string(),agent:A.string(),status:Hb,dependsOn:A.array(A.string()),startedAt:A.string().optional(),completedAt:A.string().optional(),output:A.string().optional(),summary:Jc.optional(),skipReason:A.string().optional(),blockReason:A.string().optional(),estimatedPoints:A.number().optional(),estimatedMinutes:A.number().optional()}),Jb=A.object({completed:A.number(),total:A.number(),percentage:A.number()}),Am=A.object({id:A.string(),description:A.string(),startedAt:A.string(),sessionId:A.string(),featureId:A.string().optional(),subtasks:A.array(zb).optional(),currentSubtaskIndex:A.number().optional(),subtaskProgress:Jb.optional(),linearId:A.string().optional(),linearUuid:A.string().optional(),estimatedPoints:A.number().optional(),estimatedMinutes:A.number().optional(),modelMetadata:Ar.optional()}),xm=A.object({id:A.string(),description:A.string(),status:A.literal("paused"),startedAt:A.string(),pausedAt:A.string(),pauseReason:A.string().optional()}),Wb=A.object({stackConfirmed:A.array(A.string()).optional(),patternsDiscovered:A.array(A.string()).optional(),agentAccuracy:A.array(A.object({agent:A.string(),rating:A.enum(["helpful","neutral","inaccurate"]),note:A.string().optional()})).optional(),issuesEncountered:A.array(A.string()).optional()}),Bb=A.object({taskId:A.string(),title:A.string(),classification:Tm,startedAt:A.string(),completedAt:A.string(),subtaskCount:A.number(),subtaskSummaries:A.array(Jc),outcome:A.string(),branchName:A.string(),linearId:A.string().optional(),linearUuid:A.string().optional(),prUrl:A.string().optional(),feedback:Wb.optional()}),Im=A.object({currentTask:Am.nullable(),previousTask:xm.nullable().optional(),pausedTasks:A.array(xm).optional(),taskHistory:A.array(Bb).optional(),lastUpdated:A.string()}),jm=A.object({id:A.string(),description:A.string(),priority:Lb,type:Tm,featureId:A.string().optional(),originFeature:A.string().optional(),completed:A.boolean(),completedAt:A.string().optional(),createdAt:A.string(),section:Ub,agent:A.string().optional(),groupName:A.string().optional(),groupId:A.string().optional()}),Dm=A.object({tasks:A.array(jm),lastUpdated:A.string()}),Vb=A.object({tasksToday:A.number(),tasksThisWeek:A.number(),streak:A.number(),velocity:A.string(),avgDuration:A.string()}),qb=A.object({type:Gb,description:A.string(),timestamp:A.string(),duration:A.string().optional()}),$R=A.object({projectId:A.string(),currentTask:Am.nullable(),queue:A.array(jm),stats:Vb,recentActivity:A.array(qb),lastSync:A.string()})});import{z as ae}from"zod";var Kb,Xb,Rm,_R,NR,LR,jn,$m,Hs=y(()=>{"use strict";Kb=ae.enum(["improving","stable","declining"]),Xb=ae.object({sprintNumber:ae.number(),startDate:ae.string(),endDate:ae.string(),pointsCompleted:ae.number(),tasksCompleted:ae.number(),avgVariance:ae.number(),estimationAccuracy:ae.number()}),Rm=ae.object({category:ae.string(),avgVariance:ae.number(),taskCount:ae.number()}),_R=ae.object({totalPoints:ae.number(),sprints:ae.number(),estimatedDate:ae.string()}),NR=ae.object({sprints:ae.array(Xb),averageVelocity:ae.number(),velocityTrend:Kb,estimationAccuracy:ae.number(),overEstimated:ae.array(Rm),underEstimated:ae.array(Rm),lastUpdated:ae.string()}),LR=ae.object({sprintLengthDays:ae.number().min(1).max(90).default(7),startDay:ae.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ae.number().min(1).max(52).default(6),accuracyTolerance:ae.number().min(0).max(100).default(20)}),jn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},$m={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Nt=y(()=>{"use strict";tm();$c();Gr();Nc();Lc();yi();Ir();Hc();km();Sm();bm();Pm();zc();Si();Hs()});var Lt,Wc,kt,Dn=y(()=>{"use strict";Nt();re();wt();Lt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Wc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ke(),s=b();return N.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=b();return N.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(ke(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?N.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):N.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=N.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=N.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(N.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);N.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return N.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new Wc});var Bc,Ut,bi=y(()=>{"use strict";Nt();Nc();re();Dn();tn();Bc=class extends Ue{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",rm)}getDefault(){return{ideas:[],lastUpdated:""}}getMdFilename(){return"ideas.md"}getLayer(){return"planning"}getEventType(e){return`ideas.${e}d`}toMarkdown(e){let t=["# IDEAS \u{1F4A1}",""],n=e.ideas.filter(a=>a.status==="pending"),s=e.ideas.filter(a=>a.status==="converted"),o=e.ideas.filter(a=>a.status==="archived"),i=e.ideas.filter(a=>a.status==="dormant");return t.push("## Brain Dump"),n.length>0?n.forEach(a=>{let c=ht(a.addedAt),u=a.tags.length>0?` ${a.tags.map(m=>`#${m}`).join(" ")}`:"",d=a.priority!=="medium"?` [${a.priority.toUpperCase()}]`:"";t.push(`- ${a.text}${d} _(${c})_${u}`)}):t.push("_No pending ideas_"),t.push(""),s.length>0&&(t.push("## Converted"),s.forEach(a=>{let c=ht(a.addedAt),u=a.convertedTo?` \u2192 ${a.convertedTo}`:"";t.push(`- \u2713 ${a.text}${u} _(${c})_`)}),t.push("")),o.length>0&&(t.push("## Archived"),o.forEach(a=>{let c=ht(a.addedAt);t.push(`- ${a.text} _(${c})_`)}),t.push("")),i.length>0&&(t.push(`_${i.length} dormant idea(s) excluded from context_`),t.push("")),t.join(`
|
|
281
|
-
|
|
282
|
-
`);if(t.push("## \u{1F4B0} Token Savings"),t.push(""),t.push(`- **Total saved**: ${this.formatTokens(e.totalTokensSaved)} tokens`),t.push(`- **Compression**: ${(e.avgCompressionRate*100).toFixed(0)}% average reduction`),t.push(`- **Estimated cost saved**: ${Gs(qc(e.totalTokensSaved))}`),t.push(""),t.push("## \u26A1 Performance"),t.push(""),t.push(`- **Syncs completed**: ${e.syncCount.toLocaleString()}`),t.push(`- **Avg sync time**: ${this.formatDuration(e.avgSyncDuration)}`),e.watchTriggers>0&&t.push(`- **Watch triggers**: ${e.watchTriggers.toLocaleString()} auto-syncs`),t.push(""),e.agentUsage.length>0){t.push("## \u{1F916} Agent Usage"),t.push("");let n=[...e.agentUsage].sort((o,i)=>i.usageCount-o.usageCount),s=n.reduce((o,i)=>o+i.usageCount,0);n.slice(0,5).forEach(o=>{let i=s>0?(o.usageCount/s*100).toFixed(0):0;t.push(`- **${o.agentName}**: ${i}% (${o.usageCount} uses)`)}),t.push("")}if(e.dailyStats.length>0){t.push("## \u{1F4C8} 30-Day Trend"),t.push("");let n=this.getLast30Days(e.dailyStats),s=n.reduce((o,i)=>o+i.tokensSaved,0);t.push(`- **Tokens saved**: ${this.formatTokens(s)}`),t.push(`- **Syncs**: ${n.reduce((o,i)=>o+i.syncs,0)}`),t.push(""),t.push("```"),t.push(this.generateSparkline(n)),t.push("```"),t.push("")}return t.push("---"),t.push(""),e.firstSync&&t.push(`_Tracking since ${new Date(e.firstSync).toLocaleDateString()}_`),t.push(""),t.join(`
|
|
283
|
-
`)
|
|
259
|
+
${pS(e.schema)}`:null}function pS(r){if(r instanceof Je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Xd(n)}`).join(`
|
|
260
|
+
`)}return"(see example above)"}function Xd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Xd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var qd,Kd,Yd,Oo=y(()=>{"use strict";Er();Er();qd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Kd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),Yd={classification:{schema:Sn,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:Kd,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(ec,"renderSchemaForPrompt");l(pS,"describeSchema");l(Xd,"describeField")});import{z as E}from"zod";var Zd,mS,gS,ep,fS,hS,yS,wS,SS,kS,bS,tp,CS,vS,NA,np,sp,rp,op,xS,Fo,tc=y(()=>{"use strict";Zd=E.number().min(1).max(5),mS=E.enum(["exceeded","met","partial","failed"]),gS=E.enum(["definitely","probably","maybe","no"]),ep=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),fS=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:ep.optional(),explanation:E.string().optional()})}),hS=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),yS=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),wS=E.object({metrics:E.array(hS),acceptanceCriteria:E.array(yS),overallSuccess:mS,successScore:E.number().min(0).max(100)}),SS=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),kS=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(SS)}),bS=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:gS,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),tp=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Zd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),CS=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:fS,success:wS.optional(),learnings:kS,roi:bS,rating:Zd,taskOutcomes:E.array(tp).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),vS=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:ep,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),NA=E.object({outcomes:E.array(CS),taskOutcomes:E.array(tp).optional(),aggregates:vS.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),np={outcomes:[],taskOutcomes:[],lastUpdated:""},sp=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"),rp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),op=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),xS=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=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=>xS(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 Ge}from"zod";function jS(){let r={};for(let e of ES)r[e]="allow";for(let e of IS)r[e]="ask";for(let e of AS)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,GA,PS,nc,TS,zA,ES,IS,AS,WA,ip=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),GA=Ge.enum(["read","write","delete","create"]),PS=Ge.record(Ge.string(),_o),nc=Ge.record(Ge.string(),_o),TS=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),zA=Ge.object({bash:PS.optional(),files:Ge.object({read:nc.optional(),write:nc.optional(),delete:nc.optional()}).optional(),web:TS.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),ES=["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*"],IS=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],AS=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(jS,"buildDefaultPermissions");WA=jS()});import{z as at}from"zod";var qA,KA,ap=y(()=>{"use strict";qA=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()}),KA={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as I}from"zod";var DS,RS,$S,MS,OS,FS,_S,NS,LS,HS,US,GS,zS,WS,BS,VS,JS,qS,ZA,ej,cp=y(()=>{"use strict";DS=I.enum(["planned","active","completed","shipped"]),RS=I.enum(["low","medium","high"]),$S=I.enum(["feature","breaking_change","refactor","infrastructure"]),MS=I.enum(["completed","active","planned"]),OS=I.enum(["planned","active","completed"]),FS=I.enum(["git","git-branch","manual","prd"]),_S=I.object({id:I.string(),description:I.string(),completed:I.boolean(),completedAt:I.string().optional()}),NS=I.object({id:I.string(),name:I.string(),status:MS,completedAt:I.string().optional()}),LS=I.object({goal:I.string(),phases:I.array(NS),successMetrics:I.array(I.string()).optional()}),HS=I.object({hours:I.number(),minutes:I.number(),totalMinutes:I.number(),display:I.string().optional()}),US=I.object({hash:I.string(),message:I.string(),date:I.string(),author:I.string().optional()}),GS=I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),breakdown:I.array(I.object({area:I.string(),hours:I.number()})).optional()}),zS=I.object({hours:I.number().optional(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional()}),WS=I.object({estimated:GS.nullable(),actual:zS.nullable()}),BS=I.object({totalHours:I.number(),allocatedHours:I.number(),bufferPercent:I.number().optional()}),VS=I.object({id:I.string(),name:I.string(),theme:I.string().optional(),goals:I.array(I.string()).optional(),features:I.array(I.string()),capacity:BS.optional(),status:OS,startDate:I.string().optional(),endDate:I.string().optional()}),JS=I.object({id:I.string(),name:I.string(),description:I.string().optional(),date:I.string(),status:DS,impact:RS,effort:I.string().optional(),progress:I.number(),type:$S.optional(),roi:I.number().optional(),why:I.array(I.string()).optional(),technicalNotes:I.array(I.string()).optional(),compatibility:I.string().optional(),phase:I.string().optional(),tasks:I.array(_S),createdAt:I.string(),shippedAt:I.string().optional(),version:I.string().optional(),duration:HS.optional(),taskCount:I.number().optional(),agent:I.string().optional(),sprintName:I.string().optional(),completedDate:I.string().optional(),prdId:I.string().nullable().optional(),legacy:I.boolean().optional(),inferredFrom:FS.optional(),quarter:I.string().nullable().optional(),dependencies:I.array(I.string()).optional(),blockedBy:I.array(I.string()).optional(),effortTracking:WS.optional(),valueScore:I.number().optional(),commits:I.array(US).optional(),branch:I.string().optional(),commitsAhead:I.number().optional()}),qS=I.object({id:I.string(),title:I.string(),prdId:I.string().nullable().optional(),valueScore:I.number().optional(),effortEstimate:I.number().optional(),reason:I.string().optional()}),ZA=I.object({strategy:LS.nullable().optional(),features:I.array(JS),backlog:I.array(I.union([I.string(),qS])),lastUpdated:I.string(),quarters:I.array(VS).optional(),generatedFrom:I.enum(["git-history","manual","prd"]).optional(),generatedAt:I.string().optional()}),ej={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 KS from"node:crypto";import{homedir as YS}from"node:os";import{join as XS}from"node:path";function Se(){return KS.randomUUID()}var QS,lp=y(()=>{"use strict";l(Se,"generateUUID");QS=XS(YS(),".prjct-cli","projects")});import{z as Q}from"zod";var ZS,up,ek,tk,nk,sk,rk,ok,ik,dp,sc=y(()=>{"use strict";ZS=Q.enum(["feature","fix","improvement","refactor"]),up=Q.enum(["pass","warning","fail","skipped"]),ek=Q.enum(["added","changed","fixed","removed"]),tk=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),nk=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),sk=Q.object({description:Q.string(),type:ek.optional()}),rk=Q.object({lintStatus:up.nullable().optional(),lintDetails:Q.string().optional(),testStatus:up.nullable().optional(),testDetails:Q.string().optional()}),ok=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),ik=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:ZS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(sk).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:ok.optional(),codeMetrics:nk.optional(),qualityMetrics:rk.optional(),quantitativeImpact:Q.string().optional(),duration:tk.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),dp=Q.object({shipped:Q.array(ik),lastUpdated:Q.string()})});import{z as T}from"zod";var ak,mp,ck,lk,uk,rc,gp,dk,pk,fp,pp,mk,gk,hp,yp,wp,fk,hk,mj,No=y(()=>{"use strict";Sr();ak=T.enum(["low","medium","high","critical"]),mp=T.enum(["feature","bug","improvement","chore"]),ck=T.enum(["active","backlog","previously_active"]),lk=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),uk=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),rc=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()}),gp=T.object({output:T.string().min(1,"Subtask output is required"),summary:rc}),dk=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:lk,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:rc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),pk=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),fp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(dk).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:pk.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:wr.optional()}),pp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),mk=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()}),gk=T.object({taskId:T.string(),title:T.string(),classification:mp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(rc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:mk.optional()}),hp=T.object({currentTask:fp.nullable(),previousTask:pp.nullable().optional(),pausedTasks:T.array(pp).optional(),taskHistory:T.array(gk).optional(),lastUpdated:T.string()}),yp=T.object({id:T.string(),description:T.string(),priority:ak,type:mp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:ck,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),wp=T.object({tasks:T.array(yp),lastUpdated:T.string()}),fk=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),hk=T.object({type:uk,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),mj=T.object({projectId:T.string(),currentTask:fp.nullable(),queue:T.array(yp),stats:fk,recentActivity:T.array(hk),lastSync:T.string()})});import{z as ie}from"zod";var yk,wk,Sp,yj,wj,Sj,kn,kp,vs=y(()=>{"use strict";yk=ie.enum(["improving","stable","declining"]),wk=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Sp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),yj=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),wj=ie.object({sprints:ie.array(wk),averageVelocity:ie.number(),velocityTrend:yk,estimationAccuracy:ie.number(),overEstimated:ie.array(Sp),underEstimated:ie.array(Sp),lastUpdated:ie.string()}),Sj=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)}),kn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},kp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ot=y(()=>{"use strict";Ud();Ya();Er();Qa();Za();Oo();Sr();tc();ip();ap();cp();lp();sc();No();vs()});var Xt,oc,St,bn=y(()=>{"use strict";Ot();le();he();Xt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},oc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=Se(),s=C();return $.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 $.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(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.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=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.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);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},St=new oc});var bp=y(()=>{"use strict"});var Lo,Cp=y(()=>{"use strict";Lo={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 xs,Ho=y(()=>{"use strict";xs={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 vp=y(()=>{"use strict"});var xp=y(()=>{"use strict";vp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Pp,Ps=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Pp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ic=y(()=>{"use strict"});var ac=y(()=>{"use strict";bp();Cp();Ho();_();xp();Ps();ic()});function Ts(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 Ck[r]}var se,cc,lc,Go,Ck,Tt,Tp,Ir,ln=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ck={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ts,"getTimeout");Tt={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},Tp={HISTORY_MAX:100},Ir={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 xk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(vk.has(r)||r.includes("prjct"))return{level:Es.debug,name:"debug"};let e=Es[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Ep>=r?(...n)=>console[t](e,...n):Tk}var Es,vk,Ep,Pk,Tk,Ek,H,Ln=y(()=>{"use strict";Es={error:0,warn:1,info:2,debug:3},vk=new Set(["1","true","*"]);l(xk,"getLogLevel");({level:Ep,name:Pk}=xk()),Tk=l(()=>{},"noop");l(zo,"createLogMethod");Ek={error:zo(Es.error,"[prjct:error]","error"),warn:zo(Es.warn,"[prjct:warn]","warn"),info:zo(Es.info,"[prjct:info]","log"),debug:zo(Es.debug,"[prjct:debug]","log"),isEnabled:l(()=>Ep>=0,"isEnabled"),level:l(()=>Pk,"level")},H=Ek});var Wo,Ik,Ip=y(()=>{"use strict";cn();he();ac();ln();Ln();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Tp.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(Lo.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(Lo.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{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ne(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())}},Ik=new Wo});var Bo,Vo,Ap=y(()=>{"use strict";Ce();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await _n(t,[])??[];n.push(e),await kr(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await _n(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await kr(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:C(),success:!0};await kr(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await _n(t,null)}},Vo=new Bo});var uc=y(()=>{"use strict";Ip();Ap()});var Ft,Jo=y(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,Qt=y(()=>{"use strict";uc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.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 Vo.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 $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var dc,Ye,Ar=y(()=>{"use strict";Ot();Qa();le();bn();Qt();dc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Bd)}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:Se(),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=yn(Xt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;St.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}},Ye=new dc});var pc,Pe,jr=y(()=>{"use strict";Ot();No();le();bn();Qt();pc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",wp)}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:Se(),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:Se(),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=yn(Xt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;St.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()})}},Pe=new pc});var mc,pt,Dr=y(()=>{"use strict";Ot();sc();le();bn();Qt();mc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",dp)}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:Se(),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=yn(Xt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;St.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}},pt=new mc});var Rr,gc,Hn,fc=y(()=>{"use strict";Rr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},gc=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=Rr[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 Rr[e]}getPrompt(e){return Rr[e].prompt}getValidCommands(e){return Rr[e].transitions}formatNextSteps(e){return Rr[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}`}})}},Hn=new gc});var hc,L,$r=y(()=>{"use strict";Ot();No();le();fc();bn();Qt();hc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",hp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Hn.getCurrentState(e),s=Hn.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:Se()};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[];St.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=gp.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
261
|
+
${f.join(`
|
|
262
|
+
`)}`)}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 hc});import jk from"node:fs/promises";import Dk from"node:path";import{Hono as Rk}from"hono";function $k(r){return A.getGlobalProjectPath(r)}function jp(r,e){let t=new Rk,n=$k(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 Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.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=Dk.join(n,"context",`${o}.md`),c=await jk.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 Dp=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();_();Ln();l($k,"getProjectDataPath");l(jp,"createRoutes")});import Is from"node:fs/promises";import Mk from"node:path";import{Hono as Ok}from"hono";function qo(r){return $.getDoc(r,"project")}async function yc(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 Rp(){let r=new Ok;return r.get("/projects",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await yc(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(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await yc(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),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===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 Ye.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 Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{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 Pe.read(c),m=await Ye.read(c),p=await pt.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 Is.mkdir(As,{recursive:!0});let s=(await Is.readdir(As,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){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]:s;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 yc(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 Fk,As,$p=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();Fk=A.getGlobalBasePath(),As=Mk.join(Fk,"projects");l(qo,"getProjectConfig");l(yc,"calculateDuration");l(Rp,"createExtendedRoutes")});import{streamSSE as _k}from"hono/streaming";function Op(){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()>Mp&&t(i)},Nk),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 _k(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)}},Lk),p=setTimeout(()=>{t(a)},Mp);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 Mp,Nk,Lk,Fp=y(()=>{"use strict";ic();Mp=3600*1e3,Nk=300*1e3,Lk=3e4;l(Op,"createSSEManager")});var _p={};ge(_p,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>zk});import{Hono as Hk}from"hono";import{cors as Uk}from"hono/cors";import{logger as Gk}from"hono/logger";function Ko(r){let e=new Hk,t=Op();r.enableCors!==!1&&e.use("*",Uk({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Gk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"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=jp(r.projectId,r.projectPath);e.route("/api",n);let s=Rp();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(Pr())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: ${Pr()?"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 zk(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,wc=y(()=>{"use strict";Ja();Dp();$p();Fp();l(Ko,"createServer");Yo=3478;l(zk,"startServer")});import Un from"chalk";var Np,Wk,Bk,_t,Lp=y(()=>{"use strict";Be();Np=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Wk=80,Bk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Np,speed:Wk},cli:{header:l(()=>`${Un.cyan.bold("\u26A1")} ${Un.cyan("prjct")}`,"header"),footer:l(()=>Un.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Un.cyan("\u26A1")} ${Un.cyan("prjct")} ${Un.cyan(Np[r%10])} ${Un.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")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},_t=Bk});function Gn(r,e){return{...xs[r],...e}}function Mr(r,e,t){return{message:r,hint:e,...t}}var Or=y(()=>{"use strict";Ho();Ho();l(Gn,"getError");l(Mr,"createError")});var Up={};ge(Up,{ERRORS:()=>xs,ICONS:()=>Cn,OUTPUT_TIERS:()=>Hp,createError:()=>Mr,default:()=>h,formatForHuman:()=>Yk,getError:()=>Gn,getOutputTier:()=>Jk,getTierConfig:()=>Qo,isQuietMode:()=>Kk,limitLines:()=>Xo,setOutputTier:()=>Vk,setQuietMode:()=>qk});import te from"chalk";function Vk(r){Ds=r}function Jk(){return Ds}function Qo(){return Hp[Ds]}function qk(r){ct=r}function Kk(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
263
|
+
`);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
|
|
264
|
+
`)}
|
|
265
|
+
${te.dim(`...${o} more lines`)}`}function Yk(r){let e=Qo();if(Ds==="silent")return"";if(Ds==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(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&&Ds==="compact"&&o.push(te.dim(String(t.url))),Xo(o.join(`
|
|
266
|
+
`),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} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(te.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
267
|
+
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?Xo(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
268
|
+
`),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var fR,Sc,Hp,Ds,Cn,js,kc,ct,Et,Xk,Qk,h,Nt=y(()=>{"use strict";Lp();ln();Or();Or();fR=_t.spinner.frames,Sc=_t.spinner.speed,Hp={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}},Ds="compact";l(Vk,"setOutputTier");l(Jk,"getOutputTier");l(Qo,"getTierConfig");Cn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},js=null,kc=0,ct=!1;l(qk,"setQuietMode");l(Kk,"isQuietMode");Et=l((r,e)=>{let t=e??(Qo().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Xo,"limitLines");l(Yk,"formatForHuman");Xk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),Qk={start(){return ct||console.log(_t.cli.header()),this},end(){return ct||console.log(_t.cli.footer()),this},spin(r){return ct?this:(this.stop(),process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,Et(r,Tt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
|
|
269
|
+
`),this))},done(r,e){if(this.stop(),!ct){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=te.dim(` [${n.join(" | ")}]`))}console.log(`${Cn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Cn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Gn(r):r;return console.error(),console.error(`${Cn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ct||console.log(`${Cn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),ct||console.log(`${Cn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${Cn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ct)return this;let t=e.bullet||Cn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ct||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(te.dim(s)),console.log(te.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(),ct)return this;let t=e.split(`
|
|
270
|
+
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ct?this:(console.log(`
|
|
271
|
+
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return js&&(clearInterval(js),js=null,Xk()),this},step(r,e,t){if(ct)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
|
|
272
|
+
`),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
273
|
+
`),this)}},h=Qk});var Wp={};ge(Wp,{default:()=>eb,sessionTracker:()=>vn});var Zk,Gp,zp,bc,vn,eb,Zo=y(()=>{"use strict";he();le();Zk=1800*1e3,Gp=50,zp=200,bc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Zk}}}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>Gp&&(s.current.commands=s.current.commands.slice(-Gp)),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>zp&&(s.current.files=s.current.files.slice(-zp)),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:Cr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Cr(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}},vn=new bc,eb=vn});var Vp={};ge(Vp,{default:()=>zn,performanceTracker:()=>Bp});var Cc,Bp,zn,ei=y(()=>{"use strict";he();Cc=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){V.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)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.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 V.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(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+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((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Bp=new Cc,zn=Bp});function xc(r){if(Pp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))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 vc,ti,Wn,Fr,_r,Nr=y(()=>{"use strict";he();Ps();le();vc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={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(xc,"resolveCanonicalDomains");Wn=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=V.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();V.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}},Fr=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()}},_r=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.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 Lr,Pc=y(()=>{"use strict";he();Ps();le();Nr();Lr=class r extends Wn{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=Uo(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=Uo(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:Uo(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=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Bn,Tc=y(()=>{"use strict";Ot();Ps();le();Nr();Bn=class extends Wn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:Se(),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(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.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 O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(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=vc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[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 xc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
274
|
+
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 Ec,tb,Te,Rs=y(()=>{"use strict";Nr();Pc();Tc();Nr();Pc();Tc();Ec=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Bn,this._patternStore=new Lr,this._historyStore=new _r,this._sessionStore=new Fr}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()}},tb=new Ec,Te=tb});import{exec as nb}from"node:child_process";import kt from"node:fs/promises";import Lt from"node:path";import{promisify as sb}from"node:util";var Vn,Ic,rb,qe,Jp=y(()=>{"use strict";_();Vn=sb(nb),Ic=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Lt.join(this.projectPath,"package.json"),t=await kt.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=Lt.join(this.projectPath,"Cargo.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=Lt.join(this.projectPath,"requirements.txt");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=Lt.join(this.projectPath,"go.mod");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=Lt.join(this.projectPath,"Gemfile");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=Lt.join(this.projectPath,"mix.exs");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=Lt.join(this.projectPath,"pom.xml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=Lt.join(this.projectPath,"composer.json"),t=await kt.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=Lt.join(this.projectPath,"pyproject.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Vn('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(`
|
|
275
|
+
`).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 kt.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 kt.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 Vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Vn('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 Vn('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 kt.access(Lt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=Lt.join(this.projectPath,e);return await kt.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
276
|
+
`).filter(Boolean)}catch{return[]}}},rb=new Ic,qe=rb});import jc from"node:fs";import ob from"node:fs/promises";import ni from"node:path";function Dc(){if(qp)return Ac;qp=!0;let r=ni.join(pe,"dist","templates.json");try{let e=jc.readFileSync(r,"utf-8");return Ac=JSON.parse(e),Ac}catch{return null}}function ab(r){let e=Jn.indexOf(r);e>-1&&Jn.splice(e,1),Jn.push(r)}function cb(){for(;$s.size>=ib&&Jn.length>0;){let r=Jn.shift();r&&$s.delete(r)}}function si(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(`
|
|
277
|
+
`).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 Kp(r){if($s.has(r))return ab(r),$s.get(r);let e,t=Dc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ni.join(pe,"templates","commands",`${r}.md`);try{e=await ob.readFile(s,"utf-8")}catch{throw Po.notFound(r)}}let n=si(e);return cb(),$s.set(r,n),Jn.push(r),n}async function lb(r){return(await Kp(r)).frontmatter["allowed-tools"]||[]}function ub(){$s.clear(),Jn.length=0}function ve(r){let e=Dc();if(e?.[r])return e[r];let t=ni.join(pe,"templates",r);try{return jc.readFileSync(t,"utf-8")}catch{return null}}function Ms(r){let e=Dc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ni.join(pe,"templates",r);try{return jc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var ib,$s,Jn,Ac,qp,db,Rc,qn=y(()=>{"use strict";cn();dt();ib=50,$s=new Map,Jn=[],Ac=null,qp=!1;l(Dc,"loadBundle");l(ab,"updateLruOrder");l(cb,"evictLru");l(si,"parseFrontmatter");l(Kp,"load");l(lb,"getAllowedTools");l(ub,"clearCache");l(ve,"getTemplateContent");l(Ms,"listTemplates");db={load:Kp,parseFrontmatter:si,getAllowedTools:lb,clearCache:ub,getTemplateContent:ve,listTemplates:Ms},Rc=db});import X from"node:fs/promises";import Mc from"node:os";import Z from"node:path";async function pb(){try{let r=ve("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Z.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function mb(r){let e=await pb();if(!e){let i=ve("global/CLAUDE.md");if(i)return i;let a=Z.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=ve("global/CLAUDE.md");if(a)return a;let c=Z.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=ve(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Z.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(`
|
|
278
|
+
`)}async function gb(){try{let r=Z.join(Mc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Ms("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ve(s);if(o){let i=Z.basename(s);await X.writeFile(Z.join(r,i),o,"utf-8")}}return{success:!0}}let t=Z.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Z.join(t,s),i=Z.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 fb(){let r=(Be(),xt(ut)),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=Z.join(e.configDir,e.contextFile),o=Z.join(pe,"templates","global",e.contextFile),i="";try{let u=ve(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await mb()}catch{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.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),S=p+f+g;return await X.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
279
|
+
|
|
280
|
+
${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 Yp(){let r=Mc.homedir();return{claude:{commands:Z.join(r,".claude","commands","p"),config:Z.join(r,".claude"),router:Z.join(r,".claude","commands","p.md")},gemini:{commands:Z.join(r,".gemini","commands"),config:Z.join(r,".gemini"),router:Z.join(r,".gemini","commands","p.toml")}}}var $c,hb,Ee,xn=y(()=>{"use strict";qn();_();dt();l(pb,"loadModuleConfig");l(mb,"composeGlobalTemplate");l(gb,"installDocs");l(fb,"installGlobalConfig");$c=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Mc.homedir(),this.templatesDir=Z.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Z.join(t.configDir,"commands"):this.claudeCommandsPath=Z.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=Ms("commands/");if(e.length>0)return e.filter(t=>t.endsWith(".md")).map(t=>t.replace("commands/",""));try{return(await X.readdir(this.templatesDir)).filter(n=>n.endsWith(".md"))}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(Be(),xt(ut)).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=Z.join(this.claudeCommandsPath,a),u=ve(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=Z.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=Z.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(ve(`commands/${e}.md`))return!0;try{let n=Z.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(Be(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Z.join(t.configDir,"commands",n);await X.mkdir(Z.dirname(s),{recursive:!0});let o=ve(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=Z.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(Be(),xt(ut)).getActiveProvider(),n=Z.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(Z.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=Z.join(this.claudeCommandsPath,o),a=n.includes(o),c=ve(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=Z.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 fb()}async installDocs(){return gb()}};l(Yp,"getProviderPaths");hb=new $c,Ee=hb});import{z as Oe}from"zod";function em(r,e="default"){let t=Xp[e]||Xp.default;return r/1e3*t}function ri(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var yb,wb,Qp,Zp,Xp,oi=y(()=>{"use strict";yb=Oe.object({date:Oe.string(),tokensSaved:Oe.number(),syncs:Oe.number(),avgCompressionRate:Oe.number(),totalDuration:Oe.number()}),wb=Oe.object({agentName:Oe.string(),usageCount:Oe.number(),tokensSaved:Oe.number()}),Qp=Oe.object({totalTokensSaved:Oe.number(),avgCompressionRate:Oe.number(),syncCount:Oe.number(),watchTriggers:Oe.number(),avgSyncDuration:Oe.number(),totalSyncDuration:Oe.number(),agentUsage:Oe.array(wb),dailyStats:Oe.array(yb),firstSync:Oe.string(),lastUpdated:Oe.string()}),Zp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Xp={"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(em,"estimateCostSaved");l(ri,"formatCost")});function Sb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function kb(r){let e=[],t=Sb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Oc,o+i.length);if(c===-1)continue;let u=c+Oc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Fc(r,e){let t=kb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
`,n+=`## Your Customizations
|
|
285
|
+
|
|
286
|
+
`,n+=`_The sections below are preserved during sync. Edit freely._
|
|
287
|
+
|
|
288
|
+
`;for(let s of t)n+=s.content,n+=`
|
|
289
|
+
|
|
290
|
+
`;return`${n.trimEnd()}
|
|
291
|
+
`}function _c(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(`
|
|
292
|
+
`);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(Oc)&&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 Oc,Nc=y(()=>{"use strict";Oc="<!-- /prjct:preserve -->";l(Sb,"createPreserveStartRegex");l(kb,"extractPreservedSections");l(Fc,"mergePreservedSections");l(_c,"validatePreserveBlocks")});function Hr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&bb.has(e.code))return!0;if(e.code&&nm.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 ai(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&nm.has(e.code))}function tm(r,e,t){let n=Pn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Pn.delete(r),!1):!0:!1}function Lc(r,e){let t=Pn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Pn.set(r,t)}function Cb(r){Pn.delete(r)}var bb,nm,Pn,ii,sm,Ur,ci=y(()=>{"use strict";bb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),nm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Hr,"isTransientError");l(ai,"isPermanentError");Pn=new Map;l(tm,"isCircuitOpen");l(Lc,"recordFailure");l(Cb,"recordSuccess");ii=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(tm(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 Cb(t),o}catch(o){if(n=o,s++,ai(o))throw Lc(t,this.options.circuitBreakerThreshold),o;if(!(Hr(o)&&s<this.options.maxAttempts))throw Lc(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 Lc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Hr(e)}isCircuitOpen(e){return tm(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Pn.get(e)}resetCircuit(e){Pn.delete(e)}resetAllCircuits(){Pn.clear()}},sm=new ii({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ur=new ii({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var rm=y(()=>{"use strict";Nc();ci()});import li from"node:fs/promises";import Hc from"node:path";var Uc,om,im=y(()=>{"use strict";Ve();Ce();_();Uc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await li.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await li.readFile(Hc.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=Hc.join(this.agentsPath,`${e}.md`),n=await li.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=Hc.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})}
|
|
293
|
+
`;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},om=Uc});import am from"node:path";async function Pb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(am.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(am.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Tb(){return{...vb}}function Eb(){return{...xb}}async function cm(){return ui||(ui=await Pb()?Tb():Eb(),ui)}var ui,vb,xb,lm=y(()=>{"use strict";xe();ui=null,vb={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}},xb={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(Pb,"isClaudeEnvironment");l(Tb,"getClaudeAgent");l(Eb,"getTerminalAgent");l(cm,"detect")});var Ab,Gc=y(()=>{Ab=dd({})});var jb,di,Os,um=y(()=>{"use strict";im();cn();lm();ci();Gc();jb=["claude"],di=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new om}async initialize(){return this.agent?this.agent:await sm.execute(async()=>{if(this.agentInfo=await cm(),!this.agentInfo?.isSupported)throw br.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!jb.includes(e))throw br.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Ab(`../infrastructure/${e}-agent`);return this.agent=new t,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:`
|
|
294
|
+
AGENTIC EXECUTION:
|
|
295
|
+
- Read: templates/agentic/orchestrator.md
|
|
296
|
+
- Analyze task: "${e}"
|
|
297
|
+
- Available specialists: ${s.join(", ")}
|
|
298
|
+
- Claude decides which agent(s) to use
|
|
299
|
+
- Always prefer specialists over generalist
|
|
300
|
+
- Fragment complex tasks into subtasks
|
|
301
|
+
`}}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}},Os=new di});var pi,mi,dm=y(()=>{"use strict";pi=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"}},mi=new pi});import Db from"node:crypto";import gi from"node:fs/promises";import pm from"node:path";function mm(){return{version:Ht,lastUpdated:"",checksums:{}}}var Ht,zc,Xe,Gr=y(()=>{"use strict";Ce();_();le();he();Ht="1.0.0";l(mm,"getDefaultChecksums");zc=class{static{l(this,"IndexStorage")}getIndexPath(e){return pm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Ht?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 mm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Db.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:Ht,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.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!==Ht?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!==Ht?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=$.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=$.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)}},Xe=new zc});var gm,Rb,fi,$b,fm=y(()=>{"use strict";Gr();gm=8e4,Rb={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"]},fi=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||gm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.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 O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,S=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||S.length>=s)break;S.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Rb))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 Xe.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 Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||gm,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)}},$b=new fi});import hm from"node:path";var Wc,hi,Mb,ym=y(()=>{"use strict";Gr();le();Wc=[{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"}],hi=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 Wc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=hm.dirname(i.path);n.get(u).add(`**/${hm.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=Wc.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 Wc)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:Ht,projectId:e,domains:t,discoveredAt:s};await Xe.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:Ht,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.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 Xe.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 Xe.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:Ht,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Mb=new hi});import Bc from"node:path";var Vc,Ob,Fb,yi,wm,Jc=y(()=>{"use strict";Vc=30,Ob=[/^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$/],Fb=[/^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],yi=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=Vc){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=Bc.basename(e.path);for(let n of Ob)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Bc.basename(e.path);for(let s of Fb)if(s.test(t))return 15;let n=Bc.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}},wm=new yi});import{execSync as qc}from"node:child_process";var wi,Kc,Si,Fs,ki=y(()=>{"use strict";Or();wi={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"}},Kc=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=wi[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=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Si(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=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
302
|
+
`);throw new Si({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
303
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),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=qc(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:Mr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Mr(`${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())}},Si=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}},Fs=new Kc});import{exec as _b}from"node:child_process";import{promisify as Nb}from"node:util";var CM,Sm=y(()=>{"use strict";ln();ki();CM=Nb(_b)});var bi,mt,Yc=y(()=>{"use strict";Ve();bn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.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 R.getProjectId(e);return n?V.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 R.getProjectId(e);return s?V.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 R.getProjectId(e);if(!t)return;V.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 V.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=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Xt.MEMORY_MAX_ENTRIES)return 0;let s=n-Xt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);St.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&&V.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}}},mt=new bi});var km=y(()=>{"use strict";Ce();xe()});import{exec as Hb}from"node:child_process";import{promisify as Ub}from"node:util";var NM,bm=y(()=>{"use strict";Gr();le();Jc();NM=Ub(Hb)});import{createHash as Gb}from"node:crypto";var Xc,Zt,Ci=y(()=>{"use strict";Ya();le();Qt();Xc=class extends ze{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"};Ka.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 Ka.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 Gd(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 Gb("sha256").update(JSON.stringify(t)).digest("hex")}},Zt=new Xc});var Qc,un,zr=y(()=>{"use strict";oi();le();Qt();Qc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}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],S=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.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:S,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:em(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)}},un=new Qc});import lt from"node:fs/promises";import de from"node:path";async function Wr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await zb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of tl){let u=de.join(s,a),d=await Kn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Cm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of el){let u=de.join(o,a),d=await Kn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),vm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Xb(r,o,t),await Qb(r,o,t),await Zb(r,i,t),await eC(r,i,t),t.errors.length===0&&await tC(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 zb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await Zc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Zc(e,de.join(n,"index")),await Zc(t,de.join(n,"memory")),n}async function Zc(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Cm(r,e,t){switch(e){case"state":Wb(r,t);break;case"queue":Bb(r,t);break;case"ideas":Vb(r,t);break;case"shipped":Jb(r,t);break;case"metrics":qb(r,t);break;case"analysis":Kb(r,t);break}}function Wb(r,e){let t=$.getDb(r),n=t.prepare(`
|
|
284
304
|
INSERT OR REPLACE INTO tasks
|
|
285
305
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
286
306
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -291,229 +311,77 @@ ${JS(e.schema)}`:null}function JS(r){if(r instanceof Je.ZodObject){let e=r.shape
|
|
|
291
311
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
292
312
|
depends_on, started_at, completed_at, output, summary)
|
|
293
313
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
294
|
-
`),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
|
|
314
|
+
`),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 Bb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
295
315
|
INSERT OR REPLACE INTO queue_tasks
|
|
296
316
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
297
317
|
feature_id, feature_name)
|
|
298
318
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
299
|
-
`);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
|
|
319
|
+
`);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 Vb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
300
320
|
INSERT OR REPLACE INTO ideas
|
|
301
321
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
302
322
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
303
|
-
`);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
|
|
323
|
+
`);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 Jb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
304
324
|
INSERT OR REPLACE INTO shipped_features
|
|
305
325
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
306
326
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
307
|
-
`);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
|
|
327
|
+
`);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 qb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
308
328
|
INSERT OR REPLACE INTO metrics_daily
|
|
309
329
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
310
330
|
VALUES (?, ?, ?, ?, ?)
|
|
311
|
-
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function
|
|
331
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Kb(r,e){let n=$.getDb(r).prepare(`
|
|
312
332
|
INSERT OR REPLACE INTO analysis
|
|
313
333
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
314
334
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
315
|
-
`),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
|
|
335
|
+
`),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 vm(r,e,t){e==="categories-cache"&&Yb(r,t)}function Yb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
316
336
|
INSERT OR REPLACE INTO index_files
|
|
317
337
|
(path, categories, domain, score, size, mtime, language)
|
|
318
338
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
319
|
-
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function
|
|
339
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Xb(r,e,t){let n=de.join(e,"checksums.json"),s=await Kn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.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 Qb(r,e,t){let n=de.join(e,"file-scores.json"),s=await Kn(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=$.getDb(r),a=i.prepare(`
|
|
320
340
|
INSERT OR REPLACE INTO index_files
|
|
321
341
|
(path, score, size, mtime, language, categories, domain)
|
|
322
342
|
VALUES (?, ?, ?, ?, NULL,
|
|
323
343
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
324
344
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
325
|
-
`);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
|
|
326
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i
|
|
327
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i
|
|
328
|
-
`).filter(f=>f.trim());if(p.length===0){await
|
|
329
|
-
|
|
330
|
-
`)
|
|
331
|
-
|
|
332
|
-
`)}get length(){return this.lines.length}};l(Gm,"md")});var Wr,rl,zs,ol=y(()=>{"use strict";Wr={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"}},rl=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=Wr[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 Wr[e]}getPrompt(e){return Wr[e].prompt}getValidCommands(e){return Wr[e].transitions}formatNextSteps(e){return Wr[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}`}})}},zs=new rl});var il,ie,Ti=y(()=>{"use strict";Nt();Si();re();zm();ol();Dn();tn();il=class extends Ue{static{l(this,"StateStorage")}constructor(){super("state.json",Im)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getMdFilename(){return"now.md"}getLayer(){return"core"}getEventType(e){return`state.${e}d`}toMarkdown(e){return Gm().h1("NOW").when(!!e.currentTask,t=>{let n=e.currentTask;if(t.bold(n.description).blank().raw(`Started: ${ht(n.startedAt)}`).raw(`Session: ${n.sessionId}`).maybe(n.featureId,(s,o)=>s.raw(`Feature: ${o}`)),n.subtasks&&n.subtasks.length>0){t.blank().h2("Subtasks Progress").raw(`**Progress**: ${n.subtaskProgress?.completed||0}/${n.subtaskProgress?.total||0} (${n.subtaskProgress?.percentage||0}%)`).blank().raw("| # | Domain | Description | Status | Agent |").raw("|---|--------|-------------|--------|-------|"),n.subtasks.forEach((i,a)=>{let c=i.status==="completed"?"\u2705":i.status==="in_progress"?"\u25B6\uFE0F":i.status==="failed"?"\u274C":i.status==="skipped"?"\u23ED\uFE0F":i.status==="blocked"?"\u{1F6AB}":"\u23F3",u=a===n.currentSubtaskIndex?" **\u2190 Active**":"";t.raw(`| ${a+1} | ${i.domain} | ${i.description} | ${c} ${i.status}${u} | ${i.agent} |`)});let s=n.subtasks[n.currentSubtaskIndex||0];s&&s.status==="in_progress"&&(t.blank().h3("Current Subtask").raw(`**#${(n.currentSubtaskIndex||0)+1}**: ${s.description}`).raw(`**Agent**: ${s.agent}`).raw(`**Domain**: ${s.domain}`),s.dependsOn.length>0&&t.raw(`**Depends on**: ${s.dependsOn.join(", ")}`));let o=n.subtasks.filter(i=>i.status==="completed"&&i.summary);if(o.length>0){let i=o[o.length-1];i.summary&&t.blank().h3("Previous Subtask Output").raw(`**${i.summary.title}**`).raw(i.summary.description).maybe(i.summary.outputForNextAgent,(a,c)=>a.blank().raw(`**Available for next agent**: ${c}`))}}}).when(!e.currentTask,t=>{t.italic("No active task. Use /p:work to start.")}).when((e.pausedTasks?.length||0)>0||!!e.previousTask,t=>{let n=e.pausedTasks?.length?e.pausedTasks:e.previousTask?[e.previousTask]:[];n.length!==0&&(t.hr().h2(`Paused (${n.length})`),n.forEach((s,o)=>{t.raw(`${o+1}. **${s.description}**`).raw(` Paused: ${ht(s.pausedAt)}`),s.pauseReason&&t.raw(` Reason: ${s.pauseReason}`)}),t.blank().italic("Use /p:resume to continue"))}).when((e.taskHistory?.length||0)>0,t=>{let n=this.getTaskHistoryFromState(e);if(n.length===0)return;let s=e.currentTask?.type,o=s?n.filter(i=>i.classification===s).slice(0,3):n.slice(0,5);o.length!==0&&(t.hr().h2(s?`Recent ${s} tasks (${o.length})`:`Recent tasks (${o.length})`),o.forEach((i,a)=>{t.raw(`${a+1}. **${i.title}** (${i.classification})`).raw(` Completed: ${ht(i.completedAt)} | ${i.subtaskCount} subtask${i.subtaskCount>1?"s":""}`).raw(` Outcome: ${i.outcome}`),i.linearId&&t.raw(` Linear: ${i.linearId}`),i.feedback?.patternsDiscovered?.length&&t.raw(` Patterns: ${i.feedback.patternsDiscovered.join(", ")}`),i.feedback?.issuesEncountered?.length&&t.raw(` Gotchas: ${i.feedback.issuesEncountered.join(", ")}`)}),t.blank().italic("Task history helps identify patterns and improve decisions"))}).blank().build()}validateTransition(e,t){let n=zs.getCurrentState(e),s=zs.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ke()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Em.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
`)}
|
|
337
|
-
`)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
### Dependencies (${f.length+S.length})
|
|
344
|
-
|
|
345
|
-
**Production** (${f.length}):
|
|
346
|
-
${f.length>0?f.map(x=>`- ${x}: ${c.dependencies[x]}`).join(`
|
|
347
|
-
`):"_None_"}
|
|
348
|
-
|
|
349
|
-
**Dev** (${S.length}):
|
|
350
|
-
${S.length>0?S.map(x=>`- ${x}: ${c.devDependencies[x]}`).join(`
|
|
351
|
-
`):"_None_"}
|
|
352
|
-
|
|
353
|
-
### Scripts
|
|
354
|
-
|
|
355
|
-
${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([x,E])=>`- \`${x}\`: ${E}`).join(`
|
|
356
|
-
`):"_None_"}
|
|
357
|
-
|
|
358
|
-
### Git
|
|
359
|
-
|
|
360
|
-
- Branch: ${a.branch}
|
|
361
|
-
- Commits: ${a.commits}
|
|
362
|
-
- Contributors: ${a.contributors}
|
|
363
|
-
- Uncommitted: ${a.hasChanges?"Yes":"No"}
|
|
364
|
-
|
|
365
|
-
**Recent:**
|
|
366
|
-
${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(x=>`- \`${x.hash}\` ${x.message}`).join(`
|
|
367
|
-
`):"_None_"}
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## CURRENT STATE
|
|
372
|
-
|
|
373
|
-
**Now:** ${m?m.description:"_No active task_"}
|
|
374
|
-
|
|
375
|
-
**Queue (${p.length}):**
|
|
376
|
-
${p.length>0?p.slice(0,10).map((x,E)=>`${E+1}. ${x.description}`).join(`
|
|
377
|
-
`):"_Empty_"}
|
|
378
|
-
|
|
379
|
-
**Active Features (${g.length}):**
|
|
380
|
-
${g.length>0?g.map(x=>`- ${x.name}`).join(`
|
|
381
|
-
`):"_None_"}
|
|
382
|
-
|
|
383
|
-
**Ideas (${o.length}):**
|
|
384
|
-
${o.length>0?o.slice(0,5).map(x=>`- ${x.title}`).join(`
|
|
385
|
-
`):"_None_"}
|
|
386
|
-
|
|
387
|
-
---
|
|
388
|
-
|
|
389
|
-
## AGENTS
|
|
390
|
-
|
|
391
|
-
${i.length>0?i.map(x=>`- **${x.name}**: ${x.role||"Specialist"}`).join(`
|
|
392
|
-
`):"_None_"}
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
## DATA LOCATION
|
|
397
|
-
|
|
398
|
-
\`\`\`
|
|
399
|
-
~/.prjct-cli/projects/${e}/
|
|
400
|
-
\u251C\u2500\u2500 data/ # JSON (source of truth)
|
|
401
|
-
\u2502 \u251C\u2500\u2500 project.json
|
|
402
|
-
\u2502 \u251C\u2500\u2500 tasks/
|
|
403
|
-
\u2502 \u251C\u2500\u2500 features/
|
|
404
|
-
\u2502 \u251C\u2500\u2500 ideas/
|
|
405
|
-
\u2502 \u2514\u2500\u2500 agents/
|
|
406
|
-
\u251C\u2500\u2500 context/ # MD (for Claude)
|
|
407
|
-
\u2502 \u251C\u2500\u2500 CLAUDE.md
|
|
408
|
-
\u2502 \u251C\u2500\u2500 now.md
|
|
409
|
-
\u2502 \u2514\u2500\u2500 queue.md
|
|
410
|
-
\u2514\u2500\u2500 sync/ # Sync state
|
|
411
|
-
\u2514\u2500\u2500 pending.json
|
|
412
|
-
\`\`\`
|
|
413
|
-
`;await Ws.writeFile(Js.join(r,"CLAUDE.md"),v,"utf-8")}async function bP(r,e){let t=e.find(s=>s.status==="in_progress"),n=t?`# NOW
|
|
414
|
-
|
|
415
|
-
**Task:** ${t.description}
|
|
416
|
-
|
|
417
|
-
**Started:** ${t.startedAt||"Unknown"}
|
|
418
|
-
|
|
419
|
-
**Priority:** ${t.priority||"medium"}
|
|
420
|
-
`:`# NOW
|
|
421
|
-
|
|
422
|
-
_No active task. Use /p:now to start._
|
|
423
|
-
`;await Ws.writeFile(Js.join(r,"now.md"),n,"utf-8")}async function PP(r,e){let t=e.filter(s=>s.status==="pending"),n=`# QUEUE
|
|
424
|
-
|
|
425
|
-
${t.length>0?t.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
426
|
-
`):"_Empty queue. Use /p:next to add tasks._"}
|
|
427
|
-
`;await Ws.writeFile(Js.join(r,"queue.md"),n,"utf-8")}async function CP(r,e,t,n){let s=`# PROJECT SUMMARY
|
|
428
|
-
|
|
429
|
-
**Name:** ${e.name||"Unknown"}
|
|
430
|
-
**Version:** ${e.version||"N/A"}
|
|
431
|
-
**Stack:** ${e.techStack?.join(", ")||"Not detected"}
|
|
432
|
-
|
|
433
|
-
## Git
|
|
434
|
-
|
|
435
|
-
- Branch: ${t.branch}
|
|
436
|
-
- Commits: ${t.commits}
|
|
437
|
-
- Status: ${t.hasChanges?"Has uncommitted changes":"Clean"}
|
|
438
|
-
|
|
439
|
-
## Dependencies
|
|
440
|
-
|
|
441
|
-
- Production: ${Object.keys(n.dependencies).length}
|
|
442
|
-
- Dev: ${Object.keys(n.devDependencies).length}
|
|
443
|
-
`;await Ws.writeFile(Js.join(r,"summary.md"),s,"utf-8")}var Br,Bm=y(()=>{"use strict";ne();sn();Br=yP(hP);l(Wm,"generateContext");l(wP,"getGitData");l(kP,"getPackageData");l(SP,"generateClaudeMd");l(bP,"generateNowMd");l(PP,"generateQueueMd");l(CP,"generateSummaryMd")});import pl from"node:fs/promises";import Bs from"node:path";function gl(r){if(Vp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Ei))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 ml,Ei,ns,Vr,qr,Kr=y(()=>{"use strict";ne();F();Ls();re();be();Ur();ml={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},Ei={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(gl,"resolveCanonicalDomains");ns=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getPath(e){let t=Bs.join(P.getGlobalProjectPath(e),"memory"),n=this.getSubdirectory();return n?Bs.join(t,n,this.getFilename()):Bs.join(t,this.getFilename())}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getPath(e);try{let n=await pl.readFile(t,"utf-8");this._data=JSON.parse(n),this.afterLoad(this._data)}catch(n){if(k(n))this._data=this.getDefault();else throw n}return this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getPath(e);await pl.mkdir(Bs.dirname(t),{recursive:!0}),await pl.writeFile(t,JSON.stringify(this._data,null,2),"utf-8")}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}},Vr=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()}},qr=class{static{l(this,"HistoryStore")}_getSessionPath(e){let t=new Date,n=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,s=Go();return Bs.join(P.getGlobalProjectPath(e),"memory","sessions",n,`${s}.jsonl`)}async appendHistory(e,t){let n=this._getSessionPath(e);await ft(Bs.dirname(n));let s={ts:b(),...t,type:t.type};await _s(n,s)}async getRecentHistory(e,t=20){let n=this._getSessionPath(e);return Ac(n,t)}}});import fl from"node:fs/promises";import hl from"node:path";var Xr,yl=y(()=>{"use strict";ne();F();Ls();re();Kr();Xr=class r extends ns{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=li(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=b();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=li(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:b(),confidence:li(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}_getArchivePath(e){let t=hl.join(P.getGlobalProjectPath(e),"memory");return hl.join(t,"patterns-archive.json")}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[c,u]of Object.entries(t.decisions)){let d=new Date(u.lastSeen).getTime();n-d>s&&o.push(c)}if(o.length===0)return 0;let i=this._getArchivePath(e),a={};try{let c=await fl.readFile(i,"utf-8");a=JSON.parse(c)}catch(c){if(!k(c))throw c}for(let c of o)a[c]=t.decisions[c],delete t.decisions[c];return await fl.mkdir(hl.dirname(i),{recursive:!0}),await fl.writeFile(i,JSON.stringify(a,null,2),"utf-8"),await this.save(e),o.length}}});var ss,wl=y(()=>{"use strict";Nt();Ls();re();Kr();ss=class extends ns{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=b(),u={id:ke(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let x=this._getCommandTags(t.commandName),E=(p.tags||[]).filter($=>x.includes($));g.tagMatch=Math.min(20,E.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.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 x=this._extractKeywordsFromText(t.taskDescription),E=0;for(let $ of x)p.content.toLowerCase().includes($)&&(E+=2),p.title.toLowerCase().includes($)&&(E+=3);g.keywords=Math.min(15,E)}p.userTriggered&&(g.userTriggered=5);let v=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:v,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=ml[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Ei[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 gl(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
444
|
-
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 kl,vP,Ce,Vs=y(()=>{"use strict";Kr();yl();wl();Kr();yl();wl();kl=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new ss,this._patternStore=new Xr,this._historyStore=new qr,this._sessionStore=new Vr}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()}},vP=new kl,Ce=vP});import{exec as xP}from"node:child_process";import St from"node:fs/promises";import Gt from"node:path";import{promisify as TP}from"node:util";var rs,Sl,EP,We,Vm=y(()=>{"use strict";F();rs=TP(xP),Sl=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Gt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(k(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Gt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readRequirements(){try{let e=Gt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readGoMod(){try{let e=Gt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readGemfile(){try{let e=Gt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readMixExs(){try{let e=Gt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readPomXml(){try{let e=Gt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async readComposerJson(){try{let e=Gt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(k(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Gt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(k(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await rs('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(`
|
|
445
|
-
`).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 St.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(k(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(k(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await rs(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await rs("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await rs('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await rs('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 rs('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 St.access(Gt.join(this.projectPath,e)),!0}catch(t){if(k(t))return!1;throw t}}async readFile(e){try{let t=Gt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(k(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await rs(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
446
|
-
`).filter(Boolean)}catch{return[]}}},EP=new Sl,We=EP});import Pl from"node:fs";import AP from"node:fs/promises";import Ai from"node:path";function Cl(){if(qm)return bl;qm=!0;let r=Ai.join(me,"dist","templates.json");try{let e=Pl.readFileSync(r,"utf-8");return bl=JSON.parse(e),bl}catch{return null}}function jP(r){let e=os.indexOf(r);e>-1&&os.splice(e,1),os.push(r)}function DP(){for(;qs.size>=IP&&os.length>0;){let r=os.shift();r&&qs.delete(r)}}function Ii(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(`
|
|
447
|
-
`).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 Km(r){if(qs.has(r))return jP(r),qs.get(r);let e,t=Cl();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Ai.join(me,"templates","commands",`${r}.md`);try{e=await AP.readFile(s,"utf-8")}catch{throw Uo.notFound(r)}}let n=Ii(e);return DP(),qs.set(r,n),os.push(r),n}async function RP(r){return(await Km(r)).frontmatter["allowed-tools"]||[]}function $P(){qs.clear(),os.length=0}function Pe(r){let e=Cl();if(e?.[r])return e[r];let t=Ai.join(me,"templates",r);try{return Pl.readFileSync(t,"utf-8")}catch{return null}}function Ks(r){let e=Cl();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Ai.join(me,"templates",r);try{return Pl.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var IP,qs,os,bl,qm,MP,vl,is=y(()=>{"use strict";pn();ct();IP=50,qs=new Map,os=[],bl=null,qm=!1;l(Cl,"loadBundle");l(jP,"updateLruOrder");l(DP,"evictLru");l(Ii,"parseFrontmatter");l(Km,"load");l(RP,"getAllowedTools");l($P,"clearCache");l(Pe,"getTemplateContent");l(Ks,"listTemplates");MP={load:Km,parseFrontmatter:Ii,getAllowedTools:RP,clearCache:$P,getTemplateContent:Pe,listTemplates:Ks},vl=MP});import K from"node:fs/promises";import Tl from"node:os";import Y from"node:path";async function OP(){try{let r=Pe("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Y.join(me,"templates/global/modules/module-config.json"),t=await K.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function FP(r){let e=await OP();if(!e){let i=Pe("global/CLAUDE.md");if(i)return i;let a=Y.join(me,"templates/global/CLAUDE.md");return K.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Pe("global/CLAUDE.md");if(a)return a;let c=Y.join(me,"templates/global/CLAUDE.md");return K.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=Pe(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Y.join(me,"templates/global/modules",i),u=await K.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(`
|
|
448
|
-
`)}async function _P(){try{let r=Y.join(Tl.homedir(),".prjct-cli","docs");await K.mkdir(r,{recursive:!0});let e=Ks("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Pe(s);if(o){let i=Y.basename(s);await K.writeFile(Y.join(r,i),o,"utf-8")}}return{success:!0}}let t=Y.join(me,"templates/global/docs"),n=await K.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Y.join(t,s),i=Y.join(r,s),a=await K.readFile(o,"utf-8");await K.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function NP(){let r=(ze(),vt(at)),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 K.mkdir(e.configDir,{recursive:!0});let s=Y.join(e.configDir,e.contextFile),o=Y.join(me,"templates","global",e.contextFile),i="";try{let u=Pe(`global/${e.contextFile}`);u?i=u:i=await K.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await FP("standard")}catch{let d=Pe("global/CLAUDE.md");if(d)i=d;else{let m=Y.join(me,"templates/global/CLAUDE.md");i=await K.readFile(m,"utf-8")}}else{let d=Pe("global/CLAUDE.md");if(d)i=d;else{let m=Y.join(me,"templates/global/CLAUDE.md");i=await K.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await K.readFile(s,"utf-8"),c=!0}catch(u){if(k(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),S=p+f+g;return await K.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
449
|
-
|
|
450
|
-
${i}`;return await K.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await K.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function Xm(){let r=Tl.homedir();return{claude:{commands:Y.join(r,".claude","commands","p"),config:Y.join(r,".claude"),router:Y.join(r,".claude","commands","p.md")},gemini:{commands:Y.join(r,".gemini","commands"),config:Y.join(r,".gemini"),router:Y.join(r,".gemini","commands","p.toml")}}}var xl,LP,ve,Rn=y(()=>{"use strict";is();F();ct();l(OP,"loadModuleConfig");l(FP,"composeGlobalTemplate");l(_P,"installDocs");l(NP,"installGlobalConfig");xl=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Tl.homedir(),this.templatesDir=Y.join(me,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(ze(),vt(at)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Y.join(t.configDir,"commands"):this.claudeCommandsPath=Y.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await K.access(this.claudeConfigPath),!0}catch(e){if(k(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=Ks("commands/");if(e.length>0)return e.filter(t=>t.endsWith(".md")).map(t=>t.replace("commands/",""));try{return(await K.readdir(this.templatesDir)).filter(n=>n.endsWith(".md"))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(ze(),vt(at)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await K.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Y.join(this.claudeCommandsPath,a),u=Pe(`commands/${a}`);if(u)await K.writeFile(c,u,"utf-8");else{let d=Y.join(this.templatesDir,a),m=await K.readFile(d,"utf-8");await K.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=Y.join(this.claudeCommandsPath,s);await K.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await K.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 K.access(this.claudeCommandsPath);let n=(await K.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(k(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(Pe(`commands/${e}.md`))return!0;try{let n=Y.join(this.templatesDir,`${e}.md`);return await K.access(n),!0}catch(n){if(k(n))return!1;throw n}}async installRouter(){let t=await(ze(),vt(at)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Y.join(t.configDir,"commands",n);await K.mkdir(Y.dirname(s),{recursive:!0});let o=Pe(`commands/${n}`);if(o)return await K.writeFile(s,o,"utf-8"),!0;let i=Y.join(this.templatesDir,n),a=await K.readFile(i,"utf-8");return await K.writeFile(s,a,"utf-8"),!0}catch(s){if(k(s))return!1;throw s}}async removeLegacyCommands(){let t=await(ze(),vt(at)).getActiveProvider(),n=Y.join(t.configDir,"commands"),s=0;try{let i=(await K.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await K.unlink(Y.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 K.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await K.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(k(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Y.join(this.claudeCommandsPath,o),a=n.includes(o),c=Pe(`commands/${o}`);if(c)await K.writeFile(i,c,"utf-8");else{let u=Y.join(this.templatesDir,o),d=await K.readFile(u,"utf-8");await K.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 NP()}async installDocs(){return _P()}};l(Xm,"getProviderPaths");LP=new xl,ve=LP});function UP(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function HP(r){let e=[],t=UP(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(El,o+i.length);if(c===-1)continue;let u=c+El.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Yr(r,e){let t=HP(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
451
|
-
|
|
452
|
-
---
|
|
453
|
-
|
|
454
|
-
`,n+=`## Your Customizations
|
|
455
|
-
|
|
456
|
-
`,n+=`_The sections below are preserved during sync. Edit freely._
|
|
457
|
-
|
|
458
|
-
`;for(let s of t)n+=s.content,n+=`
|
|
459
|
-
|
|
460
|
-
`;return`${n.trimEnd()}
|
|
461
|
-
`}function Qr(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(`
|
|
462
|
-
`);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(El)&&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 El,ji=y(()=>{"use strict";El="<!-- /prjct:preserve -->";l(UP,"createPreserveStartRegex");l(HP,"extractPreservedSections");l(Yr,"mergePreservedSections");l(Qr,"validatePreserveBlocks")});function Zr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&GP.has(e.code))return!0;if(e.code&&Qm.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 Ri(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Qm.has(e.code))}function Ym(r,e,t){let n=$n.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?($n.delete(r),!1):!0:!1}function Al(r,e){let t=$n.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),$n.set(r,t)}function zP(r){$n.delete(r)}var GP,Qm,$n,Di,Zm,eo,$i=y(()=>{"use strict";GP=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Qm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Zr,"isTransientError");l(Ri,"isPermanentError");$n=new Map;l(Ym,"isCircuitOpen");l(Al,"recordFailure");l(zP,"recordSuccess");Di=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(Ym(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 zP(t),o}catch(o){if(n=o,s++,Ri(o))throw Al(t,this.options.circuitBreakerThreshold),o;if(!(Zr(o)&&s<this.options.maxAttempts))throw Al(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 Al(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Zr(e)}isCircuitOpen(e){return Ym(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return $n.get(e)}resetCircuit(e){$n.delete(e)}resetAllCircuits(){$n.clear()}},Zm=new Di({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),eo=new Di({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var eg=y(()=>{"use strict";ji();$i()});import Mi from"node:fs/promises";import Il from"node:path";var jl,tg,ng=y(()=>{"use strict";qe();ne();F();jl=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=P.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Mi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Mi.readFile(Il.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return k(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=Il.join(this.agentsPath,`${e}.md`),n=await Mi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return k(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=Il.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})}
|
|
463
|
-
`;await Mi.appendFile(s,o)}catch(s){k(s)||console.error(`Agent usage log error: ${w(s)}`)}}},tg=jl});import sg from"node:path";async function BP(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await T(sg.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await T(sg.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function VP(){return{...JP}}function qP(){return{...WP}}async function rg(){return Oi||(Oi=await BP()?VP():qP(),Oi)}var Oi,JP,WP,og=y(()=>{"use strict";be();Oi=null,JP={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}},WP={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(BP,"isClaudeEnvironment");l(VP,"getClaudeAgent");l(qP,"getTerminalAgent");l(rg,"detect")});var XP,Dl=y(()=>{XP=Jd({})});var YP,Fi,Xs,ig=y(()=>{"use strict";ng();pn();og();$i();Dl();YP=["claude"],Fi=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new tg}async initialize(){return this.agent?this.agent:await Zm.execute(async()=>{if(this.agentInfo=await rg(),!this.agentInfo?.isSupported)throw Dr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!YP.includes(e))throw Dr.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await XP(`../infrastructure/${e}-agent`);return this.agent=new t,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:`
|
|
464
|
-
AGENTIC EXECUTION:
|
|
465
|
-
- Read: templates/agentic/orchestrator.md
|
|
466
|
-
- Analyze task: "${e}"
|
|
467
|
-
- Available specialists: ${s.join(", ")}
|
|
468
|
-
- Claude decides which agent(s) to use
|
|
469
|
-
- Always prefer specialists over generalist
|
|
470
|
-
- Fragment complex tasks into subtasks
|
|
471
|
-
`}}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}},Xs=new Fi});var _i,Ni,ag=y(()=>{"use strict";_i=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"}},Ni=new _i});var cg,QP,Li,ZP,lg=y(()=>{"use strict";zr();cg=8e4,QP={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"]},Li=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||cg,[c,u,d]=await Promise.all([Ke.readIndex(t),Ke.readDomains(t),Ke.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let E of m){let $=d.domainIndex[E]||[];for(let O of $)p.add(O)}if(i&&d.domainIndex.general){let E=d.domainIndex.general.slice(0,10);for(let $ of E)p.add($)}let g=c.relevantFiles.filter(E=>p.has(E.path)&&E.score>=o);g.sort((E,$)=>$.score-E.score);let f=0,S=[];for(let E of g){let $=Math.ceil(E.size/this.CHARS_PER_TOKEN);if(f+$>a||S.length>=s)break;S.push(E),f+=$}let v=Math.ceil(c.relevantFiles.reduce((E,$)=>E+$.size,0)/this.CHARS_PER_TOKEN),x=v>0?(v-f)/v:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:x,estimatedTokensSaved:v-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(QP))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 Ke.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 Ke.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ke.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||cg,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)}},ZP=new Li});import ug from"node:path";var Rl,Ui,eC,dg=y(()=>{"use strict";zr();re();Rl=[{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"}],Ui=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 Rl)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=ug.dirname(i.path);n.get(u).add(`**/${ug.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=Rl.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Rl)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:Ht,projectId:e,domains:t,discoveredAt:s};await Ke.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:Ht,lastUpdate:s,fileCategories:n,domainIndex:i};await Ke.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ke.readDomains(e),Ke.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 Ke.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 Ke.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:Ht,lastUpdate:b(),fileCategories:u,domainIndex:d};await Ke.writeCategories(e,m)}return o}},eC=new Ui});import $l from"node:path";var Ml,tC,nC,Hi,pg,Ol=y(()=>{"use strict";Ml=30,tC=[/^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$/],nC=[/^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],Hi=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=Ml){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=$l.basename(e.path);for(let n of tC)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=$l.basename(e.path);for(let s of nC)if(s.test(t))return 15;let n=$l.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}},pg=new Hi});import{execSync as Fl}from"node:child_process";var Gi,_l,zi,Ys,Ji=y(()=>{"use strict";Lr();Gi={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"}},_l=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=Gi[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=Gi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new zi(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=Gi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
472
|
-
`);throw new zi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
473
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Gi),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=Fl(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:Nr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Fl(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Fl(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Nr(`${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())}},zi=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}},Ys=new _l});import{exec as sC}from"node:child_process";import{promisify as rC}from"node:util";var VF,mg=y(()=>{"use strict";Zt();Ji();VF=rC(sC)});var Wi,lt,Nl=y(()=>{"use strict";qe();ne();Dn();F();re();Ur();Wi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;let i=P.getFilePath(o,"memory","context.jsonl"),a={timestamp:b(),action:t,data:n,author:s};await _s(i,a)}catch(o){k(o)||console.error(`Memory log error: ${w(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);if(!n)return[];let s=P.getFilePath(n,"memory","context.jsonl");return(await gn(s)).slice(-t)}catch(n){return!k(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${w(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){return(await this.getRecent(e,1e3)).filter(o=>o.action===t).slice(-n)}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;let n=P.getFilePath(t,"memory","context.jsonl");await oi(n,[])}catch(t){k(t)||console.error(`Memory clear error: ${w(t)}`)}}async getRecentEvents(e,t=100){try{let n=P.getFilePath(e,"memory","context.jsonl");return(await gn(n)).slice(-t)}catch(n){return!k(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${w(n)}`),[]}}async capEntries(e){try{let t=P.getFilePath(e,"memory","context.jsonl"),n=await gn(t);if(n.length<=Lt.MEMORY_MAX_ENTRIES)return 0;let s=n.slice(0,n.length-Lt.MEMORY_MAX_ENTRIES),o=n.slice(-Lt.MEMORY_MAX_ENTRIES);return kt.archiveMany(e,s.map((i,a)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||a}`,entityData:i,summary:i.action,reason:"overflow"}))),await oi(t,o),s.length}catch(t){return k(t)||console.error(`Memory cap error: ${w(t)}`),0}}},lt=new Wi});import Bi from"node:fs/promises";import Me from"node:path";var to,Ll=y(()=>{"use strict";ne();be();to=class{static{l(this,"NestedContextResolver")}rootPath;monoInfo=null;constructor(e){this.rootPath=Me.resolve(e)}async initialize(){this.monoInfo=await P.detectMonorepo(this.rootPath)}async discoverContextFiles(){let e=[],t=Me.join(this.rootPath,"PRJCT.md");if(await T(t)){let s=await this.loadContext(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=Me.join(s.path,"PRJCT.md");if(await T(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadContext(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedContexts(this.rootPath,e);return e.push(...n),e}async loadContext(e,t,n=null){let s=await Bi.readFile(e,"utf-8"),o=Me.relative(this.rootPath,e),i=o.split(Me.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,sections:this.parseSections(s),package:n}}parseSections(e){let t=[],n=e.split(`
|
|
474
|
-
`),s=null,o=[];for(let i of n){let a=i.match(/^##\s+(.+)$/);if(a){s&&(s.content=o.join(`
|
|
475
|
-
`).trim(),t.push(s));let c=a[1],u=c.includes("@override")||c.includes("(override)");s={name:c.replace(/@override|\(override\)/gi,"").trim(),content:"",override:u},o=[]}else s&&o.push(i)}return s&&(s.content=o.join(`
|
|
476
|
-
`).trim(),t.push(s)),t}async scanForNestedContexts(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Bi.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let d=Me.join(i,u.name),m=Me.join(d,"PRJCT.md");if(await T(m)&&!s.has(m)){let p=this.findParentContext(m,t.concat(n)),g=await this.loadContext(m,p);n.push(g),s.add(m),p&&p.children.push(g)}await o(d,a+1)}}catch{}},"scan");return await o(e,0),n}findParentContext(e,t){let n=Me.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=Me.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveContextForPath(e){let t=await this.discoverContextFiles(),n=Me.resolve(e),s=null;for(let a of t){let c=Me.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{content:"",sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeContextChain(o)}mergeContextChain(e){let t=new Map,n=[],s=[];for(let i of e){n.push(i.relativePath);for(let a of i.sections)if(a.override||!t.has(a.name))t.set(a.name,a.content),a.override&&s.push(`${i.relativePath}:${a.name}`);else{let c=t.get(a.name)||"";t.set(a.name,`${c}
|
|
477
|
-
|
|
478
|
-
${a.content}`)}}let o=[];for(let[i,a]of t)o.push(`## ${i}
|
|
479
|
-
|
|
480
|
-
${a}`);return{content:o.join(`
|
|
481
|
-
|
|
482
|
-
---
|
|
483
|
-
|
|
484
|
-
`),sources:n,overrides:s}}async getPackageContext(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveContextForPath(t.path):null}async getAllPackageContexts(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveContextForPath(t.path);e.set(t.name,n)}return e}async discoverAgentFiles(){let e=[],t=Me.join(this.rootPath,"AGENTS.md");if(await T(t)){let s=await this.loadAgents(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=Me.join(s.path,"AGENTS.md");if(await T(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadAgents(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedAgents(this.rootPath,e);return e.push(...n),e}async loadAgents(e,t,n=null){let s=await Bi.readFile(e,"utf-8"),o=Me.relative(this.rootPath,e),i=o.split(Me.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,agents:this.parseAgents(s),package:n}}parseAgents(e){let t=[],n=e.split(`
|
|
485
|
-
`),s=null,o=null,i=[],a=l(()=>{if(s){if(o){let c=i.join(`
|
|
486
|
-
`).trim();switch(o.toLowerCase()){case"triggers":s.triggers=this.parseListItems(c);break;case"rules":s.rules=this.parseListItems(c);break;case"patterns":s.patterns=this.parseCodeBlocks(c);break;case"examples":s.examples=this.parseListItems(c);break;case"domain":s.domain=c;break}}else{let c=i.join(`
|
|
487
|
-
`).trim();c&&!s.description&&(s.description=c)}i=[]}},"saveCurrentContent");for(let c of n){let u=c.match(/^##\s+([^#].+)$/);if(u){s&&(a(),t.push(s));let m=u[1],p=m.includes("@override")||m.includes("(override)");s={name:m.replace(/@override|\(override\)/gi,"").trim(),description:"",override:p},o=null,i=[];continue}let d=c.match(/^###\s+(.+)$/);if(d&&s){a(),o=d[1].trim(),i=[];continue}s&&i.push(c)}return s&&(a(),t.push(s)),t}parseListItems(e){return e.split(`
|
|
488
|
-
`).filter(t=>t.match(/^\s*[-*]\s+/)).map(t=>t.replace(/^\s*[-*]\s+/,"").trim()).filter(t=>t.length>0)}parseCodeBlocks(e){let t=[],n=/```[\w]*\n([\s\S]*?)```/g,s;for(;(s=n.exec(e))!==null;)t.push(s[1].trim());return t.length===0&&e.trim()&&t.push(e.trim()),t}async scanForNestedAgents(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Bi.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let d=Me.join(i,u.name),m=Me.join(d,"AGENTS.md");if(await T(m)&&!s.has(m)){let p=this.findParentAgents(m,t.concat(n)),g=await this.loadAgents(m,p);n.push(g),s.add(m),p&&p.children.push(g)}await o(d,a+1)}}catch{}},"scan");return await o(e,0),n}findParentAgents(e,t){let n=Me.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=Me.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveAgentsForPath(e){let t=await this.discoverAgentFiles(),n=Me.resolve(e),s=null;for(let a of t){let c=Me.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{agents:[],sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeAgentsChain(o)}mergeAgentsChain(e){let t=new Map,n=[],s=[];for(let o of e){n.push(o.relativePath);for(let i of o.agents){let a=t.get(i.name);if(i.override||!a)t.set(i.name,{...i}),i.override&&a&&s.push(`${o.relativePath}:${i.name}`);else{let c={...a};i.triggers&&(c.triggers=[...a.triggers||[],...i.triggers]),i.rules&&(c.rules=[...a.rules||[],...i.rules]),i.patterns&&(c.patterns=[...a.patterns||[],...i.patterns]),i.examples&&(c.examples=[...a.examples||[],...i.examples]),i.description&&(c.description=`${a.description}
|
|
489
|
-
|
|
490
|
-
${i.description}`),i.domain&&(c.domain=i.domain),t.set(i.name,c)}}}return{agents:Array.from(t.values()),sources:n,overrides:s}}async getPackageAgents(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveAgentsForPath(t.path):null}async getAllPackageAgents(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveAgentsForPath(t.path);e.set(t.name,n)}return e}}});import{exec as oC}from"node:child_process";import{promisify as iC}from"node:util";var m_,gg=y(()=>{"use strict";zr();re();Ol();m_=iC(oC)});import no from"chalk";function bt(r,e={}){if(e.quiet)return;let t=cC[r]||"idle",n=zs.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:aC[o]||o}));console.log(no.dim(`
|
|
491
|
-
Next:`));for(let o of s){let i=no.cyan(o.cmd.padEnd(12));console.log(no.dim(` ${i} \u2192 ${o.desc}`))}}function so(r){let e=zs.getStateInfo(r);console.log(no.dim(`\u{1F4CD} State: ${no.white(r.toUpperCase())} - ${e.description}`))}var aC,cC,ro=y(()=>{"use strict";ol();aC={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"},cC={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(so,"showStateInfo")});import It from"chalk";import as from"prompts";var Ul,fg,Qs,hg=y(()=>{"use strict";en();Ul=[{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."}],fg=[{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"}],Qs=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,as.override({})}async run(){this.printWelcome();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++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return 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=await as({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:Ul.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:Ul.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await as({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:fg.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(It.dim(`
|
|
345
|
+
`);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 Zb(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
346
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.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 eC(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
347
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.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 tC(r,e,t,n){let s=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of tl)await s(de.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(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Kn(r){try{let e=await lt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=A.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of tl){let m=de.join(t,u),p=await Kn(m);if(p!==null){$.setDoc(r,d,p),Cm(r,d,p);try{await lt.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Kn(s);if(o!==null){$.setDoc(r,"project",o);try{await lt.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
|
|
348
|
+
`).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,S,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 S of p)try{let b=JSON.parse(S),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,S,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...el.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Kn(d);if(m===null)continue;let p=el.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),vm(r,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var tl,el,xi=y(()=>{"use strict";Ce();_();he();tl=[{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"}],el=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Wr,"migrateJsonToSqlite");l(zb,"createBackup");l(Zc,"copyFiles");l(Cm,"populateNormalized");l(Wb,"populateTasksFromState");l(Bb,"populateQueueTasks");l(Vb,"populateIdeas");l(Jb,"populateShippedFeatures");l(qb,"populateMetricsDaily");l(Kb,"populateAnalysis");l(vm,"populateIndexTables");l(Yb,"populateCategoriesIndex");l(Xb,"migrateChecksums");l(Qb,"migrateFileScores");l(Zb,"migrateEventsJsonl");l(eC,"migrateLearningsJsonl");l(tC,"cleanupJsonFiles");l(Kn,"readJsonSafe");l(vi,"sweepLegacyJson")});var xm=y(()=>{"use strict";uc();_()});var nl,sl,rl=y(()=>{"use strict";vs();Qt();nl=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:kp,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}},sl=new nl});var Ut=y(()=>{"use strict";Ci();bn();he();Ar();Gr();zr();xi();jr();Dr();$r();xm();Qt();rl()});function st(r,e,t=2){return`${"#".repeat(t)} ${r}
|
|
349
|
+
${e}`}function Gt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
350
|
+
`)}function ol(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}`);let t=e.length>0?`
|
|
351
|
+
${e.join(" | ")}`:"";return`## ${r.description}${t}`}function il(r,e){return`### Subtasks
|
|
352
|
+
${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
|
|
353
|
+
`)}`}function Pm(r){return`### Rules
|
|
354
|
+
${Gt(r)}`}function Qe(r){return`### Next
|
|
355
|
+
${r.map(t=>`- ${t.label}: \`${t.command}\``).join(`
|
|
356
|
+
`)}`}function zt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- **${t}:** ${n}`);return e.join(`
|
|
357
|
+
`)}function en(r,e){return e?`## ${r} \u2713
|
|
358
|
+
${e}`:`## ${r} \u2713`}function Tn(r){return`> \u26A0\uFE0F ${r}`}function Ie(...r){return r.filter(Boolean).join(`
|
|
359
|
+
|
|
360
|
+
`)}var _s=y(()=>{"use strict";l(st,"mdSection");l(Gt,"mdList");l(ol,"mdTaskHeader");l(il,"mdSubtasks");l(Pm,"mdRules");l(Qe,"mdNextSteps");l(zt,"mdStats");l(en,"mdDone");l(Tn,"mdWarn");l(Ie,"mdJoin")});import Br from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Em[r]||"idle",n=Hn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Tm[o]||o}));console.log(Br.dim(`
|
|
361
|
+
Next:`));for(let o of s){let i=Br.cyan(o.cmd.padEnd(12));console.log(Br.dim(` ${i} \u2192 ${o.desc}`))}}function Pi(r){let e=Em[r]||"idle";return Hn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Tm[n]||n}))}function Vr(r){let e=Hn.getStateInfo(r);console.log(Br.dim(`\u{1F4CD} State: ${Br.white(r.toUpperCase())} - ${e.description}`))}var Tm,Em,Ns=y(()=>{"use strict";fc();Tm={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"},Em={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(Pi,"getNextSteps");l(Vr,"showStateInfo")});import It from"chalk";import Yn from"prompts";var al,Im,Ls,Am=y(()=>{"use strict";Nt();al=[{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."}],Im=[{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"}],Ls=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,Yn.override({})}async run(){this.printWelcome();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++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return 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=await Yn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:al.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:al.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Yn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Im.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(It.dim(`
|
|
492
362
|
Detected: ${e}
|
|
493
|
-
`));let t=await
|
|
363
|
+
`));let t=await Yn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Yn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.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 Yn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(It.bold(" Configuration Summary")),console.log(It.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${It.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${It.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${It.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${It.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${It.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Yn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}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}}printWelcome(){console.log(""),console.log(It.bold.cyan(" Welcome to prjct-cli!")),console.log(It.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(It.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(It.yellow(`
|
|
494
364
|
Setup cancelled. Run again anytime.
|
|
495
|
-
`))}getProjectTypeLabel(e){return
|
|
496
|
-
`).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}},dC=new Vi,ut=dC});var qi,pC,Gl,yg=y(()=>{"use strict";cs();qi=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ut.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 ut.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 ut.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(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,v)=>S+v.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let v=this.parseVariance(S.variance),x=this.parseDuration(S.estimatedDuration);return x===0?!1:Math.abs(v)/x<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(v=>v.completedAsPlanned))for(let v of S.tags||[])g.set(v,(g.get(v)||0)+1);let f=[...g.entries()].sort((S,v)=>v[1]-S[1]).slice(0,3).map(([S])=>S);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 ut.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 ut.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}},pC=new qi,Gl=pC});var oo,Ki,zl,Jl=y(()=>{"use strict";Ls();re();oo=3,Ki=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>=oo){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}/${oo} 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>=oo){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}/${oo} 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>=oo&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
497
|
-
`)}},
|
|
498
|
-
`);let n=e.outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,5);if(n.length>0){t.push("## Recent Outcomes"),t.push("");for(let s of n){let o=s.success?.overallSuccess??"unknown",i=s.roi.roiScore,a=ht(s.shippedAt);t.push(`- **${s.featureName}** (${o}, ROI: ${i}) - ${a}`),s.learnings.whatWorked.length>0&&t.push(` What worked: ${s.learnings.whatWorked.slice(0,2).join(", ")}`),s.learnings.whatDidnt.length>0&&t.push(` Issues: ${s.learnings.whatDidnt.slice(0,2).join(", ")}`)}t.push("")}if(e.aggregates&&(t.push("## Aggregate Metrics"),t.push(""),t.push(`- Features: ${e.aggregates.totalFeatures}`),t.push(`- Estimation Accuracy: ${e.aggregates.averageEstimationAccuracy}%`),t.push(`- Success Rate: ${e.aggregates.averageSuccessRate}%`),t.push(`- Average ROI: ${e.aggregates.averageROI}`),t.push(""),e.aggregates.topLearnings.length>0)){t.push("### Top Learnings"),t.push("");for(let s of e.aggregates.topLearnings.slice(0,5))t.push(`- ${s.insight} (${s.frequency}x)`);t.push("")}return t.join(`
|
|
499
|
-
`)}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:wi([t,...n.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?wi(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:wi(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=hm(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=ym(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:wm(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}},wg=new Xi});var Bl=y(()=>{"use strict";hg();yg();Jl();cs();Wl()});import rn from"chalk";function mC(r){return kg[r.toLowerCase()]||kg.default}var kg,Vl,Yi,Sg=y(()=>{"use strict";kg={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(mC,"getIcon");Vl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(rn.cyan(`
|
|
365
|
+
`))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Im.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 nC,sC,Ti,rC,gt,Xn=y(()=>{"use strict";Ce();Ot();xe();nC="outcomes",sC="outcomes.jsonl",Ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return cl.join(t,nC)}getOutcomesPath(e){return cl.join(this.getOutcomesDir(e),sC)}async record(e,t){let n={...t,id:Se()},s=this.getOutcomesPath(e);return await Mt(cl.dirname(s)),await Ia(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await fs(t);return n.trim()?n.trim().split(`
|
|
366
|
+
`).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}},rC=new Ti,gt=rC});var Ei,oC,ll,jm=y(()=>{"use strict";Xn();Ei=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,s=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:s,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 s=[];for(let[o,i]of n){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),D=this.parseDuration(S.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);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 gt.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 gt.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}},oC=new Ei,ll=oC});var Jr,Ii,ul,dl=y(()=>{"use strict";Ps();le();Jr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Jr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
367
|
+
`)}},ul=new Ii});var Ai,Dm,pl=y(()=>{"use strict";tc();Qt();le();Ai=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...np,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Fo([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?Fo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Fo(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=sp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=rp(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:op(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}},Dm=new Ai});var ml=y(()=>{"use strict";Am();jm();dl();Xn();pl()});import tn from"chalk";function iC(r){return Rm[r.toLowerCase()]||Rm.default}var Rm,gl,ji,$m=y(()=>{"use strict";Rm={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(iC,"getIcon");gl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(tn.cyan(`
|
|
500
368
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
501
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
502
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
503
|
-
`)}function
|
|
504
|
-
`)}var
|
|
369
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=iC(t);console.log(tn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(tn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(tn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(tn.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?tn.green("\u2713"):tn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${tn.dim(`(${n})`)}
|
|
370
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${tn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(tn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ji=new gl});import Ze 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)%Mm.length;return Mm[t]}function cC(r,e,t="\u25B6"){let n=Ze.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=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function lC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(cC(t,r[t]));return e.push(""),e.join(`
|
|
371
|
+
`)}function Om(r){console.log(lC(r))}var Mm,Fm=y(()=>{"use strict";Mm=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(aC,"getDomainColor");l(cC,"formatSubtaskLine");l(lC,"renderSubtaskProgress");l(Om,"printSubtaskProgress")});function uC(r){return _m.includes(r)}async function dC(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 pC(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(`
|
|
372
|
+
`)}var _m,mC,Di,Nm=y(()=>{"use strict";_m=["ship","feature","spec","cleanup","migrate"];l(uC,"requiresReasoning");l(dC,"reason");l(pC,"formatPlan");mC={requiresReasoning:uC,reason:dC,formatPlan:pC,REASONING_REQUIRED_COMMANDS:_m},Di=mC});import qr from"node:fs/promises";var fl,gC,ft,hl=y(()=>{"use strict";Ve();Ce();_();Jo();fl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ft({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=A.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:A.getFilePath(n,"core","now.md"),next:A.getFilePath(n,"core","next.md"),context:A.getFilePath(n,"core","context.md"),shipped:A.getFilePath(n,"progress","shipped.md"),metrics:A.getFilePath(n,"progress","metrics.md"),ideas:A.getFilePath(n,"planning","ideas.md"),roadmap:A.getFilePath(n,"planning","roadmap.md"),specs:A.getFilePath(n,"planning","specs"),memory:A.getFilePath(n,"memory","context.jsonl"),patterns:A.getFilePath(n,"memory","patterns.json"),analysis:A.getFilePath(n,"analysis","repo-summary.md"),codePatterns:A.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 qr.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([qr.readFile(d,"utf-8"),qr.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 qr.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 qr.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},gC=new fl,ft=gC});import{exec as fC}from"node:child_process";import Ae from"node:fs/promises";import Lm from"node:os";import En from"node:path";import{promisify as hC}from"node:util";function Hm(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 yl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
505
373
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
506
374
|
`}),r.recommendations.length>0&&(e+=`
|
|
507
375
|
Recommendations:
|
|
508
376
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
509
|
-
`})),e}async function
|
|
510
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=Mn.join(r.projectPath,"package.json");try{let i=await xe.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(k(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 xe.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}.*${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(k(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await xe.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(k(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function jg(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await xe.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(k(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await xe.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.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(k(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await xe.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(k(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Dg(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await xe.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(k(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await xe.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(k(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Rg(r){let e=[],t=[],n={},s=Mn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await xe.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(k(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Mn.join(Tg.homedir(),".prjct-cli");try{await xe.access(o,xe.constants.W_OK),n.globalPathWritable=!0}catch(i){if(k(i))try{await xe.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 $g(r){let e=[],t=[],n={},s=Mn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await xe.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(k(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=Mn.join(Tg.homedir(),".prjct-cli/projects",o||"");try{await xe.access(i),n.globalStorageExists=!0}catch(a){if(k(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 Mg(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 xe.access(Mn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!k(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 xe.stat(Mn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!k(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Og(r){let e=[],t=[],n={},s=r.paths.specs;try{await xe.access(s),n.specsExists=!0;let i=await xe.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(k(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 _g(r,e,t){let n=Fg[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 TC(r,e,t){let n=await _g(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function EC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var vC,Fg,AC,Zi,Ng=y(()=>{"use strict";F();vC=CC(PC);l(Eg,"formatDuration");l(Xl,"escapeRegex");l(xC,"formatWarnings");l(Ag,"verifyDone");l(Ig,"verifyShip");l(jg,"verifyFeature");l(Dg,"verifyNow");l(Rg,"verifyInit");l($g,"verifySync");l(Mg,"verifyAnalyze");l(Og,"verifySpec");Fg={done:Ag,ship:Ig,feature:jg,now:Dg,init:Rg,sync:$g,analyze:Mg,spec:Og};l(_g,"verify");l(TC,"prepareCommand");l(EC,"requiresVerification");AC={verify:_g,prepareCommand:TC,requiresVerification:EC,verifiers:Fg,formatWarnings:xC,formatDuration:Eg,escapeRegex:Xl,verifyDone:Ag,verifyShip:Ig,verifyFeature:jg,verifyNow:Dg,verifyInit:Rg,verifySync:$g,verifyAnalyze:Mg,verifySpec:Og},Zi=AC});function jC(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 DC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of IC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:jC(t)};return{detected:!1}}function RC(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 $C(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 MC(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 OC(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 IC,Yl,FC,Zs,Lg=y(()=>{"use strict";IC=[{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(jC,"getHallucinationSuggestion");l(DC,"detectHallucination");l(RC,"isSimilarError");l($C,"analyzeErrorPattern");l(MC,"generateEscalationMessage");l(OC,"generateSuggestion");Yl=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=>RC(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=$C(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:MC(e,o,this.maxAttempts),suggestion:OC(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 DC(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}}},FC=new Yl,Zs=FC});function Ql(r,e){let t=ao(e),n=_C[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 NC(r,e){let t=ao(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function LC(r,e,t){let n=ao(t),s=Ql(r,t),o=Ql(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function ea(r,e=jn){let t=ao(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=UC(r,e),s=HC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=JC(o),a=GC(o),c=zC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=WC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Hg(r,e,t=jn){let n=ao(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 UC(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=LC(i,s,e);if(!t.has(a)){let c=Ql(i,e),u=NC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function HC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+BC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>eu(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 GC(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 zC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=eu(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function JC(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 WC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=eu(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 eu(r){if(!r.variance)return 0;let e=Zl(r.estimatedDuration),t=Zl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Zl(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 Gg(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(`
|
|
511
|
-
`)}function
|
|
377
|
+
`})),e}async function Um(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ae.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=Hm(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 Ae.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 Ae.access(En.dirname(i),Ae.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 Gm(r){let e=[],t=[],n={};try{let{stdout:i}=await yC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
378
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=En.join(r.projectPath,"package.json");try{let i=await Ae.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 Ae.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}.*${yl(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 Ae.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 zm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.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 Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(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 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(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.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 Ae.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 Bm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.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=En.join(Lm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(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 Vm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.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=En.join(Lm.homedir(),".prjct-cli/projects",o||"");try{await Ae.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 Jm(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 Ae.access(En.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 Ae.stat(En.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 qm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.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 Ym(r,e,t){let n=Km[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 SC(r,e,t){let n=await Ym(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function kC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var yC,Km,bC,Ri,Xm=y(()=>{"use strict";_();yC=hC(fC);l(Hm,"formatDuration");l(yl,"escapeRegex");l(wC,"formatWarnings");l(Um,"verifyDone");l(Gm,"verifyShip");l(zm,"verifyFeature");l(Wm,"verifyNow");l(Bm,"verifyInit");l(Vm,"verifySync");l(Jm,"verifyAnalyze");l(qm,"verifySpec");Km={done:Um,ship:Gm,feature:zm,now:Wm,init:Bm,sync:Vm,analyze:Jm,spec:qm};l(Ym,"verify");l(SC,"prepareCommand");l(kC,"requiresVerification");bC={verify:Ym,prepareCommand:SC,requiresVerification:kC,verifiers:Km,formatWarnings:wC,formatDuration:Hm,escapeRegex:yl,verifyDone:Um,verifyShip:Gm,verifyFeature:zm,verifyNow:Wm,verifyInit:Bm,verifySync:Vm,verifyAnalyze:Jm,verifySpec:qm},Ri=bC});function vC(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 xC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of CC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:vC(t)};return{detected:!1}}function PC(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 TC(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 EC(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 IC(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 CC,wl,AC,Hs,Qm=y(()=>{"use strict";CC=[{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(vC,"getHallucinationSuggestion");l(xC,"detectHallucination");l(PC,"isSimilarError");l(TC,"analyzeErrorPattern");l(EC,"generateEscalationMessage");l(IC,"generateSuggestion");wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",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=>PC(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=TC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:EC(e,o,this.maxAttempts),suggestion:IC(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 xC(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}}},AC=new wl,Hs=AC});function Sl(r,e){let t=Kr(e),n=jC[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 DC(r,e){let t=Kr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function RC(r,e,t){let n=Kr(t),s=Sl(r,t),o=Sl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=kn){let t=Kr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=$C(r,e),s=MC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=_C(o),a=OC(o),c=FC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=NC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function eg(r,e,t=kn){let n=Kr(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 $C(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=RC(i,s,e);if(!t.has(a)){let c=Sl(i,e),u=DC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function MC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+LC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber: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 OC(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 FC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function _C(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 NC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(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 bl(r){if(!r.variance)return 0;let e=kl(r.estimatedDuration),t=kl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function kl(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 tg(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(`
|
|
379
|
+
`)}function LC(r){if(!r.estimatedDuration)return 0;let e=kl(r.estimatedDuration);if(e<=0)return 0;let t=Zm[0],n=Number.POSITIVE_INFINITY;for(let s of Zm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Kr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var jC,Zm,Cl=y(()=>{"use strict";vs();jC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Sl,"getSprintStart");l(DC,"getSprintEnd");l(RC,"getSprintNumber");l($i,"calculateVelocity");l(eg,"projectCompletion");l($C,"bucketBySprint");l(MC,"buildSprintVelocities");l(OC,"detectTrend");l(FC,"calculateOverallAccuracy");l(_C,"calculateAverageVelocity");l(NC,"detectEstimationPatterns");l(bl,"parseVariancePercent");l(kl,"parseDurationMinutes");l(tg,"formatVelocityContext");Zm=[{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(LC,"derivePoints");l(Kr,"resolveConfig")});import{exec as HC}from"node:child_process";import UC from"node:fs/promises";import Mi from"node:path";import{promisify as GC}from"node:util";async function Yr(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=JC(r),c=await qC(e),u=await KC(e),d=[];for(let p of c){if(!i&&XC(p))continue;let g=YC(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 JC(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 qC(r){let e=[];async function t(n,s=""){try{let o=await UC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mi.join(n,i.name),c=Mi.join(s,i.name);if(i.isDirectory()){if(VC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mi.extname(i.name).toLowerCase();BC.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function KC(r){let e=new Map;try{let{stdout:t}=await zC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
512
380
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
513
381
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
514
382
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
515
383
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
516
|
-
`).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
|
|
384
|
+
`).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 YC(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(WC))for(let S of f)if(c.includes(S)&&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=Mi.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 XC(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 zC,WC,BC,VC,vl=y(()=>{"use strict";_();zC=GC(HC),WC={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"]},BC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),VC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Yr,"findRelevantFiles");l(JC,"extractKeywords");l(qC,"getAllCodeFiles");l(KC,"getGitRecency");l(YC,"scoreFile");l(XC,"isTestFile")});import{exec as QC}from"node:child_process";import{promisify as ZC}from"node:util";async function Qr(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 nv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await tv(r,t);return o=o.filter(c=>!sv(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 tv(r,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
517
385
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
518
386
|
NF {
|
|
519
387
|
count[$0]++
|
|
@@ -523,8 +391,8 @@ Recommendations:
|
|
|
523
391
|
for (f in count) print count[f], lastmod[f], f
|
|
524
392
|
}
|
|
525
393
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
526
|
-
`).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),S=Math.max(0,1-g/30),
|
|
527
|
-
`).filter(Boolean),{stdout:i}=await
|
|
394
|
+
`).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),S=Math.max(0,1-g/30),b=u/i,D=S*.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 nv(r){let{stdout:e}=await Xr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
395
|
+
`).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
528
396
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
529
397
|
NF {
|
|
530
398
|
count[$0]++
|
|
@@ -534,10 +402,10 @@ Recommendations:
|
|
|
534
402
|
for (f in count) print count[f], lastmod[f], f
|
|
535
403
|
}
|
|
536
404
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
537
|
-
`).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),S=p[3],
|
|
538
|
-
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:
|
|
405
|
+
`).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),S=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),O=Math.max(0,1-D/14),F=g/d,K=O*.5+F*.5,oe;x<1?oe="just now":x<24?oe=`${x}h ago`:oe=`${D}d ago`,a.push({path:S,changes:g,heatScore:Math.round(K*100)/100,lastChanged:oe,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function sv(r){let e=r.split("/").pop()||"";for(let t of ev)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,ev,xl=y(()=>{"use strict";Xr=ZC(QC),ev=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(tv,"getHotFilesFromCommits");l(nv,"getBranchOnlyFiles");l(sv,"shouldIgnore")});function Oi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function ng(r,e){let t=rv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Tl(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zr(r,e){let t=Oi(r),n=Oi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=ng(s,ov),a=Pl.map(c=>({model:c,...ng(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Tl(i.total),byModel:a}}}function Qn(r){let e=Oi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Pl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Fi(r){if(r.length===0)return Qn("");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=Pl.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:Tl(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 rv,ov,Pl,eo=y(()=>{"use strict";rv={"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}},ov="claude-sonnet-4.5";l(Oi,"countTokens");Pl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(ng,"calculateModelCost");l(Tl,"formatCostSaved");l(Zr,"measureCompression");l(Qn,"noCompression");l(Fi,"combineMetrics");l(iv,"formatTokenCount");l(av,"formatCompressionRate")});import og from"node:fs/promises";import In from"node:path";async function An(r,e=process.cwd()){let t=In.isAbsolute(r)?r:In.join(e,r),n;try{n=await og.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Qn("")};throw u}let s=In.extname(r).toLowerCase(),o=ig[s]||"unknown",i=dv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Qn(n)};let a=pv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
406
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function El(r,e=process.cwd(),t={}){let n=In.isAbsolute(r)?r:In.join(e,r),s=[];async function o(i){let a=await og.readdir(i,{withFileTypes:!0});for(let c of a){let u=In.join(i,c.name),d=In.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=In.extname(c.name).toLowerCase();if(ig[m]){let p=await An(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function pv(r,e){let t=[],n=r.split(`
|
|
539
407
|
`),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(`
|
|
540
|
-
`).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:
|
|
408
|
+
`).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:mv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function mv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ig,sg,cv,lv,uv,rg,dv,_i=y(()=>{"use strict";_();eo();ig={".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"},sg=[{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}],cv=[{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}],lv=[{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}],uv=[{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}],rg=[{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}],dv={typescript:sg,javascript:sg,python:cv,go:lv,rust:uv,java:rg,csharp:rg,php:[],ruby:[],unknown:[]};l(An,"extractSignatures");l(El,"extractDirectorySignatures");l(pv,"extractFromContent");l(mv,"cleanSignature")});import{createHash as gv}from"node:crypto";import lg from"node:fs/promises";import ug from"node:path";function ag(r){return gv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function cg(r){try{let e=ug.join(r,"storage","classification-cache.json"),t=await lg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?Xa:(console.warn("[classifier] Failed to load cache:",w(e)),Xa)}}async function Il(r,e){try{let t=ug.join(r,"storage","classification-cache.json");await lg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function hv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>fv?null:n.classification}function yv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function wv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=dg(e),s=ec("classification")||"",o=`Classify this software engineering task into a domain.
|
|
541
409
|
|
|
542
410
|
Task: "${r}"
|
|
543
411
|
|
|
@@ -545,19 +413,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
545
413
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
546
414
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
547
415
|
|
|
548
|
-
${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=
|
|
549
|
-
`);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([
|
|
550
|
-
`).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
|
|
551
|
-
`)}_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`}},
|
|
552
|
-
`);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=
|
|
416
|
+
${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=Sn.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 kv(r,e){let t=dg(e),n=new Map;for(let[p,g]of Object.entries(Sv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let S of g)r.match(new RegExp(S,"gi"))&&(f+=S.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=bv(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 dg(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 bv(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 fv,Sv,Al,Cv,pg,mg=y(()=>{"use strict";Er();Oo();_();fv=3600*1e3;l(ag,"hashDescription");l(cg,"loadCache");l(Il,"saveCache");l(hv,"lookupCache");l(yv,"lookupPatterns");l(wv,"classifyWithLLM");Sv={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(kv,"classifyWithHeuristic");l(dg,"buildAvailableDomains");l(bv,"getFilePatterns");Al=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ag(e),i=await cg(n),a=hv(i,o,t);if(a)return{classification:a,source:"cache"};let c=yv(i,o);if(c)return{classification:c,source:"history"};let u=await wv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Il(n,i),{classification:u,source:"llm"};let d=kv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Il(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ag(e),o=await cg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Il(n,o))}},Cv=new Al,pg=Cv});import{exec as vv}from"node:child_process";import to from"node:fs/promises";import xv from"node:os";import Zn from"node:path";import{promisify as Pv}from"node:util";var gg,fg,jl,Tv,Ni,Dl=y(()=>{"use strict";Cl();Ve();Ce();vs();Ut();vl();xl();_i();_();Xn();mg();qn();gg=Pv(vv),fg=["database","backend","frontend","testing","devops"],jl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=A.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,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),S=null;return f&&e==="task"&&(S=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:S,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Yr(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await An(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(`
|
|
417
|
+
`);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([gg("git branch --show-current",{cwd:e}),gg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
418
|
+
`).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 Zt.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=$i(t,kn);return n.sprints.length===0?null:tg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Zn.join(e,"analysis","repo-analysis.json"),n=await to.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=A.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 pg.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=Zn.join(e,"agents");return(await to.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=A.getGlobalProjectPath(t),s=Zn.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=Zn.join(s,u);try{let m=await to.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=si(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=Zn.join(xv.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=Zn.join(t,`${i}.md`),c=Zn.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.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=fg.indexOf(a),d=fg.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?"...":""}`}},Tv=new jl,Ni=Tv});function Ev(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 Rl,Iv,_e,hg=y(()=>{"use strict";Ot();le();ln();ln();l(Ev,"generateApprovalPrompt");Rl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return Go.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Go.includes(n)):t}startPlanning(e,t,n){let s={id:Se(),projectId:e,command:t,params:n,status:se.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?[se.GATHERING,se.ANALYZING,se.PROPOSING,se.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===se.APPROVED?n.approvedAt=C():t===se.EXECUTING?n.executionStartedAt=C():(t===se.COMPLETED||t===se.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=se.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=se.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!==se.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=se.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=se.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!==se.APPROVED?null:(t.status=se.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==se.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!==se.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=se.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=se.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 Ev(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[se.GATHERING]:"\u{1F50D}",[se.ANALYZING]:"\u{1F9E0}",[se.PROPOSING]:"\u{1F4DD}",[se.PENDING_APPROVAL]:"\u23F3",[se.APPROVED]:"\u2705",[se.EXECUTING]:"\u26A1",[se.COMPLETED]:"\u{1F389}",[se.REJECTED]:"\u274C",[se.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===se.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
419
|
+
`)}_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`}},Iv=new Rl,_e=Iv});function Av(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Li[t]?Li[t]:Li[e]?Li[e]:e}function Hi(r){let e=new Set,t=[];for(let n of r){let s=Av(n);e.has(s)||(e.add(s),t.push(n))}return t}var Li,$l=y(()=>{"use strict";Li={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(Av,"normalizeFrameworkName");l(Hi,"deduplicateTechStack")});import{z as Ne}from"zod";function yg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
420
|
+
`);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=Hi(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])=>jv[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(`
|
|
553
421
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
554
|
-
`)}var
|
|
555
|
-
`,"utf-8"),
|
|
556
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
422
|
+
`)}var H_,jv,wg=y(()=>{"use strict";$l();H_=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),jv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(yg,"buildAntiHallucinationBlock")});import{z as Wt}from"zod";var Dv,Sg,kg=y(()=>{"use strict";Dv=Wt.object({agents:Wt.boolean(),patterns:Wt.boolean(),checklist:Wt.boolean(),modules:Wt.array(Wt.string())}),Sg=Wt.object({version:Wt.string(),description:Wt.string().optional(),commands:Wt.record(Wt.string(),Dv).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Ml(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function bg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Ml(o,Rv),a=Ml(o,$v),c=Ml(o,Mv);return s.some(d=>Ov.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 Rv,$v,Mv,Ov,Cg=y(()=>{"use strict";Rv=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$v=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Mv=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Ov=["Write","Edit","Bash"];l(Ml,"countMatches");l(bg,"classifyCommand")});import Ol from"node:fs/promises";import Fv from"node:path";async function xg(){if(no)return no;let r=await Ol.readFile(Fl,"utf-8"),e=JSON.parse(r);return no=Sg.parse(e),no}function _v(r){return Pg.get(r)}function Nv(r,e){Pg.set(r,e)}function Hv(r,e){let t=r,n=vg.get(t);return n&&Gv(n.entry,e)?(n.count++,n.count>=Lv):(vg.set(t,{entry:e,count:1}),!1)}async function Uv(r,e){let t=await Ol.readFile(Fl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Ol.writeFile(Fl,`${JSON.stringify(n,null,2)}
|
|
423
|
+
`,"utf-8"),no=null}function Gv(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 Tg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=_v(e);if(n)return{entry:n,source:"cache"};if(t){let s=bg(e,t);return Nv(e,s),Hv(e,s)&&Uv(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Fl,no,Pg,vg,Lv,Eg=y(()=>{"use strict";kg();dt();Cg();Fl=Fv.join(pe,"core/config/command-context.config.json"),no=null;l(xg,"loadCommandContextConfig");Pg=new Map;l(_v,"getCachedClassification");l(Nv,"cacheClassification");vg=new Map,Lv=3;l(Hv,"trackClassification");l(Uv,"persistClassification");l(Gv,"isSameEntry");l(Tg,"resolveCommandContextFull")});import zv from"node:os";import{z as nn}from"zod";function Wv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Bv(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ig(r){let e=r.platform??zv.platform(),t=r.runtime??Wv(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
424
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Bv(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
557
425
|
`)}
|
|
558
|
-
</env>`}var
|
|
559
|
-
... (truncated to ~${e} tokens)`}function
|
|
560
|
-
`);return
|
|
426
|
+
</env>`}var nN,Ag=y(()=>{"use strict";nN=nn.object({projectName:nn.string(),projectPath:nn.string(),isGitRepo:nn.boolean().default(!0),gitBranch:nn.string().optional(),platform:nn.string().optional(),runtime:nn.string().optional(),date:nn.string().optional(),model:nn.string().optional(),provider:nn.string().optional()});l(Wv,"detectRuntime");l(Bv,"normalizePlatform");l(Ig,"buildEnvironmentBlock")});function Dg(r){let e=r.getAllocationFor("injection");return{...Gi,totalPrompt:e}}function es(r,e){let t=e*Rg;return r.length<=t?r:`${r.substring(0,t)}
|
|
427
|
+
... (truncated to ~${e} tokens)`}function jg(r){return Math.ceil(r.length/Rg)}function $g(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Vv[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 Gi,Rg,Vv,Ui,Mg=y(()=>{"use strict";Gi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Dg,"budgetsFromCoordinator");Rg=4;l(es,"truncateToTokenBudget");l(jg,"estimateTokens");Vv={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($g,"filterSkillsByDomains");Ui=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Gi,...e}}addSection(e,t){let n=es(e,t),s=jg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=es(n,o);return this.used+=jg(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 Og from"node:fs/promises";import ts from"node:path";var _l,Jv,Fg,_g=y(()=>{"use strict";Ut();_();xe();dt();ml();wg();Eg();Ag();Mg();$l();qn();_l=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 Og.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?Dg(this._coordinator):Gi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ve(`global/modules/${e}`);if(t)return t;let n=ts.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=Ms("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ve(s);if(o){let i=ts.basename(s,".md");t[i]=o}}}else{let s=ts.join(pe,"templates","checklists");if(await P(s)){let o=(await Og.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=ts.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),Pe.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 ll.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(`
|
|
428
|
+
`);return es(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=ts.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 k=await xg();p=Tg(k,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
561
429
|
`),s.role&&d.push(`Role: ${s.role}
|
|
562
430
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
563
431
|
`),d.push(`
|
|
@@ -566,110 +434,110 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
566
434
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
567
435
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
568
436
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
569
|
-
`);let S=t.projectPath;if(S){let
|
|
570
|
-
${
|
|
571
|
-
`)}if(u){let
|
|
437
|
+
`);let S=t.projectPath;if(S){let k=u?.project?.id?ts.basename(S):ts.basename(S),j=Ig({projectName:k,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
438
|
+
${j}
|
|
439
|
+
`)}if(u){let k=u.sealedAnalysis;if(d.push(`
|
|
572
440
|
## PROJECT ANALYSIS (Sealed)
|
|
573
441
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
574
442
|
`),d.push(`**Primary Domain**: ${u.primaryDomain}
|
|
575
443
|
`),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
576
|
-
`),
|
|
577
|
-
`),
|
|
578
|
-
`),
|
|
579
|
-
`),
|
|
580
|
-
`),
|
|
581
|
-
`),d.push(`**Files Analyzed**: ${
|
|
582
|
-
`),d.push(`**Analysis Status**: ${
|
|
583
|
-
`),
|
|
444
|
+
`),k){if(k.languages.length>0&&d.push(`**Languages**: ${k.languages.join(", ")}
|
|
445
|
+
`),k.frameworks.length>0&&d.push(`**Frameworks**: ${k.frameworks.join(", ")}
|
|
446
|
+
`),k.packageManager&&d.push(`**Package Manager**: ${k.packageManager}
|
|
447
|
+
`),k.sourceDir&&d.push(`**Source Dir**: ${k.sourceDir}
|
|
448
|
+
`),k.testDir&&d.push(`**Test Dir**: ${k.testDir}
|
|
449
|
+
`),d.push(`**Files Analyzed**: ${k.fileCount}
|
|
450
|
+
`),d.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
|
|
451
|
+
`),k.patterns.length>0){d.push(`
|
|
584
452
|
### Code Patterns (Follow These)
|
|
585
|
-
`);for(let
|
|
586
|
-
`)}if(
|
|
453
|
+
`);for(let j of k.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
454
|
+
`)}if(k.antiPatterns.length>0){d.push(`
|
|
587
455
|
### Anti-Patterns (Avoid These)
|
|
588
|
-
`);for(let
|
|
456
|
+
`);for(let j of k.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
589
457
|
`)}}d.push(`
|
|
590
|
-
`)}let
|
|
591
|
-
`),d.push(
|
|
458
|
+
`)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let k=this.extractPatternSummary(D);k&&(d.push(`## CODE PATTERNS
|
|
459
|
+
`),d.push(k),d.push(`
|
|
592
460
|
Full patterns: Read analysis/patterns.md
|
|
593
|
-
`))}let
|
|
461
|
+
`))}let x=n?.analysis||"";if(b&&x&&x.trim()){let k=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=k?k[1].trim():"detected";d.push(`
|
|
594
462
|
## STACK
|
|
595
|
-
Stack: ${
|
|
596
|
-
`),
|
|
463
|
+
Stack: ${j}
|
|
464
|
+
`),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
597
465
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
598
466
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
599
467
|
|
|
600
|
-
`);for(let
|
|
601
|
-
`),
|
|
602
|
-
`),
|
|
603
|
-
`),
|
|
604
|
-
`);let
|
|
605
|
-
${
|
|
468
|
+
`);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
|
|
469
|
+
`),j.effort&&d.push(`Effort: ${j.effort}
|
|
470
|
+
`),j.model&&d.push(`Model: ${j.model}
|
|
471
|
+
`),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
|
|
472
|
+
`);let ee=es(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
473
|
+
${ee}
|
|
606
474
|
\`\`\`
|
|
607
475
|
|
|
608
|
-
`)}}let
|
|
476
|
+
`)}}let k=$g(u.skills,u.detectedDomains);if(k.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
609
477
|
|
|
610
|
-
`);for(let
|
|
611
|
-
`);let
|
|
612
|
-
${
|
|
478
|
+
`);for(let j of k){d.push(`#### Skill: ${j.name}
|
|
479
|
+
`);let ee=es(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
480
|
+
${ee}
|
|
613
481
|
\`\`\`
|
|
614
482
|
|
|
615
|
-
`)}}}let
|
|
616
|
-
`),d.push(
|
|
483
|
+
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let k of O){let j=await this.loadModule(k);j&&(d.push(`
|
|
484
|
+
`),d.push(j))}if(c?.isPlanning&&(d.push(`
|
|
617
485
|
## PLAN MODE
|
|
618
486
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
619
487
|
`),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
|
|
620
488
|
`)),c?.requiresApproval&&d.push(`
|
|
621
489
|
## APPROVAL REQUIRED
|
|
622
490
|
Show changes, list affected files, ask for confirmation.
|
|
623
|
-
`),S){let
|
|
624
|
-
${
|
|
625
|
-
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let
|
|
491
|
+
`),S){let k=u?.sealedAnalysis,j=[...k?.frameworks||[],...u?.project?.conventions||[]],ee={projectPath:S,language:u?.project?.ecosystem,framework:k?.frameworks?.[0],techStack:Hi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:k?.languages||[],analysisFrameworks:k?.frameworks||[],analysisPackageManager:k?.packageManager};d.push(`
|
|
492
|
+
${yg(ee)}
|
|
493
|
+
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let k=u.realContext;if(d.push(`
|
|
626
494
|
### CODEBASE CONTEXT
|
|
627
495
|
|
|
628
|
-
`),d.push(`**Git State**: Branch \`${
|
|
496
|
+
`),d.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
|
|
629
497
|
|
|
630
|
-
`),
|
|
498
|
+
`),k.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
631
499
|
`),d.push(`| Score | File | Why |
|
|
632
500
|
`),d.push(`|-------|------|-----|
|
|
633
|
-
`);for(let
|
|
501
|
+
`);for(let j of k.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
|
|
634
502
|
`);d.push(`
|
|
635
|
-
`)}if(
|
|
636
|
-
`);for(let
|
|
637
|
-
// ${
|
|
638
|
-
${
|
|
503
|
+
`)}if(k.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
504
|
+
`);for(let j of k.signatures)d.push(`\`\`\`typescript
|
|
505
|
+
// ${j.path}
|
|
506
|
+
${j.content}
|
|
639
507
|
\`\`\`
|
|
640
508
|
`);d.push(`
|
|
641
|
-
`)}if(
|
|
509
|
+
`)}if(k.recentFiles.length>0){d.push("**Recently Changed**: ");let j=k.recentFiles.slice(0,5).map(ee=>`${ee.path} (${ee.lastChanged})`).join(", ");d.push(`${j}
|
|
642
510
|
|
|
643
|
-
`)}}let
|
|
644
|
-
## FILES: ${
|
|
511
|
+
`)}}let F=t.files||[];if(F.length>0){let k=F.slice(0,5).join(", ");d.push(`
|
|
512
|
+
## FILES: ${F.length} available. Top: ${k}
|
|
645
513
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
646
514
|
|
|
647
515
|
`)}else S&&d.push(`
|
|
648
516
|
## PROJECT: ${S}
|
|
649
517
|
Read files before modifying.
|
|
650
518
|
|
|
651
|
-
`);let
|
|
519
|
+
`);let K=this.filterRelevantState(n);if(K&&(d.push(`
|
|
652
520
|
## PRJCT STATE (Project Management Data)
|
|
653
|
-
`),d.push(
|
|
521
|
+
`),d.push(K),d.push(`
|
|
654
522
|
`)),u?.velocityContext&&(d.push(`
|
|
655
523
|
### VELOCITY (Historical Estimation Data)
|
|
656
524
|
|
|
657
525
|
`),d.push(u.velocityContext),d.push(`
|
|
658
526
|
|
|
659
|
-
`)),o&&Object.keys(o).some(
|
|
527
|
+
`)),o&&Object.keys(o).some(k=>o[k])){d.push(`
|
|
660
528
|
## PROJECT DEFAULTS (apply automatically)
|
|
661
|
-
`);for(let[
|
|
529
|
+
`);for(let[k,j]of Object.entries(o))j&&d.push(`- ${k}: ${j}
|
|
662
530
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
663
531
|
## THINK FIRST (reasoning from analysis)
|
|
664
532
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
665
|
-
`);for(let
|
|
533
|
+
`);for(let k of i.conclusions)d.push(` \u2192 ${k}
|
|
666
534
|
`)}d.push(`Plan:
|
|
667
|
-
`);for(let
|
|
535
|
+
`);for(let k=0;k<i.plan.length;k++)d.push(` ${k+1}. ${i.plan[k]}
|
|
668
536
|
`);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
669
537
|
`)}if(a&&a.length>0){d.push(`
|
|
670
538
|
## CONTEXT (apply these)
|
|
671
|
-
`);for(let
|
|
672
|
-
`),
|
|
539
|
+
`);for(let k of a)d.push(`- **${k.title}**: ${k.content}
|
|
540
|
+
`),k.tags&&k.tags.length>0&&d.push(` Tags: ${k.tags.join(", ")}
|
|
673
541
|
`)}if(d.push(`
|
|
674
542
|
---
|
|
675
543
|
`),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
|
|
@@ -677,34 +545,34 @@ Read files before modifying.
|
|
|
677
545
|
|
|
678
546
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
679
547
|
`),d.push(`|---|--------|-------------|--------|
|
|
680
|
-
`);for(let
|
|
681
|
-
`)}let
|
|
682
|
-
**FOCUS ON SUBTASK #${
|
|
683
|
-
`),d.push(`Agent: ${
|
|
684
|
-
`),
|
|
685
|
-
`),
|
|
548
|
+
`);for(let j of u.subtasks){let ee=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${ee} |
|
|
549
|
+
`)}let k=u.subtasks.find(j=>j.status==="in_progress");if(k&&(d.push(`
|
|
550
|
+
**FOCUS ON SUBTASK #${k.order}**: ${k.description}
|
|
551
|
+
`),d.push(`Agent: ${k.agent} | Domain: ${k.domain}
|
|
552
|
+
`),k.dependsOn.length>0&&d.push(`Dependencies: ${k.dependsOn.join(", ")}
|
|
553
|
+
`),k.handoff)){let j=k.handoff;d.push(`
|
|
686
554
|
### Previous Subtask Handoff
|
|
687
555
|
|
|
688
|
-
`),d.push(`**From:** ${
|
|
556
|
+
`),d.push(`**From:** ${j.fromSubtask}
|
|
689
557
|
|
|
690
558
|
`),d.push(`**What was done:**
|
|
691
|
-
`);for(let
|
|
692
|
-
`);if(
|
|
559
|
+
`);for(let ee of j.whatWasDone)d.push(`- ${ee}
|
|
560
|
+
`);if(j.filesChanged.length>0){d.push(`
|
|
693
561
|
**Files changed:**
|
|
694
|
-
`);for(let
|
|
562
|
+
`);for(let ee of j.filesChanged)d.push(`- \`${ee.path}\` (${ee.action})
|
|
695
563
|
`)}d.push(`
|
|
696
564
|
**Context for this subtask:**
|
|
697
|
-
${
|
|
565
|
+
${j.outputForNextAgent}
|
|
698
566
|
`)}d.push(`
|
|
699
|
-
`)}let oe=this.getSchemaTypeForCommand(m);if(oe){let{renderSchemaForPrompt:
|
|
700
|
-
${
|
|
701
|
-
`)}if(p.checklist){let
|
|
567
|
+
`)}let oe=this.getSchemaTypeForCommand(m);if(oe){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(Oo(),Qd)),j=k(oe);j&&d.push(`
|
|
568
|
+
${j}
|
|
569
|
+
`)}if(p.checklist){let k=await this.loadChecklistRouting(),j=await this.loadChecklists();k&&Object.keys(j).length>0&&(d.push(`
|
|
702
570
|
## QUALITY CHECKLISTS
|
|
703
571
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
704
|
-
`),d.push(`Available: ${Object.keys(
|
|
572
|
+
`),d.push(`Available: ${Object.keys(j).join(", ")}
|
|
705
573
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
706
574
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
707
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new
|
|
575
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Ui({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}
|
|
708
576
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
709
577
|
|
|
710
578
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -721,7 +589,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
721
589
|
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
722
590
|
Avoid:
|
|
723
591
|
${a}`)}let o=t.join(`
|
|
724
|
-
`);return
|
|
592
|
+
`);return es(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
725
593
|
## RULES (CRITICAL)
|
|
726
594
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
727
595
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -738,7 +606,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
738
606
|
- Prefer structured output (JSON) over free text when applicable.
|
|
739
607
|
|
|
740
608
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
741
|
-
`}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}}}},
|
|
609
|
+
`}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}}}},Jv=new _l,Fg=Jv});import Ng from"node:fs/promises";import At from"node:path";var qv,Kv,Nl,Ll,zi,Hl=y(()=>{"use strict";Ve();Ce();_();qv=["task","done","ship","resume","bug","enrich"],Kv=["init","sync","pause","next","dash","history","undo","redo"],Nl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return At.dirname(hr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=A.getGlobalProjectPath(s),a=await(Be(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=At.join(u,"templates")}catch{c=At.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:At.join(c,"agentic","orchestrator.md"),agentRouting:At.join(c,"agentic","agent-routing.md"),taskFragmentation:At.join(c,"agentic","task-fragmentation.md"),commandTemplate:At.join(c,"commands",`${e}.md`),repoAnalysis:At.join(o,"analysis","repo-analysis.json"),agentsDir:At.join(o,"agents"),skillsDir:a.skillsDir,stateJson:At.join(o,"storage","state.json")}}}requiresOrchestration(e){return qv.includes(e)?!0:!Kv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
742
610
|
## Agentic Execution Mode
|
|
743
611
|
|
|
744
612
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -821,13 +689,13 @@ When fragmenting tasks:
|
|
|
821
689
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
822
690
|
3. Each completed subtask generates a summary
|
|
823
691
|
4. Pass summary to next agent for context handoff
|
|
824
|
-
`,context:e,requiresOrchestration:t}}},
|
|
825
|
-
`+
|
|
826
|
-
`+
|
|
827
|
-
`+
|
|
828
|
-
`+
|
|
829
|
-
`+
|
|
830
|
-
`}},
|
|
692
|
+
`,context:e,requiresOrchestration:t}}},Ll=new Nl,zi=Ll});import{exec as Yv}from"node:child_process";import Lg from"node:fs/promises";import{promisify as Xv}from"node:util";var Qv,ns,Ke,Ul=y(()=>{"use strict";ci();Qv=Xv(Yv),ns={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())}};ns.register("Read",async r=>{try{return await Ur.execute(async()=>await Lg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ai(e)||Hr(e),null}});ns.register("Write",async(r,e)=>{try{return await Ur.execute(async()=>await Lg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ai(t)||Hr(t),!1}});ns.register("Bash",async r=>{try{return await Ur.execute(async()=>await Qv(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});ns.register("GetTimestamp",async()=>new Date().toISOString());ns.register("GetDate",async()=>new Date().toISOString().split("T")[0]);ns.register("GetDateTime",async()=>new Date().toISOString());Ke=ns});import Gl from"node:fs/promises";import Zv from"node:os";import Hg from"node:path";async function ex(r){try{let e=Hg.dirname(Wi);await P(e)||await Gl.mkdir(e,{recursive:!0}),await Gl.writeFile(Wi,`/p:${r}`)}catch{}}async function tx(){try{await P(Wi)&&await Gl.unlink(Wi)}catch{}}var Wi,zl,nx,Bi,Wl=y(()=>{"use strict";_();$m();xe();Fm();Nm();hl();Xm();Qm();Rs();Dl();hg();_g();Hl();qn();Ul();Wi=Hg.join(Zv.homedir(),".prjct-cli",".running");l(ex,"signalStart");l(tx,"signalEnd");zl=class{static{l(this,"CommandExecutor")}async signalStart(e){await ex(e)}async signalEnd(){await tx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Hs.shouldEscalate(e,s)){let o=Hs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Rc.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Ri.requiresVerification(e)){let k=await ft.loadStateForCommand(i,e);m=await Ri.verify(e,i,k),!m.verified&&m.warnings.length>0&&console.log(Ri.formatWarnings(m))}let p=null;if(Di.requiresReasoning(e)){let k=await ft.loadStateForCommand(i,e);p=await Di.reason(e,i,k),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Di.formatPlan(p)))}let g=t.task||t.description||"",f=await zi.buildContext(e,g,n),S=zi.buildAgenticPrompt(f),b=null;if(zi.requiresOrchestration(e)&&g)try{b=await Ni.execute(e,g,n),b.detectedDomains.length>0&&ji.orchestrate(b.detectedDomains);for(let k of b.agents){let j=k.domain||k.name.replace(".md","");ji.startAgent(k.name,j,`Loading ${j} specialist...`),ji.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let k=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Om(k)}}catch(k){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(k)}`)}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 ft.loadState(i),O=null,F=null;i.projectId&&(O={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let K={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},oe=await Fg.build(o,D,x,null,O,null,F,K,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Hs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:oe,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:F,orchestratorContext:b,memory:{create:l(k=>Te.createMemory(i.projectId,k),"create"),autoRemember:l((k,j,ee)=>Te.autoRemember(i.projectId,k,j,ee),"autoRemember"),search:l(k=>Te.searchMemories(i.projectId,k),"search"),findByTags:l(k=>Te.findByTags(i.projectId,k),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(k=>_e.recordGatheredInfo(i.projectId,k),"recordInfo"),setAnalysis:l(k=>_e.setAnalysis(i.projectId,k),"setAnalysis"),propose:l(k=>_e.proposePlan(i.projectId,k),"propose"),approve:l(k=>_e.approvePlan(i.projectId,k),"approve"),reject:l(k=>_e.rejectPlan(i.projectId,k),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(k=>_e.completeStep(i.projectId,k),"completeStep"),failStep:l(k=>_e.failStep(i.projectId,k),"failStep"),abort:l(k=>_e.abortPlan(i.projectId,k),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Hs.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Hs.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(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Rc.load(e)).frontmatter["allowed-tools"]||[],i=await ft.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)}}}},nx=new zl,Bi=nx});import Vi from"node:fs/promises";import sx from"node:https";import rx from"node:os";import Bl from"node:path";import Bt from"chalk";var Vl,Ug,Gg=y(()=>{"use strict";_();xe();Vl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Bl.join(rx.homedir(),".prjct-cli","config"),this.cacheFile=Bl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Bl.join(__dirname,"..","..","package.json");return JSON.parse(await Vi.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=sx.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 Vi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await Vi.mkdir(this.cacheDir,{recursive:!0}),await Vi.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:`
|
|
693
|
+
`+Bt.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")+`
|
|
694
|
+
`+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
|
|
695
|
+
`+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
|
|
696
|
+
`+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
|
|
697
|
+
`+Bt.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")+`
|
|
698
|
+
`}},Ug=Vl});var ke,rt=y(()=>{"use strict";Wl();hl();Ul();Ve();Ce();Gg();Dn();le();xe();Nt();ke=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Ug,this.updateNotificationShown=!1,this.commandExecutor=Bi}get agent(){return Os.getAgent()}get agentInfo(){return Os.getInfo()}get currentAuthor(){return jn.getCurrentAuthor()}async initializeAgent(){return Os.initialize()}async ensureProjectInit(e){return jn.ensureInit(e)}async ensureAuthor(){return jn.ensureAuthor()}async getGlobalProjectPath(e){return jn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return jn.isEmptyDirectory(e)}async _detectExistingCode(e){return jn.hasExistingCode(e)}_breakdownFeatureTasks(e){return mi.breakdownFeature(e)}_detectBugSeverity(e){return mi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Os.assignForTask(e,t,n)}}});var zg={};ge(zg,{PlanningCommands:()=>rs});import ss from"node:path";async function ox(){if(!Jl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(qi(),Wg));Jl=new r}return Jl}var Jl,rs,Ji=y(()=>{"use strict";Do();xn();Ot();Ut();_();_s();Ns();ml();rt();Jl=null;l(ox,"getAnalysisCommands");rs=class extends ke{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 R.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 Ls(t).runNonInteractive());else if(a=await new Ls(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await bs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m),g={"core/now.md":`# NOW
|
|
831
699
|
|
|
832
700
|
No current task. Use \`/p:now\` to set focus.
|
|
833
701
|
`,"core/next.md":`# NEXT
|
|
@@ -847,17 +715,17 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
847
715
|
`,"planning/roadmap.md":`# ROADMAP
|
|
848
716
|
|
|
849
717
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
850
|
-
`,"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[x
|
|
718
|
+
`,"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 Ke.get("Write")(ss.join(p,D),x);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let D=await ox();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&&!S){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=ss.join(p,"planning","architect-session.md"),x=`# Architect Session
|
|
851
719
|
|
|
852
720
|
## Idea
|
|
853
|
-
${
|
|
721
|
+
${b}
|
|
854
722
|
|
|
855
723
|
## Status
|
|
856
724
|
Initialized - awaiting stack recommendation
|
|
857
725
|
|
|
858
726
|
Generated: ${new Date().toLocaleString()}
|
|
859
|
-
`;return await
|
|
860
|
-
`);let s=await this.getGlobalProjectPath(t),o=
|
|
727
|
+
`;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.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 R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=Se(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Pe.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:B.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 R.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 ft.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 Pe.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:B.getTimestamp()}),n.md?console.log(Ie(st("Bug Reported",e),zt({Severity:a,Priority:m,Agent:u}),Qe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(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
|
|
728
|
+
`);let s=await this.getGlobalProjectPath(t),o=ss.join(s,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
861
729
|
|
|
862
730
|
Create a plan first:
|
|
863
731
|
1. Run /p:init in an empty directory
|
|
@@ -878,7 +746,7 @@ The architect plan is ready. Claude will now:
|
|
|
878
746
|
4. Create starter files with boilerplate
|
|
879
747
|
`),console.log(`
|
|
880
748
|
\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.
|
|
881
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
749
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:B.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 R.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=A.getGlobalProjectPath(o),u=ss.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
882
750
|
|
|
883
751
|
## Idea
|
|
884
752
|
${e}
|
|
@@ -893,14 +761,14 @@ Initialized - awaiting architecture design
|
|
|
893
761
|
4. Generate roadmap
|
|
894
762
|
|
|
895
763
|
Generated: ${new Date().toLocaleString()}
|
|
896
|
-
`;return await
|
|
764
|
+
`;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"architecture"}),Qe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
897
765
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
898
|
-
`),{success:!0,mode:"architecture",idea:e}}else return h.spin("capturing idea..."),await
|
|
766
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"capture"}),Qe([{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)}`),bt("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 R.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=A.getGlobalProjectPath(s),m=ss.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
899
767
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
900
768
|
`),{success:!0,specs:[]}):(console.log(`
|
|
901
769
|
\u{1F4CB} SPECIFICATIONS
|
|
902
|
-
`),console.log("\u2550".repeat(50)),f.forEach((S,
|
|
903
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=
|
|
770
|
+
`),console.log("\u2550".repeat(50)),f.forEach((S,b)=>{let D=S.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
|
|
771
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(s),i=ss.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=ss.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
904
772
|
|
|
905
773
|
## Overview
|
|
906
774
|
[Brief description of the feature]
|
|
@@ -930,27 +798,27 @@ Generated: ${new Date().toLocaleString()}
|
|
|
930
798
|
---
|
|
931
799
|
Created: ${new Date().toLocaleString()}
|
|
932
800
|
Status: Draft
|
|
933
|
-
`;return await
|
|
801
|
+
`;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
934
802
|
\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
|
|
935
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var
|
|
936
|
-
`).filter(Boolean)
|
|
937
|
-
`)}async getSessionInfo(e){return
|
|
803
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Ki,jn,Bg=y(()=>{"use strict";cn();Do();Ve();Ce();_();xe();Nt();Ki=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ji(),zg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw xo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await bs();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 hs(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 hs(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},jn=new Ki});import{exec as ix}from"node:child_process";import{promisify as ax}from"node:util";var ql,cx,Yi,so,Vg=y(()=>{"use strict";he();_();Zo();ql=ax(ix),cx={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Yi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...cx,...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=$.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 ql("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([ql(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),ql(`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(`
|
|
804
|
+
`).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(`
|
|
805
|
+
`)}async getSessionInfo(e){return vn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
938
806
|
`);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(`
|
|
939
|
-
`)}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}},
|
|
940
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
807
|
+
`)}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}},so=l((r,e)=>new Yi(r,e),"createStalenessChecker")});import Jg from"node:fs/promises";import Xi from"node:path";function ro(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 px(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(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(...ro(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(...ro(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(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(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&&!ux.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function qg(r,e){let t=[],n=await Jg.readdir(r,{withFileTypes:!0});for(let s of n){if(dx.has(s.name))continue;let o=Xi.join(r,s.name);if(s.isDirectory())t.push(...await qg(o,e));else if(s.isFile()){let i=Xi.extname(s.name).toLowerCase();lx.has(i)&&t.push(Xi.relative(e,o))}}return t}async function mx(r){let e=await qg(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 Jg.readFile(Xi.join(r,d),"utf-8"),p=px(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 fx(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]))};V.setDoc(r,gx,t)}async function Kg(r,e){let t=await mx(r);return fx(e,t),t}var lx,ux,dx,gx,Yg=y(()=>{"use strict";he();lx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ux=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"]),dx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(px,"tokenizeFile");l(qg,"listFiles");l(mx,"buildIndex");gx="bm25-index";l(fx,"saveIndex");l(Kg,"indexProject")});import Kl from"node:fs/promises";import dn from"node:path";function kx(r){let e=[],t,n=new RegExp(Sx.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function bx(r,e,t){let n;if(r.startsWith("@/"))n=dn.join(t,"src",r.slice(2));else{let s=dn.dirname(dn.join(t,e));n=dn.resolve(s,r)}for(let s of wx){let o=n+s;try{if((await Kl.stat(o)).isFile())return dn.relative(t,o)}catch{}}return null}async function Xg(r,e){let t=[],n=await Kl.readdir(r,{withFileTypes:!0});for(let s of n){if(yx.has(s.name))continue;let o=dn.join(r,s.name);if(s.isDirectory())t.push(...await Xg(o,e));else if(s.isFile()){let i=dn.extname(s.name).toLowerCase();hx.has(i)&&t.push(dn.relative(e,o))}}return t}async function Cx(r){let e=await Xg(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 Kl.readFile(dn.join(r,u),"utf-8"),m=kx(d),p=[];for(let g of m){let f=await bx(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 vx(r,e){V.setDoc(r,Qg,e)}function Zg(r){return V.getDoc(r,Qg)}async function ef(r,e){let t=await Cx(r);return vx(e,t),t}var hx,yx,wx,Sx,Qg,Yl=y(()=>{"use strict";he();hx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),yx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),wx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Sx=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(kx,"extractImportSources");l(bx,"resolveImport");l(Xg,"listFiles");l(Cx,"buildGraph");Qg="import-graph";l(vx,"saveGraph");l(Zg,"loadGraph");l(ef,"indexImports")});function tf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Zg(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 nf(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";Yl();l(tf,"propagateChanges");l(nf,"affectedDomains")});import Xl from"node:fs/promises";import Qi from"node:path";async function rf(r,e){let t=[],n=await Xl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Px.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Qi.join(r,o);if(s.isDirectory())t.push(...await rf(i,e));else if(s.isFile()){let a=Qi.extname(o).toLowerCase();xx.has(a)&&t.push(Qi.relative(e,i))}}return t}function Tx(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 Ex(r){let e=await rf(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=Qi.join(r,a),[u,d]=await Promise.all([Xl.readFile(c,"utf-8"),Xl.stat(c)]);return{path:a,hash:Tx(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 Ix(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 Ql(r,e){let t=V.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)})(),V.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Ax(r){let e=new Map;try{let t=V.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 Zl(r,e){let[t,n]=await Promise.all([Ex(r),Promise.resolve(Ax(e))]);return{diff:Ix(t,n),currentHashes:t}}function of(r){return V.hasDoc(r,"file-hashes-meta")}var xx,Px,af=y(()=>{"use strict";he();xx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Px=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(rf,"listProjectFiles");l(Tx,"hashContent");l(Ex,"computeHashes");l(Ix,"diffHashes");l(Ql,"saveHashes");l(Ax,"loadHashes");l(Zl,"detectChanges");l(of,"hasHashRegistry")});import{exec as jx}from"node:child_process";import{promisify as Dx}from"node:util";async function Mx(r,e=100){try{let{stdout:t}=await Rx(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
808
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=lf&&n.push(s),s=new Set):i&&s&&Ox(i)&&s.add(i)}return s&&s.size>0&&s.size<=lf&&n.push(s),n}catch{return[]}}function Ox(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 Fx(r,e=100){let t=await Mx(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=_x(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<cf||m<cf)continue;let p=d+m-a,g=p>0?a/p:0;g<$x||(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 _x(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Lx(r,e){V.setDoc(r,Nx,e)}async function uf(r,e,t=100){let n=await Fx(r,t);return Lx(e,n),n}var Rx,$x,cf,lf,Nx,df=y(()=>{"use strict";he();Rx=Dx(jx),$x=.1,cf=2,lf=30;l(Mx,"parseGitLog");l(Ox,"isSourceFile");l(Fx,"buildMatrix");l(_x,"pairKey");Nx="cochange-index";l(Lx,"saveMatrix");l(uf,"indexCoChanges")});function jt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function os(){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 eu=y(()=>{"use strict";l(jt,"cite");l(os,"defaultSources")});function Hx(r,e){let t=r.sources||os();return`# ${r.name} - Project Rules
|
|
941
809
|
<!-- projectId: ${r.projectId} -->
|
|
942
810
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
943
811
|
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
944
812
|
|
|
945
813
|
## THIS PROJECT (${r.ecosystem})
|
|
946
814
|
|
|
947
|
-
${
|
|
815
|
+
${jt(t.ecosystem)}
|
|
948
816
|
**Type:** ${r.projectType}
|
|
949
817
|
**Path:** ${r.repoPath}
|
|
950
818
|
|
|
951
819
|
### Commands (USE THESE, NOT OTHERS)
|
|
952
820
|
|
|
953
|
-
${
|
|
821
|
+
${jt(t.commands)}
|
|
954
822
|
| Action | Command |
|
|
955
823
|
|--------|---------|
|
|
956
824
|
| Install dependencies | \`${r.commands.install}\` |
|
|
@@ -962,9 +830,9 @@ ${Ve(t.commands)}
|
|
|
962
830
|
|
|
963
831
|
### Code Conventions
|
|
964
832
|
|
|
965
|
-
${
|
|
833
|
+
${jt(t.languages)}
|
|
966
834
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
967
|
-
${
|
|
835
|
+
${jt(t.frameworks)}
|
|
968
836
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
969
837
|
|
|
970
838
|
---
|
|
@@ -992,7 +860,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
992
860
|
|
|
993
861
|
## PROJECT STATE
|
|
994
862
|
|
|
995
|
-
${
|
|
863
|
+
${jt(t.name)}
|
|
996
864
|
| Field | Value |
|
|
997
865
|
|-------|-------|
|
|
998
866
|
| Name | ${r.name} |
|
|
@@ -1010,163 +878,12 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
1010
878
|
|
|
1011
879
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
1012
880
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
1013
|
-
`}function
|
|
1014
|
-
`)}function
|
|
1015
|
-
`)}function
|
|
1016
|
-
`)}function
|
|
1017
|
-
`),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(n,null,2)}function
|
|
1018
|
-
|
|
1019
|
-
<!-- Generated: ${b()} -->
|
|
1020
|
-
<!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
|
|
1021
|
-
|
|
1022
|
-
## THIS PROJECT (${n.ecosystem})
|
|
1023
|
-
|
|
1024
|
-
${Ve(u.ecosystem)}
|
|
1025
|
-
**Type:** ${n.projectType}
|
|
1026
|
-
**Path:** ${this.config.projectPath}
|
|
1027
|
-
|
|
1028
|
-
### Commands (USE THESE, NOT OTHERS)
|
|
1029
|
-
|
|
1030
|
-
${Ve(u.commands)}
|
|
1031
|
-
| Action | Command |
|
|
1032
|
-
|--------|---------|
|
|
1033
|
-
| Install dependencies | \`${s.install}\` |
|
|
1034
|
-
| Run dev server | \`${s.dev}\` |
|
|
1035
|
-
| Run tests | \`${s.test}\` |
|
|
1036
|
-
| Build | \`${s.build}\` |
|
|
1037
|
-
| Lint | \`${s.lint}\` |
|
|
1038
|
-
| Format | \`${s.format}\` |
|
|
1039
|
-
|
|
1040
|
-
### Code Conventions
|
|
1041
|
-
|
|
1042
|
-
${Ve(u.languages)}
|
|
1043
|
-
- **Languages**: ${n.languages.join(", ")||"Not detected"}
|
|
1044
|
-
${Ve(u.frameworks)}
|
|
1045
|
-
- **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}
|
|
1046
|
-
|
|
1047
|
-
---
|
|
1048
|
-
|
|
1049
|
-
## PRJCT RULES
|
|
1050
|
-
|
|
1051
|
-
### Path Resolution
|
|
1052
|
-
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${this.config.projectId}/\`
|
|
1053
|
-
- NEVER write to \`.prjct/\`
|
|
1054
|
-
- NEVER write to \`./\` for prjct data
|
|
1055
|
-
|
|
1056
|
-
### Workflow
|
|
1057
|
-
\`\`\`
|
|
1058
|
-
p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
1059
|
-
\`\`\`
|
|
1060
|
-
|
|
1061
|
-
| Command | Action |
|
|
1062
|
-
|---------|--------|
|
|
1063
|
-
| \`p. sync\` | Re-analyze project |
|
|
1064
|
-
| \`p. task X\` | Start task |
|
|
1065
|
-
| \`p. done\` | Complete subtask |
|
|
1066
|
-
| \`p. ship X\` | Ship feature |
|
|
1067
|
-
|
|
1068
|
-
---
|
|
1069
|
-
|
|
1070
|
-
## PROJECT STATE
|
|
1071
|
-
|
|
1072
|
-
${Ve(u.name)}
|
|
1073
|
-
| Field | Value |
|
|
1074
|
-
|-------|-------|
|
|
1075
|
-
| Name | ${n.name} |
|
|
1076
|
-
| Version | ${n.version} |
|
|
1077
|
-
| Ecosystem | ${n.ecosystem} |
|
|
1078
|
-
| Branch | ${t.branch} |
|
|
1079
|
-
| Files | ~${n.fileCount} |
|
|
1080
|
-
| Commits | ${t.commits} |
|
|
1081
|
-
|
|
1082
|
-
---
|
|
1083
|
-
|
|
1084
|
-
## AGENTS
|
|
1085
|
-
|
|
1086
|
-
Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
|
|
1087
|
-
|
|
1088
|
-
**Workflow**: ${a.join(", ")}
|
|
1089
|
-
**Domain**: ${c.join(", ")||"none"}
|
|
1090
|
-
`,m=an.join(e,"CLAUDE.md");await this.writeWithPreservation(m,d)}async generateNowMd(e){let t=null;try{t=(await ie.read(this.config.projectId)).currentTask}catch{}let n=t?.branch,s=typeof n=="string"?n:n?.name,o=t?`# NOW
|
|
1091
|
-
|
|
1092
|
-
**${t.description}**
|
|
1093
|
-
|
|
1094
|
-
Started: ${t.startedAt}
|
|
1095
|
-
${s?`Branch: ${s}`:""}
|
|
1096
|
-
`:`# NOW
|
|
1097
|
-
|
|
1098
|
-
_No active task_
|
|
1099
|
-
|
|
1100
|
-
Use \`p. task "description"\` to start working.
|
|
1101
|
-
`;await this.writeWithPreservation(an.join(e,"now.md"),o)}async generateNextMd(e){let t={tasks:[]};try{t={tasks:(await et.read(this.config.projectId)).tasks||[]}}catch{}let n=`# NEXT
|
|
1102
|
-
|
|
1103
|
-
${t.tasks.length>0?t.tasks.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
1104
|
-
`):"_Empty queue_"}
|
|
1105
|
-
`;await this.writeWithPreservation(an.join(e,"next.md"),n)}async generateIdeasMd(e){let t={ideas:[]};try{t={ideas:(await Ut.read(this.config.projectId)).ideas||[]}}catch{}let n=`# IDEAS
|
|
1106
|
-
|
|
1107
|
-
${t.ideas.length>0?t.ideas.map(s=>`- ${s.text}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
1108
|
-
`):"_No ideas captured yet_"}
|
|
1109
|
-
`;await this.writeWithPreservation(an.join(e,"ideas.md"),n)}async generateShippedMd(e){let t={shipped:[]};try{t={shipped:(await hn.read(this.config.projectId)).shipped||[]}}catch{}let n=`# SHIPPED \u{1F680}
|
|
1110
|
-
|
|
1111
|
-
${t.shipped.length>0?t.shipped.slice(-10).map(s=>`- **${s.name}**${s.version?` v${s.version}`:""} - ${s.shippedAt}`).join(`
|
|
1112
|
-
`):"_Nothing shipped yet_"}
|
|
1113
|
-
|
|
1114
|
-
**Total shipped:** ${t.shipped.length}
|
|
1115
|
-
`;await this.writeWithPreservation(an.join(e,"shipped.md"),n)}async generateMonorepoContexts(e,t,n,s){let o=await P.detectMonorepo(this.config.projectPath);if(!o.isMonorepo)return[];let i=[],a=new to(this.config.projectPath);await a.initialize();for(let c of o.packages){if(!c.hasPrjctMd)continue;let u=await a.getPackageContext(c.name);if(!u)continue;let d=await this.generatePackageClaudeMd(c,u,e,t,n,s),m=an.join(c.path,"CLAUDE.md");await this.writeWithPreservation(m,d),i.push(an.relative(this.config.projectPath,m))}return i}async generatePackageClaudeMd(e,t,n,s,o,i){let a=i.filter(m=>m.type==="workflow").map(m=>m.name),c=i.filter(m=>m.type==="domain").map(m=>m.name),u=s.version,d=e.name;try{let m=an.join(e.path,"package.json"),p=JSON.parse(await Nu.readFile(m,"utf-8"));u=p.version||s.version,d=p.name||e.name}catch{}return`# ${d} - Package Rules
|
|
1116
|
-
<!-- package: ${e.relativePath} -->
|
|
1117
|
-
<!-- monorepo: ${s.name} -->
|
|
1118
|
-
<!-- Generated: ${b()} -->
|
|
1119
|
-
<!-- Sources: ${t.sources.join(" \u2192 ")} -->
|
|
1120
|
-
|
|
1121
|
-
## THIS PACKAGE
|
|
1122
|
-
|
|
1123
|
-
**Name:** ${d}
|
|
1124
|
-
**Path:** ${e.relativePath}
|
|
1125
|
-
**Version:** ${u}
|
|
1126
|
-
**Monorepo:** ${s.name}
|
|
1127
|
-
|
|
1128
|
-
---
|
|
1129
|
-
|
|
1130
|
-
## INHERITED CONTEXT
|
|
1131
|
-
|
|
1132
|
-
${t.content||"_No PRJCT.md rules defined_"}
|
|
1133
|
-
|
|
1134
|
-
${t.overrides.length>0?`
|
|
1135
|
-
**Overrides:** ${t.overrides.join(", ")}
|
|
1136
|
-
`:""}
|
|
1137
|
-
|
|
1138
|
-
---
|
|
1139
|
-
|
|
1140
|
-
## COMMANDS
|
|
1141
|
-
|
|
1142
|
-
| Action | Command |
|
|
1143
|
-
|--------|---------|
|
|
1144
|
-
| Install | \`${o.install}\` |
|
|
1145
|
-
| Dev | \`${o.dev}\` |
|
|
1146
|
-
| Test | \`${o.test}\` |
|
|
1147
|
-
| Build | \`${o.build}\` |
|
|
1148
|
-
|
|
1149
|
-
---
|
|
1150
|
-
|
|
1151
|
-
## PROJECT STATE
|
|
1152
|
-
|
|
1153
|
-
| Field | Value |
|
|
1154
|
-
|-------|-------|
|
|
1155
|
-
| Package | ${d} |
|
|
1156
|
-
| Monorepo | ${s.name} |
|
|
1157
|
-
| Branch | ${n.branch} |
|
|
1158
|
-
| Ecosystem | ${s.ecosystem} |
|
|
1159
|
-
|
|
1160
|
-
---
|
|
1161
|
-
|
|
1162
|
-
## AGENTS
|
|
1163
|
-
|
|
1164
|
-
Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
|
|
1165
|
-
|
|
1166
|
-
**Workflow**: ${a.join(", ")}
|
|
1167
|
-
**Domain**: ${c.join(", ")||"none"}
|
|
1168
|
-
`}}});import Lu from"node:fs/promises";import Uu from"node:path";var Hu,Gu,ih,ah=y(()=>{"use strict";F();Hu=".prjct-state.md",Gu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Uu.join(e,Hu),s=this.toMarkdown(t);await Lu.writeFile(n,s,"utf-8")}async remove(e){let t=Uu.join(e,Hu);try{await Lu.unlink(t)}catch(n){if(!k(n))throw n}}async exists(e){let t=Uu.join(e,Hu);try{return await Lu.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(`
|
|
1169
|
-
`)}},ih=new Gu});import zu from"node:fs/promises";import iT from"node:os";import ch from"node:path";function Ju(){return ch.join(iT.homedir(),".prjct-cli","skills",aT)}function cT(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ko(){try{let r=await zu.readFile(Ju(),"utf-8");return JSON.parse(r)}catch{return cT()}}async function Wu(r){let e=Ju();await zu.mkdir(ch.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await zu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function lT(r){let e=await ko();e.skills[r.name]=r,await Wu(e)}async function uT(r){let e=await ko();return r in e.skills?(delete e.skills[r],await Wu(e),!0):!1}async function dT(r){return(await ko()).skills[r]||null}async function pT(){return(await ko()).skills}function mT(){return Ju()}var aT,So,lh=y(()=>{"use strict";aT=".skill-lock.json";l(Ju,"getLockFilePath");l(cT,"createEmptyLockFile");l(ko,"read");l(Wu,"write");l(lT,"addEntry");l(uT,"removeEntry");l(dT,"getEntry");l(pT,"getAll");l(mT,"getPath");So={read:ko,write:Wu,addEntry:lT,removeEntry:uT,getEntry:dT,getAll:pT,getPath:mT}});import{exec as gT}from"node:child_process";import Sn from"node:fs/promises";import Vu from"node:os";import tt from"node:path";import{promisify as fT}from"node:util";import{glob as uh}from"glob";function ph(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?tt.join(Vu.homedir(),r.slice(1)):tt.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 mh(r){let e=[];try{let s=tt.join(r,"SKILL.md");await Sn.access(s);let o=tt.basename(r);e.push({name:o,filePath:s})}catch{}let t=await uh("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=tt.basename(tt.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await uh("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=tt.basename(tt.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function hT(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()}
|
|
881
|
+
`}function Ux(r,e){let t=r.sources||os(),n=[];return 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(jt(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(jt(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(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
|
|
882
|
+
`)}function Gx(r,e){let t=r.sources||os(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(jt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
883
|
+
`)}function zx(r,e){let t=r.sources||os(),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(jt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(jt(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(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
|
|
884
|
+
`)}function Wx(r,e){let n={systemMessage:[`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}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
|
|
885
|
+
`),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(n,null,2)}function pf(r){return{claude:Hx,cursor:Ux,copilot:Gx,windsurf:zx,continue:Wx}[r]||null}var tu=y(()=>{"use strict";eu();l(Hx,"formatForClaude");l(Ux,"formatForCursor");l(Gx,"formatForCopilot");l(zx,"formatForWindsurf");l(Wx,"formatForContinue");l(pf,"getFormatter")});import{exec as Bx}from"node:child_process";import Vx from"node:os";import oo from"node:path";import{promisify as Jx}from"node:util";function mf(r){return Zi[r]||null}async function nu(r){try{return await qx(`which ${r}`),!0}catch{return!1}}async function ea(r=process.cwd()){let e=[];return await nu("claude")&&e.push("claude"),(await nu("cursor")||await P(oo.join(r,".cursor")))&&e.push("cursor"),await P(oo.join(r,".github"))&&e.push("copilot"),(await nu("windsurf")||await P(oo.join(r,".windsurf")))&&e.push("windsurf"),(await P(oo.join(r,".continue"))||await P(oo.join(Vx.homedir(),".continue")))&&e.push("continue"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await ea(e);return t.length>0?t:["claude"]}return r==="all"?Kx:r.filter(t=>Zi[t])}var qx,Zi,io,Kx,su=y(()=>{"use strict";xe();qx=Jx(Bx),Zi={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"}},io=["claude"],Kx=Object.keys(Zi);l(mf,"getAIToolConfig");l(nu,"commandExists");l(ea,"detectInstalledTools");l(gf,"resolveToolIds")});import ru from"node:fs/promises";import ou from"node:path";async function ff(r,e,t,n=io){let s=[];for(let o of n){let i=mf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Yx(r,i,e,t);s.push(a)}return s}async function Yx(r,e,t,n){let s=pf(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=ou.join(n,e.outputFile):i=ou.join(t,"context",e.outputFile),await ru.mkdir(ou.dirname(i),{recursive:!0});try{let a=await ru.readFile(i,"utf-8"),c=_c(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Fc(o,a)}catch{}return await ru.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 hf=y(()=>{"use strict";_();Nc();tu();su();l(ff,"generateAIToolContexts");l(Yx,"generateForTool")});var yf=y(()=>{"use strict";tu();hf();su()});import iu from"node:fs/promises";import au from"node:path";var cu,lu,wf,Sf=y(()=>{"use strict";_();cu=".prjct-state.md",lu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=au.join(e,cu),s=this.toMarkdown(t);await iu.writeFile(n,s,"utf-8")}async remove(e){let t=au.join(e,cu);try{await iu.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=au.join(e,cu);try{return await iu.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(`
|
|
886
|
+
`)}},wf=new lu});import uu from"node:fs/promises";import Xx from"node:os";import kf from"node:path";function du(){return kf.join(Xx.homedir(),".prjct-cli","skills",Qx)}function Zx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ao(){try{let r=await uu.readFile(du(),"utf-8");return JSON.parse(r)}catch{return Zx()}}async function pu(r){let e=du();await uu.mkdir(kf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await uu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function eP(r){let e=await ao();e.skills[r.name]=r,await pu(e)}async function tP(r){let e=await ao();return r in e.skills?(delete e.skills[r],await pu(e),!0):!1}async function nP(r){return(await ao()).skills[r]||null}async function sP(){return(await ao()).skills}function rP(){return du()}var Qx,co,bf=y(()=>{"use strict";Qx=".skill-lock.json";l(du,"getLockFilePath");l(Zx,"createEmptyLockFile");l(ao,"read");l(pu,"write");l(eP,"addEntry");l(tP,"removeEntry");l(nP,"getEntry");l(sP,"getAll");l(rP,"getPath");co={read:ao,write:pu,addEntry:eP,removeEntry:tP,getEntry:nP,getAll:sP,getPath:rP}});import{exec as oP}from"node:child_process";import pn from"node:fs/promises";import gu from"node:os";import ot from"node:path";import{promisify as iP}from"node:util";import{glob as Cf}from"glob";function xf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ot.join(gu.homedir(),r.slice(1)):ot.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 Pf(r){let e=[];try{let s=ot.join(r,"SKILL.md");await pn.access(s);let o=ot.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Cf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Cf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function aP(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()}
|
|
1170
887
|
${s.join(`
|
|
1171
888
|
`)}`;return r.replace(o,`---
|
|
1172
889
|
${c}
|
|
@@ -1175,10 +892,10 @@ ${s.join(`
|
|
|
1175
892
|
`)}
|
|
1176
893
|
---
|
|
1177
894
|
|
|
1178
|
-
${r}`}function
|
|
895
|
+
${r}`}function fu(){return ot.join(gu.homedir(),".claude","skills")}async function mu(r,e,t,n){let s=fu(),o=ot.join(s,e),i=ot.join(o,"SKILL.md"),a=await pn.readFile(r,"utf-8"),c=aP(a,t,n);return await pn.mkdir(o,{recursive:!0}),await pn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function cP(r){let e={installed:[],skipped:[],errors:[]};if(!Fs.isAvailable("git")){let n=Fs.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=ot.join(gu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await vf(`git clone --depth 1 ${n} ${t}`,{timeout:Ts("GIT_CLONE")});let s;try{let{stdout:a}=await vf("git rev-parse HEAD",{cwd:t,timeout:Ts("TOOL_CHECK")});s=a.trim()}catch{}let o=await Pf(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 mu(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 co.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await pn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function lP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await pn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await pn.stat(t)).isFile()){let s=ot.basename(ot.dirname(t));try{let o=await mu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await co.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Pf(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 mu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await co.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function uP(r){let e=fu(),t=ot.join(e,r);try{await pn.rm(t,{recursive:!0,force:!0})}catch{}let n=ot.join(e,`${r}.md`);try{await pn.rm(n,{force:!0})}catch{}return co.removeEntry(r)}async function dP(r){let e=xf(r);switch(e.type){case"github":return cP(e);case"local":return lP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var vf,Tf,Ef=y(()=>{"use strict";_();ln();ki();bf();vf=iP(oP);l(xf,"parseSource");l(Pf,"discoverSkills");l(aP,"injectSourceMetadata");l(fu,"getInstallDir");l(mu,"installSkillFile");l(cP,"installFromGitHub");l(lP,"installFromLocal");l(uP,"remove");l(dP,"install");Tf={install:dP,remove:uP,parseSource:xf,getInstallDir:fu}});import Dt from"node:fs/promises";import pP from"node:os";import Ct from"node:path";async function If(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Dt.readdir(o);for(let u of c)u.endsWith(".md")&&await Dt.unlink(Ct.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:ne(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>mP(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=>gP(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 Af(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Dt.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 jf(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=ve(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Dt.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 mP(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Dt.readFile(n,"utf-8"),t=await jf(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:ne(n)}),t=hP(r)}await Dt.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function gP(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Dt.readFile(i,"utf-8"),o=await jf(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:ne(i)}),o=yP(r,t,n)}o=fP(o,r,s),await Dt.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function fP(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=[`
|
|
1179
896
|
## Recent Learnings (from completed tasks)
|
|
1180
897
|
`];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(`
|
|
1181
|
-
`)}function
|
|
898
|
+
`)}function hP(r){return`---
|
|
1182
899
|
name: ${r}
|
|
1183
900
|
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"}
|
|
1184
901
|
tools: Read, Write, Glob
|
|
@@ -1194,7 +911,7 @@ When invoked:
|
|
|
1194
911
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
1195
912
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
1196
913
|
3. Execute requested operation
|
|
1197
|
-
`}function
|
|
914
|
+
`}function yP(r,e,t){return`---
|
|
1198
915
|
name: ${r}
|
|
1199
916
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
1200
917
|
tools: Read, Write, Glob, Grep
|
|
@@ -1214,18 +931,17 @@ Domain specialist for ${r} tasks.
|
|
|
1214
931
|
## Your Role
|
|
1215
932
|
|
|
1216
933
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1217
|
-
`}function
|
|
1218
|
-
`).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
|
|
1219
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await fs('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){L.debug("Git analysis failed (not a git repo?)",{error:te(t)})}return e}async function cn(r,e){try{return await xh.access(Ku.join(r,e)),!0}catch(t){return L.debug("File not found",{filename:e,error:te(t)}),!1}}async function Eh(r){let e={fileCount:0,version:"0.0.0",name:Ku.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await fs('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){L.debug("File count failed",{path:r,error:te(t)}),e.fileCount=0}try{let t=Ku.join(r,"package.json"),n=JSON.parse(await xh.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 cn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){L.debug("No package.json found",{path:r,error:te(t)})}return await cn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await cn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await cn(r,"requirements.txt")||await cn(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 Ah(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 cn(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 cn(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 cn(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 cn(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 cn(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 Ih(r,e){let t=kn(),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 jh(r){return new va(r).detect()}var fs,Dh=y(()=>{"use strict";pn();Sa();Vn();vh();fs=AT(ET);l(Th,"analyzeGit");l(cn,"fileExists");l(Eh,"gatherStats");l(Ah,"detectCommands");l(Ih,"buildSources");l(jh,"detectStack")});import{exec as IT}from"node:child_process";import xa from"node:fs/promises";import Ta from"node:path";import{promisify as jT}from"node:util";var DT,Xu,Yu,Rh,$h=y(()=>{"use strict";F();DT=jT(IT),Xu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Ta.join(r,s);try{await xa.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=["storage/state.json"],n=[];for(let s of t){let o=Ta.join(r,s);try{let i=await xa.readFile(o,"utf-8");JSON.parse(i)}catch(i){k(i)||n.push(`${s}: ${i instanceof SyntaxError?"invalid JSON":"read error"}`)}}return{name:"JSON files valid",passed:n.length===0,output:n.length===0?`${t.length} files validated`:void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Ta.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 xa.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await xa.readFile(Ta.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(!k(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}}},Yu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Xu.contextFilesExist(t),Xu.jsonFilesValid(t),Xu.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(S=>S.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 DT(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}}}},Rh=new Yu});import bo from"node:fs/promises";import Po from"node:path";var Ea,hs,Qu=y(()=>{"use strict";Vs();Nf();Wf();qf();Qf();Iu();pn();Rn();qe();ne();fi();Dn();wt();bi();Jr();el();vi();xi();Ti();rh();re();Vn();Jl();Wl();oh();ah();Nl();bh();Dh();$h();Ea=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=>!wo.includes(i));s=[...wo,...o]}else t.aiTools[0]==="auto"?(s=await Pa(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await th("all",e):s=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=P.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Zc(this.projectId);try{let _=await Hm(this.projectId);_>0&&L.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){L.debug("Legacy JSON sweep failed (non-critical)",{error:te(_)})}let[i,a,c,u]=await Promise.all([Th(this.projectPath),Eh(this.projectPath),Ah(this.projectPath),jh(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&Vf(this.projectId))try{let{diff:_,currentHashes:nt}=await Ru(this.projectPath,this.projectId),zn=_.added.length+_.modified.length+_.deleted.length;if(zn===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let xr=zf(_,this.projectId);f=Jf(xr.allAffected);let iw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=xr.allAffected.some(Jn=>{let aw=Jn.substring(Jn.lastIndexOf("."));return iw.has(aw)}),g=xr.directlyChanged.some(Jn=>Jn==="package.json"||Jn==="tsconfig.json"||Jn.includes("Dockerfile")||Jn.includes("docker-compose")),m={isIncremental:!0,filesChanged:zn,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Du(this.projectId,nt)}catch(_){L.debug("Incremental detection failed, falling back to full sync",{error:te(_)})}else try{let{currentHashes:_}=await Ru(this.projectPath,this.projectId);Du(this.projectId,_)}catch(_){L.debug("Hash computation failed (non-critical)",{error:te(_)})}if(p)try{await Promise.all([_f(this.projectPath,this.projectId),Gf(this.projectPath,this.projectId),Yf(this.projectPath,this.projectId)])}catch(_){L.debug("File ranking index build failed (non-critical)",{error:te(_)})}let S;if(g)try{let _=await ie.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(S=_)}catch{}let v=g?await hh(this.globalPath,u,a,S):await yh(this.globalPath),x=kh(v,this.projectId,this.globalPath),E=g?await Sh(v):[],$=Ih(a,c),O=await this.generateContextFiles(i,a,c,v,$),V={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:v.filter(_=>_.type==="workflow").map(_=>_.name),domain:v.filter(_=>_.type==="domain").map(_=>_.name)},sources:$},oe=await nh(V,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 C=Date.now()-n,D=await this.recordSyncMetrics(a,O,v,C);await this.archiveStaleData(),await this.autoLearnFromHistory(),await ve.installGlobalConfig(),await ve.syncCommands();let Q;try{let _=await R.readConfig(this.projectPath);Q=await Rh.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){L.debug("Verification failed (non-critical)",{error:te(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:v,skills:x,skillsInstalled:E,contextFiles:O,aiTools:oe.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:D,verification:Q,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:te(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>bo.mkdir(Po.join(this.globalPath,t),{recursive:!0})))}async generateContextFiles(e,t,n,s,o){return new Ca({projectId:this.projectId,projectPath:this.projectPath,globalPath:this.globalPath}).generate(e,t,n,s,o)}async updateProjectJson(e,t){let n=N.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};N.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await ie.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await ie.write(this.projectId,s);try{await ih.generate(this.projectPath,s)}catch(o){L.debug("Local state generation failed (optional)",{error:te(o)})}}async logToMemory(e,t){let n=Po.join(this.globalPath,"memory","events.jsonl"),s={ts:b(),action:"sync",branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits};await bo.appendFile(n,`${JSON.stringify(s)}
|
|
1220
|
-
`,"utf-8")}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=Po.join(this.globalPath,m),g=await bo.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Context file not found for metrics",{file:m,error:te(p)})}for(let m of n)try{let p=Po.join(this.globalPath,"agents",`${m.name}.md`),g=await bo.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Agent file not found for metrics",{agent:m.name,error:te(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await fn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){L.debug("Failed to record sync metrics",{error:te(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 ie.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 nn.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:b(),status:"draft",commitHash:s??void 0})}catch(s){L.debug("Failed to save draft analysis (non-critical)",{error:te(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([hn.archiveOldShipped(this.projectId).catch(()=>0),Ut.markDormantIdeas(this.projectId).catch(()=>0),et.removeStaleCompleted(this.projectId).catch(()=>0),ie.archiveStalePausedTasks(this.projectId).catch(()=>[]),lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){L.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);L.debug("Archive stats",a)}}catch(e){L.debug("Archival failed (non-critical)",{error:te(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await ie.getTaskHistory(this.projectId);if(e.length===0)return;let t=new ss,n=await zl.learnFromTaskHistory(this.projectId,e,t);try{let s=await wg.getFeatureOutcomes(this.projectId);s.length>0&&await zl.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&L.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){L.debug("Auto-learning failed (non-critical)",{error:te(e)})}}async getCliVersion(){try{let e=Po.join(__dirname,"..","..","package.json");return JSON.parse(await bo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return L.debug("Failed to read CLI version",{error:te(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:[]}}},hs=new Ea});var Ln=y(()=>{"use strict";eg();ig();ag();lg();dg();Ol();mg();Nl();Ll();gg();$f();Mf();Qu()});import bn from"chalk";function Mh(r){return Math.ceil(r.length/RT)}function Oh(r){let e=r.split(`
|
|
934
|
+
`}function Df(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 Dt.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:ne(o)})}),n}async function Rf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Dt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(pP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Dt.access(m),g=!0}catch{try{await Dt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let b=await Tf.install(S);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:ne(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:ne(t)})}return e}var $f=y(()=>{"use strict";qn();cn();le();Ln();Ef();l(If,"generateAgents");l(Af,"loadExistingAgents");l(jf,"resolveTemplateIncludes");l(mP,"generateWorkflowAgent");l(gP,"generateDomainAgent");l(fP,"injectFeedbackSection");l(hP,"generateMinimalWorkflowAgent");l(yP,"generateMinimalDomainAgent");l(Df,"configureSkills");l(Rf,"autoInstallSkills")});import Mf from"node:fs/promises";import Of from"node:path";var ta,Ff=y(()=>{"use strict";ta=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=Of.join(this.projectPath,"package.json"),t=await Mf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Mf.access(Of.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as wP}from"node:child_process";import _f from"node:fs/promises";import hu from"node:path";import{promisify as SP}from"node:util";async function Nf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await is("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await is("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await is("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await is("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
935
|
+
`).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 is('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
936
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await is('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:ne(t)})}return e}async function sn(r,e){try{return await _f.access(hu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:ne(t)}),!1}}async function Lf(r){let e={fileCount:0,version:"0.0.0",name:hu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await is('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:ne(t)}),e.fileCount=0}try{let t=hu.join(r,"package.json"),n=JSON.parse(await _f.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 sn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ne(t)})}return await sn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await sn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await sn(r,"requirements.txt")||await sn(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 Hf(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 sn(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 sn(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 sn(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 sn(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 sn(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 Uf(r,e){let t=os(),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 Gf(r){return new ta(r).detect()}var is,zf=y(()=>{"use strict";cn();eu();Ln();Ff();is=SP(wP);l(Nf,"analyzeGit");l(sn,"fileExists");l(Lf,"gatherStats");l(Hf,"detectCommands");l(Uf,"buildSources");l(Gf,"detectStack")});import{exec as kP}from"node:child_process";import yu from"node:fs/promises";import na from"node:path";import{promisify as bP}from"node:util";var CP,wu,Su,Wf,Bf=y(()=>{"use strict";Ut();_();CP=bP(kP),wu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=na.join(r,s);try{await yu.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=na.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=na.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 yu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await yu.readFile(na.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}}},Su=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[wu.contextFilesExist(t),wu.jsonFilesValid(t),wu.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(S=>S.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 CP(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}}}},Wf=new Su});import sa from"node:fs/promises";import ra from"node:path";var oa,as,ku=y(()=>{"use strict";Rs();Yg();sf();af();df();Yl();cn();xn();Ve();Ce();Ci();bn();he();Ar();zr();xi();jr();Dr();$r();yf();le();Ln();dl();pl();Sf();Yc();$f();zf();Bf();oa=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 ea(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ea(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=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=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Wr(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:ne(N)})}let[i,a,c,u]=await Promise.all([Nf(this.projectPath),Lf(this.projectPath),Hf(this.projectPath),Gf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&of(this.projectId))try{let{diff:N,currentHashes:it}=await Zl(this.projectPath,this.projectId),On=N.added.length+N.modified.length+N.deleted.length;if(On===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let gr=tf(N,this.projectId);f=nf(gr.allAffected);let by=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=gr.allAffected.some(Fn=>{let Cy=Fn.substring(Fn.lastIndexOf("."));return by.has(Cy)}),g=gr.directlyChanged.some(Fn=>Fn==="package.json"||Fn==="tsconfig.json"||Fn.includes("Dockerfile")||Fn.includes("docker-compose")),m={isIncremental:!0,filesChanged:On,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Ql(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:ne(N)})}else try{let{currentHashes:N}=await Zl(this.projectPath,this.projectId);Ql(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:ne(N)})}if(p)try{await Promise.all([Kg(this.projectPath,this.projectId),ef(this.projectPath,this.projectId),uf(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:ne(N)})}let S;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(S=N)}catch{}let b=g?await If(this.globalPath,u,a,S):await Af(this.globalPath),D=Df(b,this.projectId,this.globalPath),x=g?await Rf(b):[],O=Uf(a,c),F=[],K={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(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},oe=await ff(K,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 k=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,k);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let ee;try{let N=await R.readConfig(this.projectPath);ee=await Wf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:ne(N)})}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:oe.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:ee,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:ne(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>sa.mkdir(ra.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.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};$.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 wf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:ne(o)})}}async logToMemory(e,t){$.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=ra.join(this.globalPath,m),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:ne(p)})}for(let m of n)try{let p=ra.join(this.globalPath,"agents",`${m.name}.md`),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:ne(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await un.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:ne(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 Zt.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:ne(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.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=St.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ne(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Bn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Dm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.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:ne(e)})}}async getCliVersion(){try{let e=ra.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ne(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:[]}}},as=new oa});var Dn=y(()=>{"use strict";rm();um();dm();fm();ym();Jc();Sm();Yc();km();bm();Bg();Vg();ku()});import mn from"chalk";function Vf(r){return Math.ceil(r.length/vP)}function Jf(r){let e=r.split(`
|
|
1221
937
|
`),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+=`
|
|
1222
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
1223
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
938
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function bu(r){return r.includes("<!-- prjct:preserve")}function qf(r,e){let t=Jf(r),n=Jf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Vf(r),tokensAfter:Vf(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)bu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
939
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(bu(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1224
940
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1225
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
1226
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
941
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!bu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
942
|
+
`).length}),s.hasChanges=!0)}return s}function Kf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:p=>p,o=t?mn.red:p=>p,i=t?mn.yellow:p=>p,a=t?mn.dim:p=>p,c=t?mn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1227
943
|
`);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(`
|
|
1228
|
-
`)}function
|
|
944
|
+
`)}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:c=>c,o=t?mn.red:c=>c,i=t?mn.cyan:c=>c,a=t?mn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1229
945
|
`))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(`
|
|
1230
946
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1231
947
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -1236,11 +952,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Zu(r){return r.incl
|
|
|
1236
952
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1237
953
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
1238
954
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
1239
|
-
`)}var
|
|
1240
|
-
`));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 bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function
|
|
1241
|
-
`)}function
|
|
955
|
+
`)}var vP,Xf=y(()=>{"use strict";vP=4;l(Vf,"estimateTokens");l(Jf,"parseMarkdownSections");l(bu,"isPreservedSection");l(qf,"generateSyncDiff");l(Kf,"formatDiffPreview");l(Yf,"formatFullDiff")});import xP from"node:path";async function Cu(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 Ee.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(`
|
|
956
|
+
`));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 bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Qf(r){try{let e=await mt.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=B.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 lo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function vu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Zf(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 eh(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 | ${lo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ri(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 | ${vu(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: ${lo(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(`
|
|
957
|
+
`)}function th(r,e){let t=[];t.push(`# Repository Analysis
|
|
1242
958
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1243
|
-
`);let n
|
|
959
|
+
`);let n=xP.basename(e);if(t.push(`## Project: ${n}
|
|
1244
960
|
`),t.push(`## Stack Detected
|
|
1245
961
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1246
962
|
`),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
|
|
@@ -1256,34 +972,34 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Zu(r){return r.incl
|
|
|
1256
972
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1257
973
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1258
974
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1259
|
-
`)}var
|
|
1260
|
-
`),
|
|
975
|
+
`)}var nh=y(()=>{"use strict";xn();oi();Dn();Ns();Nt();rt();l(Cu,"showSyncResult");l(Qf,"getSessionActivity");l(lo,"formatTokens");l(vu,"formatDuration");l(Zf,"generateSparkline");l(eh,"generateStatsMarkdown");l(th,"generateAnalysisSummary")});var Wg={};ge(Wg,{AnalysisCommands:()=>cs});import xu from"node:fs/promises";import sh from"node:path";import rh from"prompts";var cs,qi=y(()=>{"use strict";Rs();Jp();xn();oi();Dn();Xf();Ci();he();zr();_();_s();Ns();Nt();nh();rt();cs=class extends ke{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
976
|
+
`),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=th(s,t),i=await R.getProjectId(t),a=n.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Be(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1261
977
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1262
|
-
`),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 R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=
|
|
1263
|
-
${Nh(g)}`),!(await Wh({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"),ed(m,i))}h.spin("Syncing project...");let d=await hs.sync(e,{aiTools:t.aiTools,full:t.full});return d.success?(h.stop(),ed(d,i)):(h.fail(d.error||"Sync failed"),{success:!1,error:d.error})}catch(n){return 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 R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await fn.getSummary(s),i=await fn.getDailyStats(s,30),a=await Uh(s),c=await Ce.getPatternsSummary(s);if(t.json){let g={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(g,null,2)),{success:!0,data:g}}let u=P.getGlobalProjectPath(s),d="Unknown";try{d=JSON.parse(await vo.readFile(nd.join(u,"project.json"),"utf-8")).name||"Unknown"}catch{}let m=await fn.read(s),p=m.firstSync?new Date(m.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: ${d.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let g=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${g}`)}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: ${Co(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Gs(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${td(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let g=o.topAgents.reduce((f,S)=>f+S.usageCount,0);for(let f of o.topAgents){let S=g>0?(f.usageCount/g*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${S}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let g=Hh(i);if(console.log(` ${g} ${Co(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",S=o.trend>0?"+":"";console.log(` ${f} ${S}${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 g=Gh(o,i,d,p,a,c);return console.log(g),{success:!0,data:{markdown:g}}}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 R.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=fo(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await nn.getStatus(s);return t.json?(console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}}):(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 R.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 nn.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 R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await nn.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 R.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=P.getGlobalProjectPath(s),i=e;try{i=JSON.parse(await vo.readFile(nd.join(o,"project.json"),"utf-8")).repoPath||e}catch{}let a=await nn.semanticVerify(s,i);if(t.json)return console.log(JSON.stringify(a)),{success:a.passed,data:a};console.log(""),a.passed?(h.done("Semantic verification passed"),console.log(` ${a.passedCount}/${a.checks.length} checks passed (${a.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${a.failedCount}/${a.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let c of a.checks){let u=c.passed?"\u2713":"\u2717",d=c.passed?`${c.output} (${c.durationMs}ms)`:c.error||"Failed";console.log(` ${u} ${c.name}: ${d}`)}return console.log(""),{success:a.passed,data:a}}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 Aa,z,tr=y(()=>{"use strict";qe();ne();F();re();Aa=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,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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:P.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error: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:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},z=new Aa});import MT from"node:path";var nr,sd=y(()=>{"use strict";Ln();sn();F();it();tr();nr=class extends Te{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=MT.basename(t),i=await ie.getCurrentTask(s),a=await et.getActiveTasks(s),c=await hn.getRecent(s,5),u=await Ut.getPending(s);if(e==="compact"){let g=i?`\u{1F3AF} ${i.description.slice(0,30)}`:"\u{1F4A4} idle",f=`\u{1F4CB} ${a.length}`,S=`\u{1F680} ${c.length}`;return h.done(`${g} | ${f} | ${S}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let g=e==="week"?7:30,f=W.getDaysAgo(g),S=P.getFilePath(s,"memory","context.jsonl"),v=[];try{v=(await Ft.readJsonLines(S)).filter(O=>new Date(O.timestamp)>=f)}catch{v=[]}let x={tasksCompleted:v.filter($=>$.action==="task_completed").length,featuresShipped:v.filter($=>$.action==="feature_shipped").length,totalActions:v.length};console.log(`
|
|
1264
|
-
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${
|
|
1265
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${
|
|
1266
|
-
Activity: ${
|
|
1267
|
-
`),{success:!0,view:e,metrics:
|
|
1268
|
-
\u{1F5FA}\uFE0F ROADMAP - ${
|
|
1269
|
-
`),console.log("\u2550".repeat(50)),!
|
|
1270
|
-
`);else{let
|
|
1271
|
-
`)[0].trim();console.log(` ${
|
|
1272
|
-
`),{success:!0,view:"roadmap"}}console.log(`
|
|
1273
|
-
\u{1F4CA} DASHBOARD - ${
|
|
1274
|
-
`),console.log("\u2550".repeat(50));let
|
|
1275
|
-
${
|
|
1276
|
-
\u{1F3AF} CURRENT FOCUS`),
|
|
1277
|
-
\u{1F4CB} QUEUE`),
|
|
1278
|
-
\u{1F680} RECENT SHIPS`),
|
|
1279
|
-
\u{1F4A1} IDEAS`),console.log(` ${
|
|
978
|
+
`),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 R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await as.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(en(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=sh.join(o,"context","CLAUDE.md"),c=null;try{c=await xu.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 as.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## 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 xu.readFile(a,"utf-8")}catch{p=""}let g=qf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(en("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 xu.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=Ie("## Sync Preview",b.length>0?st("Changes",Gt(b),3):"No section changes.",zt({"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(Kf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await rh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return S.action==="cancel"||!S.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):S.action==="diff"&&(console.log(`
|
|
979
|
+
${Yf(g)}`),!(await rh({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"),Cu(m,i))}t.md||h.spin("Syncing project...");let d=await as.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=Pi("sync"),S=Ie(en("Sync Complete",zt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tn("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Cu(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 s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await un.getSummary(s),i=await un.getDailyStats(s,30),a=await Qf(s),c=await Te.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=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await un.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: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vu(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=Zf(i);if(console.log(` ${p} ${lo(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=eh(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 R.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=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Zt.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=sh.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}`,zt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",Gt(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 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 R.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 Zt.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 R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Zt.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 R.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=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await Zt.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 ia,G,Us=y(()=>{"use strict";Ve();Ce();_();le();ia=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,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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp: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()}},G=new ia});import PP from"node:path";var Gs,Pu=y(()=>{"use strict";Dn();Ut();_();_s();rt();Us();Gs=class extends ke{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 R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=PP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.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=$.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(`
|
|
980
|
+
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
981
|
+
`),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 S=this._generateSparkline(g,m);return console.log(`
|
|
982
|
+
Activity: ${S}
|
|
983
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
|
|
984
|
+
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
985
|
+
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
986
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let b=f.split(`
|
|
987
|
+
`)[0].trim();console.log(` ${S+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
988
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let b=S.priority?` [${S.priority}]`:"";return`${S.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let b=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,st("Current Focus",m,3),st(`Queue (${c.length})`,Gt(p,!0),3),st("Recent Ships",Gt(g),3),st("Ideas",`${d.length} pending`,3),Qe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
989
|
+
\u{1F4CA} DASHBOARD - ${i}
|
|
990
|
+
`),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
991
|
+
${g}`),console.log(`
|
|
992
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=B.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
993
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
994
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let S=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${S?`(${S})`:""}`)}),console.log(`
|
|
995
|
+
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1280
996
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1281
|
-
`)
|
|
997
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.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(`
|
|
1282
998
|
PRJCT COMMANDS
|
|
1283
|
-
`),console.log("=".repeat(50));let i=
|
|
999
|
+
`),console.log("=".repeat(50));let i=G.getAllCategories(),a=G.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(`
|
|
1284
1000
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1285
1001
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1286
|
-
`),{success:!0,topic:"overview"}}let n=
|
|
1002
|
+
`),{success:!0,topic:"overview"}}let n=G.getByName(e);if(n){if(console.log(`
|
|
1287
1003
|
\u{1F4DA} HELP: /p:${n.name}
|
|
1288
1004
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
|
|
1289
1005
|
Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
|
|
@@ -1293,7 +1009,7 @@ ${"\u2550".repeat(50)}
|
|
|
1293
1009
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1294
1010
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1295
1011
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1296
|
-
`),{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
|
|
1012
|
+
`),{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 TP from"node:fs/promises";import EP from"node:path";var ls,MG,Tu=y(()=>{"use strict";Dl();Ve();Ce();Ut();_();ls=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 R.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=A.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 Ni.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=EP.join(e,"analysis","repo-analysis.json"),n=await TP.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}}},MG=new ls});async function aa(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;V.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 ca(r){let e=await R.getProjectId(r);if(!e)return;let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function Eu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await aa(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=V.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;V.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 Ye.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 Pe.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 ca(e),await mt.log(e,"cleanup_performed",{items:s.length,timestamp:B.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Iu=y(()=>{"use strict";Dn();Ut();he();_();rt();l(aa,"cleanupMemory");l(ca,"cleanupMemoryInternal");l(Eu,"cleanup")});import oh from"node:path";async function Au(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 R.getProjectId(t),a=oh.join(A.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1297
1013
|
|
|
1298
1014
|
*Use templates/design/architecture.md for full design*
|
|
1299
1015
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1308,12 +1024,12 @@ ${"\u2550".repeat(50)}
|
|
|
1308
1024
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1309
1025
|
|
|
1310
1026
|
*Use templates/design/flow.md for full design*
|
|
1311
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1027
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=oh.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:B.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 ju=y(()=>{"use strict";Dn();_();rt();l(Au,"design")});import zs from"node:path";async function Du(r=process.cwd()){try{let e=await R.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=A.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ce.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(`
|
|
1312
1028
|
Found abandoned session:
|
|
1313
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let s=
|
|
1029
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let s=B.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1314
1030
|
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
|
|
1315
|
-
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function
|
|
1316
|
-
`).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
|
|
1031
|
+
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Ru(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots");await ce.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=zs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.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 ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp:B.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 $u(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let i=await ce.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(`
|
|
1032
|
+
`).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 ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:B.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 Mu(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let o=await ce.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
|
|
1317
1033
|
SNAPSHOT HISTORY
|
|
1318
1034
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1319
1035
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1321,27 +1037,27 @@ ${"\u2550".repeat(50)}
|
|
|
1321
1037
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1322
1038
|
`)):(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
|
|
1323
1039
|
`)),console.log(`${"=".repeat(50)}
|
|
1324
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var
|
|
1325
|
-
${
|
|
1040
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Ou=y(()=>{"use strict";Dn();_();rt();l(Du,"recover");l(Ru,"undo");l($u,"redo");l(Mu,"history")});var Ws,Fu=y(()=>{"use strict";rt();Iu();ju();Ou();Iu();ju();Ou();Ws=class extends ke{static{l(this,"MaintenanceCommands")}_cleanupMemory=aa;_cleanupMemoryInternal=ca;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Eu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Au(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Du(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ru(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$u(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Mu(e):t}}});import je from"chalk";function la(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}var Rn,Bs,_u=y(()=>{"use strict";ei();_();rt();Rn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(la,"statusIcon");Bs=class extends ke{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 R.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 zn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1041
|
+
${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1326
1042
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1327
|
-
${
|
|
1328
|
-
${
|
|
1329
|
-
`),!(await
|
|
1043
|
+
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=la(i.startup.avg,Rn.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${Rn.startup.max}ms`)}`)}if(i.memory){let c=la(i.memory.peakHeapMB,Rn.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${Rn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=la(i.contextCorrectness.rate,Rn.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${Rn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=la(i.subtaskHandoff.rate,Rn.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${Rn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1044
|
+
${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.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 Nu from"node:fs/promises";import IP from"node:path";import ae from"chalk";var Vs,Lu=y(()=>{"use strict";xn();Ce();_();xe();dt();rt();Vs=class extends ke{static{l(this,"SetupCommands")}async start(){let t=await(Be(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1045
|
+
`),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1330
1046
|
|
|
1331
1047
|
Please install it first:
|
|
1332
|
-
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await
|
|
1048
|
+
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ee.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1333
1049
|
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1334
|
-
${
|
|
1050
|
+
${A.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1335
1051
|
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1336
1052
|
\u{1F389} Setup complete!`),console.log(`
|
|
1337
1053
|
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...
|
|
1338
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1054
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ee.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ee.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1339
1055
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1340
1056
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1341
|
-
\u{1F4DD} Installing global configuration...`);let n=await
|
|
1057
|
+
\u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?A.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(Be(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
|
|
1342
1058
|
\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(`
|
|
1343
1059
|
\u{1F389} Setup complete!
|
|
1344
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=
|
|
1060
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),n=IP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1345
1061
|
# prjct Status Line for Claude Code
|
|
1346
1062
|
# Shows version update notifications and current task
|
|
1347
1063
|
|
|
@@ -1397,18 +1113,18 @@ fi
|
|
|
1397
1113
|
|
|
1398
1114
|
# Default: show prjct branding
|
|
1399
1115
|
echo "\u26A1 prjct"
|
|
1400
|
-
`;await
|
|
1401
|
-
${
|
|
1402
|
-
`)[0])),{success:!1,failed:o,output:c}}}async function
|
|
1116
|
+
`;await Nu.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await Nu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Nu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${fe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function AP(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(ht.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ht.join(r,"yarn.lock"))?"yarn":await P(ht.join(r,"bun.lockb"))||await P(ht.join(r,"bun.lock"))?"bun":(await P(ht.join(r,"package-lock.json")),"npm")}function ih(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function jP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Hu(r){let e=ht.join(r,"package.json"),t=await _n(e,null);if(t){let o=await AP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:ih(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:ih(o,"typecheck")}),i.test&&(a.test={tool:o,command:jP(o)}),a}if(await P(ht.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await fs(ht.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(ht.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(ht.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await hs(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(ht.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(ht.join(r,"gradlew"))&&(await P(ht.join(r,"build.gradle"))||await P(ht.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var ah=y(()=>{"use strict";xe();l(AP,"detectPackageManager");l(ih,"pmRun");l(jP,"pmTest");l(Hu,"detectProjectCommands")});import{exec as DP}from"node:child_process";import{promisify as RP}from"node:util";import Vt from"chalk";function uo(r,e){return`workflow:${r}_${e}`}async function ch(r,e){let t=uo(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(r,t,e.action,"workflow");break;case"session":ua.set(t,e);break;case"once":Js.set(t,e);break}}async function MP(r,e){let t={};for(let n of["before","after","skip"]){let s=uo(n,e),o=Js.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ua.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function $n(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await MP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=uo(e,t);Js.has(i)&&Js.delete(i),console.log(`
|
|
1117
|
+
${Vt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await $P(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(`${Vt.green("\u2713")} ${Vt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Vt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(Vt.dim(c.split(`
|
|
1118
|
+
`)[0])),{success:!1,failed:o,output:c}}}async function Uu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=uo(o,s),a=Js.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ua.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function lh(r,e,t){let n=uo(e,t);return Js.delete(n),ua.delete(n),await Te.recordDecision(r,n,"","workflow:remove"),!0}function uh(r){if(r.length===0)return`${Vt.dim(Ir.NO_PREFERENCES)}
|
|
1403
1119
|
|
|
1404
|
-
Set one: "${
|
|
1405
|
-
`)}var
|
|
1120
|
+
Set one: "${Ir.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"?Vt.green("permanent"):t.scope==="session"?Vt.yellow("session"):Vt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Vt.dim(`Modify: "${Ir.MODIFY_EXAMPLE}"`)),e.push(Vt.dim(`Remove: "${Ir.REMOVE_EXAMPLE}"`)),e.join(`
|
|
1121
|
+
`)}var $P,ua,Js,Gu=y(()=>{"use strict";Rs();_();ln();$P=RP(DP),ua=new Map,Js=new Map;l(uo,"prefKey");l(ch,"setWorkflowPreference");l(MP,"getWorkflowPreferences");l($n,"runWorkflowHooks");l(Uu,"listWorkflowPreferences");l(lh,"removeWorkflowPreference");l(uh,"formatWorkflowPreferences")});import dh from"node:path";var qs,zu=y(()=>{"use strict";Rs();Ut();_();_s();Ns();ah();Gu();rt();qs=class extends ke{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Ke.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
|
|
1406
1122
|
${o.stderr}`.trim(),a=i.split(`
|
|
1407
1123
|
`),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(`
|
|
1408
1124
|
`).filter(m=>!m.startsWith("__EXIT:")).join(`
|
|
1409
|
-
`).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 R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await
|
|
1125
|
+
`).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 R.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 $n(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 pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await $n(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Pi("ship"),S=Ie(en(`Shipped: ${i}`,`Version: ${d}`),st("Results",Gt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Qe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(S)}else h.done(`v${d} shipped`),bt("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 Hu(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 Hu(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=dh.join(e,"package.json"),n=await ce.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 ce.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=dh.join(n,"CHANGELOG.md"),o=await ce.readFile(s,`# Changelog
|
|
1410
1126
|
|
|
1411
|
-
`),i=`## [${t}] - ${
|
|
1127
|
+
`),i=`## [${t}] - ${B.formatDate(new Date)}
|
|
1412
1128
|
|
|
1413
1129
|
### Added
|
|
1414
1130
|
- ${e}
|
|
@@ -1417,72 +1133,73 @@ ${o.stderr}`.trim(),a=i.split(`
|
|
|
1417
1133
|
|
|
1418
1134
|
`,`# Changelog
|
|
1419
1135
|
|
|
1420
|
-
${i}`);await
|
|
1421
|
-
|
|
1422
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1423
|
-
${
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
${Ae.dim("Projection:")}`),console.log(` Backlog: ${Ae.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ae.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{...jn,...n.velocity}}catch{}return jn}}});var WT,BT,ey,$a,Zh,ty,ny=y(()=>{"use strict";cs();WT=[1,2,3,5,8,13,21],BT={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}},ey=l(r=>WT.includes(r),"isValidPoint"),$a=l(r=>BT[r],"pointsToMinutes"),Zh=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"),ty=l(r=>{let e=$a(r);return`${Zh(e.min)}\u2013${Zh(e.max)}`},"pointsToTimeRange")});function Cd(){Ye.clear(),Bt.clear(),ur.clear(),dr.clear()}function vd(){return{issues:Ye.stats(),assignedIssues:Bt.stats(),teams:ur.stats(),projects:dr.stats()}}var Ma,Ye,Bt,ur,dr,xd=y(()=>{"use strict";mi();Ma=300*1e3,Ye=new _t({ttl:Ma,maxSize:100}),Bt=new _t({ttl:Ma,maxSize:10}),ur=new _t({ttl:Ma,maxSize:5}),dr=new _t({ttl:Ma,maxSize:5});l(Cd,"clearLinearCache");l(vd,"getLinearCacheStats")});import{exec as VT}from"node:child_process";import{promisify as qT}from"node:util";async function Oa(r){if(process.platform!=="darwin")return sy(r);try{let{stdout:e}=await KT(`security find-generic-password -s "${XT}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return sy(r)}}function sy(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var KT,XT,Td=y(()=>{"use strict";F();KT=qT(VT),XT="prjct-cli";l(Oa,"getCredential");l(sy,"getEnvFallback")});var YT,QT,ry,Fa,mt,Ed=y(()=>{"use strict";F();Td();YT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},QT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},ry={none:0,urgent:1,high:2,medium:3,low:4},Fa=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 Oa("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?ry[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=ry[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:YT[t?.type||"backlog"]||"backlog",priority:QT[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):[]}},mt=new Fa});var _a,Rt,Ad=y(()=>{"use strict";xd();Ed();_a=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&mt.isConfigured()}async initialize(e){this.initialized||(await mt.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=Bt.get(t);if(n)return n;let s=await mt.fetchAssignedIssues(e);Bt.set(t,s);for(let o of s)Ye.set(`issue:${o.id}`,o),Ye.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Bt.get(n);if(s)return s;let o=await mt.fetchTeamIssues(e,t);Bt.set(n,o);for(let i of o)Ye.set(`issue:${i.id}`,i),Ye.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ye.get(t);if(n)return n;let s=await mt.fetchIssue(e);return s&&(Ye.set(`issue:${s.id}`,s),Ye.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await mt.createIssue(e);return Ye.set(`issue:${t.id}`,t),Ye.set(`issue:${t.externalId}`,t),Bt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await mt.updateIssue(e,t);return Ye.set(`issue:${n.id}`,n),Ye.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await mt.markInProgress(e),Ye.delete(`issue:${e}`),Bt.clear()}async markDone(e){this.ensureInitialized(),await mt.markDone(e),Ye.delete(`issue:${e}`),Bt.clear()}async addComment(e,t){this.ensureInitialized(),await mt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ur.get("teams");if(e)return e;let t=await mt.getTeams();return ur.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=dr.get("projects");if(e)return e;let t=await mt.getProjects();return dr.set("projects",t),t}clearCache(){Cd()}getCacheStats(){return vd()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Rt=new _a});var oy,Na,ZT,iy=y(()=>{"use strict";Lc();wt();F();Ad();oy=1800*1e3,Na=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Rt.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:oy,issues:o};return N.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 Rt.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 Rt.markInProgress(t):n==="done"&&await Rt.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||oy;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 N.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){N.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=im("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}}},ZT=new Na});var ay=y(()=>{"use strict";xd();Ed();Ad();iy()});import eE from"node:fs/promises";import tE from"node:os";import nE from"node:path";function sE(r){return nE.join(tE.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function La(r){let e=sE(r);if(!await T(e))return{};try{return JSON.parse(await eE.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Id(r){let e=await La(r);return e.linear?.apiKey?e.linear.apiKey:Oa("linear-api-key")}var cy=y(()=>{"use strict";F();be();Td();l(sE,"getCredentialsPath");l(La,"getProjectCredentials");l(Id,"getLinearApiKey")});function ly(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`}function rE(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 pr,jd=y(()=>{"use strict";Cu();ku();ny();ay();Nt();sn();F();ro();cy();Sd();cs();it();pr=class extends Te{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 R.getProjectId(t);if(!o)return 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=await pa.execute("task",{task:e},t);if(!a.success)return h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await La(o),S=await Id(o);if(S&&f.linear?.teamId){await Rt.initializeFromApiKey(S,f.linear.teamId);let v=await Rt.fetchIssue(e);v&&(c=e,u=`${e}: ${v.title}`,await Rt.markInProgress(e))}}catch{}await ie.startTask(o,{id:ke(),description:u,sessionId:ke(),linearId:c});let m=await wu.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),so("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:W.getTimestamp()}),await Hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:ey,pointsToMinutes:$a,pointsToTimeRange:ty,storeEstimate:l(async f=>{let S=$a(f);return await ie.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await ie.getCurrentTask(o);return i?(h.done(`working on: ${i.description}`),{success:!0,task:i.description,currentTask:i}):(h.warn("no active task"),{success:!0,message:"No active task"})}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ie.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Hn(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=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await ut.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?ly(d):"0m",actualDuration:c||"0m",variance:d?rE(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,v=f>=0?"+":"";p=` | est: ${m}pt (${ly(d)}) \u2192 ${v}${S}%`}await ie.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await La(s),S=await Id(s);S&&f.linear?.teamId?(await Rt.initializeFromApiKey(S,f.linear.teamId),await Rt.markDone(g),h.done(`${a}${c?` (${c}${p})`:""} \u2192 Linear \u2713`)):h.done(`${a}${c?` (${c}${p})`:""}`)}catch{h.done(`${a}${c?` (${c}${p})`:""}`)}else h.done(`${a}${c?` (${c}${p})`:""}`);return so("completed"),bt("done"),await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.getTimestamp()}),await Hn(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()){try{let t=await this.ensureProjectInit(e);if(!t.success)return t;let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=await et.getActiveTasks(n);return s.length===0?(h.warn("queue empty"),{success:!0,message:"Queue is empty"}):(h.done(`${s.length} task${s.length!==1?"s":""} queued`),bt("next"),{success:!0,tasks:s,count:s.length})}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}async pause(e="",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ie.getCurrentTask(s);if(!o)return h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};await ie.pauseTask(s,e);let i=o.description.slice(0,40);return h.done(`paused: ${i}${e?` (${e})`:""}`),so("paused"),bt("pause"),await this.logToMemory(t,"task_paused",{task:o.description,reason:e,timestamp:W.getTimestamp()}),{success:!0,task:o.description,reason:e}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async resume(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ie.getCurrentTask(s);if(o)return h.warn("already working on a task"),{success:!1,message:`Already working on: ${o.description}`};let i=await ie.resumeTask(s);return i?(h.done(`resumed: ${i.description.slice(0,40)}`),so("working"),bt("resume"),await this.logToMemory(t,"task_resumed",{task:i.description,timestamp:W.getTimestamp()}),{success:!0,task:i.description}):(h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await kd(s);return console.log(Yh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await Kh(s,{...o,createdAt:W.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Xh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>kd(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(ly,"formatMinutesToDuration");l(rE,"formatVariance")});var Pn,aV,uy=y(()=>{"use strict";fa();sd();rd();gd();fd();ga();yd();bd();Pd();jd();Pn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new pr,this.planning=new gs,this.shipping=new cr,this.analytics=new nr,this.performanceCmds=new or,this.maintenance=new rr,this.analysis=new ys,this.setupCmds=new ir,this.velocityCmds=new lr,this.contextCmds=new ws,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async done(e=process.cwd()){return this.workflow.done(e)}async next(e=process.cwd()){return this.workflow.next(e)}async pause(e="",t=process.cwd()){return this.workflow.pause(e,t)}async resume(e=null,t=process.cwd()){return this.workflow.resume(e,t)}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()){return this.planning.bug(e,t)}async idea(e,t=process.cwd()){return this.planning.idea(e,t)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd()){return this.shipping.ship(e,t)}async dash(e="default",t=process.cwd()){return this.analytics.dash(e,t)}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 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)}},aV=new Pn});var To,mr,Dd=y(()=>{"use strict";To={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}},mr=[{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:"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 gy={};pe(gy,{UninstallCommands:()=>Ao,uninstall:()=>my});import{execSync as Ua}from"node:child_process";import gt from"node:fs/promises";import oE from"node:os";import Cn from"node:path";import iE from"node:readline";import Se from"chalk";async function Rd(r){let e=0;try{let t=await gt.readdir(r,{withFileTypes:!0});for(let n of t){let s=Cn.join(r,n.name);if(n.isDirectory())e+=await Rd(s);else try{let o=await gt.stat(s);e+=o.size}catch{}}}catch{}return e}function dy(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function aE(r){try{return(await gt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function cE(){let r={homebrew:!1,npm:!1};try{Ua("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ua("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function lE(){let r=[],e=Xm(),t=P.getGlobalBasePath(),n=await T(t),s=n?await aE(Cn.join(t,"projects")):0,o=n?await Rd(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=Cn.join(e.claude.config,"CLAUDE.md"),a=await T(i),c=!1;if(a)try{let V=await gt.readFile(i,"utf-8");c=V.includes(Ha)&&V.includes(Eo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await T(u),m=d?await Rd(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await T(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Cn.join(e.claude.config,"prjct-statusline.sh"),S=await T(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let v=e.gemini.router,x=await T(v);r.push({path:v,type:"file",description:"Gemini router",exists:x});let E=Cn.join(e.gemini.config,"GEMINI.md"),$=await T(E),O=!1;if($)try{let V=await gt.readFile(E,"utf-8");O=V.includes(Ha)&&V.includes(Eo)}catch{}return $&&O&&r.push({path:E,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function uE(r){try{let e=await gt.readFile(r,"utf-8");if(!e.includes(Ha)||!e.includes(Eo))return!1;let t=e.indexOf(Ha),n=e.indexOf(Eo)+Eo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1136
|
+
${i}`);await ce.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 Ke.get("Bash")("git add .");let n=`feat: ${e}
|
|
1137
|
+
|
|
1138
|
+
Generated with [p/](https://www.prjct.app/)`;return await Ke.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 Ke.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 OP from"node:fs/promises";import FP from"node:path";import Ks from"chalk";var Ys,Wu=y(()=>{"use strict";Ve();Ce();xi();_();Nt();rt();Ys=class extends ke{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(Ks.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1139
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ks.dim("would update")} ${m}`);continue}try{let p=await Wr(d),g=await vi(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ks.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ks.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${Ks.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ks.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 R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=FP.join(A.getGlobalBasePath(),"projects");try{return(await OP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Xs,Bu=y(()=>{"use strict";Cl();vs();rl();_();Xn();rt();Xs=class extends ke{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 R.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 gt.getAll(s);if(i.length===0)return console.log(`
|
|
1140
|
+
${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
|
|
1141
|
+
`),{success:!0,message:"No data"};let a=$i(i,o);await sl.saveMetrics(s,a),console.log(`
|
|
1142
|
+
${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1143
|
+
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=eg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1144
|
+
${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{...kn,...n.velocity}}catch{}return kn}}});var _P,NP,mh,da,ph,gh,fh=y(()=>{"use strict";Xn();_P=[1,2,3,5,8,13,21],NP={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}},mh=l(r=>_P.includes(r),"isValidPoint"),da=l(r=>NP[r],"pointsToMinutes"),ph=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"),gh=l(r=>{let e=da(r);return`${ph(e.min)}\u2013${ph(e.max)}`},"pointsToTimeRange")});function Vu(){et.clear(),Jt.clear(),Qs.clear(),Zs.clear()}function Ju(){return{issues:et.stats(),assignedIssues:Jt.stats(),teams:Qs.stats(),projects:Zs.stats()}}var pa,et,Jt,Qs,Zs,qu=y(()=>{"use strict";Jo();pa=300*1e3,et=new Ft({ttl:pa,maxSize:100}),Jt=new Ft({ttl:pa,maxSize:10}),Qs=new Ft({ttl:pa,maxSize:5}),Zs=new Ft({ttl:pa,maxSize:5});l(Vu,"clearLinearCache");l(Ju,"getLinearCacheStats")});import{exec as LP}from"node:child_process";import{promisify as HP}from"node:util";async function ma(r){if(process.platform!=="darwin")return hh(r);try{let{stdout:e}=await UP(`security find-generic-password -s "${GP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return hh(r)}}function hh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var UP,GP,Ku=y(()=>{"use strict";_();UP=HP(LP),GP="prjct-cli";l(ma,"getCredential");l(hh,"getEnvFallback")});var zP,WP,yh,ga,yt,Yu=y(()=>{"use strict";_();Ku();zP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},WP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},yh={none:0,urgent:1,high:2,medium:3,low:4},ga=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 ma("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?yh[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=yh[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:zP[t?.type||"backlog"]||"backlog",priority:WP[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):[]}},yt=new ga});var fa,Rt,Xu=y(()=>{"use strict";qu();Yu();fa=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=Jt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Jt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Jt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Jt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Jt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Jt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Qs.get("teams");if(e)return e;let t=await yt.getTeams();return Qs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Zs.get("projects");if(e)return e;let t=await yt.getProjects();return Zs.set("projects",t),t}clearCache(){Vu()}getCacheStats(){return Ju()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Rt=new fa});var wh,ha,BP,Sh=y(()=>{"use strict";Za();he();_();Xu();wh=1800*1e3,ha=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Rt.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:wh,issues:o};return $.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 Rt.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 Rt.markInProgress(t):n==="done"&&await Rt.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||wh;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 $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Jd("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}}},BP=new ha});var kh=y(()=>{"use strict";qu();Yu();Xu();Sh()});import VP from"node:fs/promises";import JP from"node:os";import qP from"node:path";function KP(r){return qP.join(JP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function ya(r){let e=KP(r);if(!await P(e))return{};try{return JSON.parse(await VP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Qu(r){let e=await ya(r);return e.linear?.apiKey?e.linear.apiKey:ma("linear-api-key")}var bh=y(()=>{"use strict";_();xe();Ku();l(KP,"getCredentialsPath");l(ya,"getProjectCredentials");l(Qu,"getLinearApiKey")});function Ch(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`}function YP(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 er,Zu=y(()=>{"use strict";Wl();Hl();fh();kh();Ot();Ut();_();_s();Ns();bh();Gu();Xn();rt();er=class extends ke{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 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 $n(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Bi.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await ya(o),S=await Qu(o);if(S&&f.linear?.teamId){await Rt.initializeFromApiKey(S,f.linear.teamId);let b=await Rt.fetchIssue(e);b&&(c=e,u=`${e}: ${b.title}`,await Rt.markInProgress(e))}}catch{}await L.startTask(o,{id:Se(),description:u,sessionId:Se(),linearId:c});let m=await Ll.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],S=ol({description:u,branch:a.branch,linearId:c,type:a.type}),b=f.length>0?il(f,0):"",D=Pm(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),x=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(S,b,D,x))}else h.done(`${e}`,{agents:g>0?g:void 0}),Vr("working"),bt("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:B.getTimestamp()}),await $n(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:mh,pointsToMinutes:da,pointsToTimeRange:gh,storeEstimate:l(async f=>{let S=da(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task")):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=ol({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?il(u,d):"",p=Qe([{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(s){return n.md?console.log(`> Error: ${w(s)}`):h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.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 h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await $n(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=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Ch(d):"0m",actualDuration:c||"0m",variance:d?YP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Ch(d)}) \u2192 ${b}${S}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await ya(s),S=await Qu(s);S&&f.linear?.teamId&&(await Rt.initializeFromApiKey(S,f.linear.teamId),await Rt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(en("Subtask Complete",`**Completed:** ${a}${f}`),zt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{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}`),Vr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await $n(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 R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?console.log(Tn("Queue is empty")):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(st("Queue",`${o.length} task${o.length!==1?"s":""}`),Gt(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(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 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?console.log(Tn("No active task to pause")):h.warn("no active task to pause"),{success:!1,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(en("Task Paused",`**Paused:** ${i.description}`),zt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{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})`:""}`),Vr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.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 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?console.log(Tn(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(en("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Vr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Tn("No paused task found")):h.warn("no paused task to resume"),{success:!1,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 R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Uu(s);return console.log(uh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await ch(s,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await lh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Uu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Ch,"formatMinutesToDuration");l(YP,"formatVariance")});var gn,TB,vh=y(()=>{"use strict";qi();Pu();Tu();Fu();_u();Ji();Lu();zu();Wu();Bu();Zu();gn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new er,this.planning=new rs,this.shipping=new qs,this.analytics=new Gs,this.performanceCmds=new Bs,this.maintenance=new Ws,this.analysis=new cs,this.setupCmds=new Vs,this.updateCmds=new Ys,this.velocityCmds=new Xs,this.contextCmds=new ls,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)}},TB=new gn});var po,tr,ed=y(()=>{"use strict";po={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},tr=[{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 Eh={};ge(Eh,{UninstallCommands:()=>go,uninstall:()=>Th});import{execSync as wa}from"node:child_process";import wt from"node:fs/promises";import XP from"node:os";import fn from"node:path";import QP from"node:readline";import be from"chalk";async function td(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name);if(n.isDirectory())e+=await td(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function xh(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 ZP(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function eT(){let r={homebrew:!1,npm:!1};try{wa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function tT(){let r=[],e=Yp(),t=A.getGlobalBasePath(),n=await P(t),s=n?await ZP(fn.join(t,"projects")):0,o=n?await td(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=fn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let K=await wt.readFile(i,"utf-8");c=K.includes(Sa)&&K.includes(mo)}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 td(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=fn.join(e.claude.config,"prjct-statusline.sh"),S=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=fn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let K=await wt.readFile(x,"utf-8");F=K.includes(Sa)&&K.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function nT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1145
|
+
|
|
1146
|
+
`).trim(),!s||s.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${s}
|
|
1147
|
+
`,"utf-8"),!0}catch{return!1}}async function sT(){let r=XP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=fn.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=A.getGlobalBasePath();return await P(n)&&await Ph(n,fn.join(t,".prjct-cli")),t}catch{return null}}async function Ph(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name),o=fn.join(e,n.name);n.isDirectory()?await Ph(s,o):await wt.copyFile(s,o)}}async function rT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await nT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.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||wa(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||wa("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 oT(r){let e=QP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Th(r={},e=process.cwd()){let t=await tT(),n=eT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(be.yellow(`
|
|
1148
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(be.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(be.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${xh(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${xh(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await sT();c?(console.log(be.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(be.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(be.yellow('Type "uninstall" to confirm:')),!await oT("> ")))return console.log(be.yellow(`
|
|
1149
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await rT(t,n,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
|
|
1150
|
+
${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Sa,mo,go,nd=y(()=>{"use strict";xn();Ce();_();xe();rt();Sa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",mo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(td,"getDirectorySize");l(xh,"formatSize");l(ZP,"countDirectoryItems");l(eT,"detectInstallation");l(tT,"gatherUninstallItems");l(nT,"removePrjctSection");l(sT,"createBackup");l(Ph,"copyDirectory");l(rT,"performUninstall");l(oT,"promptConfirmation");l(Th,"uninstall");go=class extends ke{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Th(e,t)}}});function pT(){for(let[r,e]of Object.entries(po))G.registerCategory(r,e)}function jh(){if(G.has("work"))return;pT();let r=l(e=>tr.find(t=>t.name===e),"getMeta");G.registerMethod("task",nr,"now",r("task")),G.registerMethod("done",nr,"done",r("done")),G.registerMethod("next",nr,"next",r("next")),G.registerMethod("pause",nr,"pause",r("pause")),G.registerMethod("resume",nr,"resume",r("resume")),G.registerMethod("workflow",nr,"workflow",r("workflow")),G.registerMethod("init",ka,"init",r("init")),G.registerMethod("bug",ka,"bug",r("bug")),G.registerMethod("idea",ka,"idea",r("idea")),G.registerMethod("spec",ka,"spec",r("spec")),G.registerMethod("ship",iT,"ship",r("ship")),G.registerMethod("dash",Ih,"dash",r("dash")),G.registerMethod("help",Ih,"help",r("help")),G.registerMethod("perf",aT,"perf",r("perf")),G.registerMethod("velocity",lT,"velocity",r("velocity")),G.registerMethod("cleanup",sr,"cleanup",r("cleanup")),G.registerMethod("design",sr,"design",r("design")),G.registerMethod("recover",sr,"recover",r("recover")),G.registerMethod("undo",sr,"undo",r("undo")),G.registerMethod("redo",sr,"redo",r("redo")),G.registerMethod("history",sr,"history",r("history")),G.registerMethod("analyze",rr,"analyze",r("analyze")),G.registerMethod("sync",rr,"sync",r("sync")),G.registerMethod("stats",rr,"stats",r("stats")),G.registerMethod("status",rr,"status",r("status")),G.registerMethod("seal",rr,"seal",r("seal")),G.registerMethod("verify",rr,"verify",r("verify")),G.registerMethod("start",Ah,"start",r("start")),G.registerMethod("setup",Ah,"setup",r("setup")),G.registerMethod("uninstall",uT,"uninstall",r("uninstall")),G.registerMethod("update",dT,"update",r("update")),G.registerMethod("context",cT,"context",r("context"))}var nr,ka,iT,Ih,aT,sr,rr,Ah,cT,lT,uT,dT,ba=y(()=>{"use strict";qi();Pu();ed();Tu();Fu();_u();Ji();Us();Lu();zu();nd();Wu();Bu();Zu();nr=new er,ka=new rs,iT=new qs,Ih=new Gs,aT=new Bs,sr=new Ws,rr=new cs,Ah=new Vs,cT=new ls,lT=new Xs,uT=new go,dT=new Ys;l(pT,"registerCategories");l(jh,"registerAllCommands");jh()});var sd=y(()=>{"use strict";ac();vh();ba();Us()});var Rh={};ge(Rh,{shutdown:()=>ir,startDaemon:()=>gT});import $t from"node:fs";import{createServer as mT}from"node:net";async function gT(r){let e=Ue.socket(),t=Ue.pid(),n=Ue.runDir();if($t.mkdirSync(n,{recursive:!0}),$t.existsSync(t)){let s=parseInt($t.readFileSync(t,"utf-8").trim(),10);ST(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),$t.unlinkSync(t)}if($t.existsSync(e)&&$t.unlinkSync(e),We={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ea,idleTimer:null},Le=new gn,or=mT(s=>fT(s)),or.listen(e,()=>{$t.chmodSync(e,384),$t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Dh()}),or.on("error",s=>{console.error("Daemon socket error:",s.message),ir(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Yo;fo=Ko({port:i,projectId:o,projectPath:s,enableLogging:!1}),await fo.start()}}catch{}if(process.on("SIGTERM",()=>ir(0)),process.on("SIGINT",()=>ir(0)),process.on("SIGHUP",()=>{Le=new gn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function fT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1151
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await hT(o);r.write(ds(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ds(i))}}}),r.on("error",()=>{})}async function hT(r){if(!We||!Le)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Dh(),We.commandsServed++,We.lastActivity=Date.now(),r.command==="daemon")return wT(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 yT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1435
1152
|
`)||o.message||void 0,stderr:t.join(`
|
|
1436
|
-
`)||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
|
|
1437
|
-
${
|
|
1438
|
-
`),console.log(` ${
|
|
1439
|
-
`),r.forEach((t,n)=>{let s=n===e?
|
|
1153
|
+
`)||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 yT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Le.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 Le.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(r.cwd,{json:t.json===!0});case"verify":return Le.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,r.cwd,{md:n});case"done":return Le.done(r.cwd,{md:n});case"next":return Le.next(r.cwd,{md:n});case"pause":return Le.pause(e||"",r.cwd,{md:n});case"resume":return Le.resume(e,r.cwd,{md:n});case"bug":return Le.bug(e||"",r.cwd,{md:n});case"idea":return Le.idea(e||"",r.cwd,{md:n});case"ship":return Le.ship(e,r.cwd,{md:n});case"dash":return Le.dash(e||"default",r.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return G.execute(r.command,e,r.cwd)}}function wT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ue.socket(),uptime:We?Date.now()-We.startedAt:0,commandsServed:We?.commandsServed??0,lastActivity:We?new Date(We.lastActivity).toISOString():null,registeredCommands:G.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ir(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Dh(){We&&(We.idleTimer&&clearTimeout(We.idleTimer),We.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${We.idleTimeoutMs/1e3/60} minutes, shutting down`),ir(0)},We.idleTimeoutMs),We.idleTimer.unref&&We.idleTimer.unref())}function ir(r){console.log("Daemon shutting down..."),We?.idleTimer&&clearTimeout(We.idleTimer),fo&&(fo.stop(),fo=null),or&&(or.close(),or=null);let e=Ue.socket(),t=Ue.pid();try{$t.existsSync(e)&&$t.unlinkSync(e)}catch{}try{$t.existsSync(t)&&$t.unlinkSync(t)}catch{}process.exit(r)}function ST(r){try{return process.kill(r,0),!0}catch{return!1}}var or,fo,Le,We,$h=y(()=>{"use strict";sd();Us();ba();Ve();wc();ho();or=null,fo=null,Le=null,We=null;l(gT,"startDaemon");l(fT,"handleConnection");l(hT,"handleRequest");l(yT,"executeCommand");l(wT,"handleDaemonCommand");l(Dh,"resetIdleTimer");l(ir,"shutdown");l(ST,"isProcessRunning")});var Oh={};ge(Oh,{runStart:()=>IT});import qt from"node:fs/promises";import rd from"node:os";import hn from"node:path";import W from"chalk";function CT(){console.clear(),console.log(kT),console.log(bT)}function Mh(r,e){console.log(`
|
|
1154
|
+
${W.bold(" Select AI providers to configure:")}
|
|
1155
|
+
`),console.log(` ${W.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1156
|
+
`),r.forEach((t,n)=>{let s=n===e?W.cyan("\u276F"):" ",o=t.selected?W.green("[\u2713]"):W.dim("[ ]"),i=t.installed?W.green("(installed)"):W.yellow("(will install)"),a=n===e?W.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function vT(){let r=await an(),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"),Mh(e,n)},"render");Mh(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(`
|
|
1440
1157
|
Cancelled.
|
|
1441
1158
|
`),process.exit(0)),a==="\r"||a===`
|
|
1442
1159
|
`){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(`
|
|
1443
|
-
${
|
|
1444
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${
|
|
1445
|
-
|
|
1446
|
-
${a}`)}else await qt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${
|
|
1447
|
-
${
|
|
1448
|
-
`),console.log(` ${
|
|
1449
|
-
${
|
|
1450
|
-
|
|
1451
|
-
${
|
|
1452
|
-
${
|
|
1453
|
-
${
|
|
1454
|
-
|
|
1455
|
-
${
|
|
1456
|
-
${
|
|
1457
|
-
${
|
|
1458
|
-
${
|
|
1459
|
-
|
|
1460
|
-
${
|
|
1461
|
-
`)}async function
|
|
1462
|
-
`),!process.argv.includes("--force")))return;let e=await
|
|
1463
|
-
${
|
|
1464
|
-
`);for(let t of e){let n=
|
|
1465
|
-
|
|
1466
|
-
${
|
|
1467
|
-
${
|
|
1468
|
-
${
|
|
1469
|
-
${
|
|
1470
|
-
${
|
|
1471
|
-
${
|
|
1472
|
-
|
|
1473
|
-
`,
|
|
1474
|
-
|
|
1475
|
-
${
|
|
1160
|
+
${W.bold(" Detected providers:")}
|
|
1161
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function xT(r){let e=Fe[r];if(!e.configDir)return!1;try{let t=hn.join(e.configDir,"commands");await qt.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),Ao)),s=n(),o=r==="claude"?"p.md":"p.toml",i=hn.join(s,"templates","commands",o),a=hn.join(t,o);return await P(i)?(await qt.copyFile(i,a),!0):!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function PT(r){let e=Fe[r];if(!e.configDir)return!1;try{await qt.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),Ao)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=hn.join(n,"templates","global",s),i=hn.join(e.configDir,s);if(await P(o)){let a=await qt.readFile(o,"utf-8");if(await P(i)){let c=await qt.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 qt.writeFile(i,m+g+p)}else await qt.writeFile(i,`${c}
|
|
1162
|
+
|
|
1163
|
+
${a}`)}else await qt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function TT(r){let e=hn.join(rd.homedir(),".prjct-cli","config");await qt.mkdir(e,{recursive:!0});let t=hn.join(e,"installed-editors.json"),n={version:fe,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:hn.join(rd.homedir(),`.${r[0]}`,"commands")};await qt.writeFile(t,JSON.stringify(n,null,2))}function ET(r){console.log(`
|
|
1164
|
+
${W.green.bold(" \u2713 Setup complete!")}
|
|
1165
|
+
`),console.log(` ${W.dim("Configured providers:")}`),r.forEach(e=>{let t=Fe[e];console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1166
|
+
${W.bold("Next steps:")}
|
|
1167
|
+
|
|
1168
|
+
${W.cyan("1.")} Navigate to your project directory
|
|
1169
|
+
${W.cyan("2.")} Run ${W.bold("p. init")} to initialize prjct for that project
|
|
1170
|
+
${W.cyan("3.")} Start tracking with ${W.bold('p. task "your task"')}
|
|
1171
|
+
|
|
1172
|
+
${W.dim("Tips:")}
|
|
1173
|
+
${W.dim("\u2022")} Use ${W.bold("p. sync")} to analyze your codebase
|
|
1174
|
+
${W.dim("\u2022")} Use ${W.bold("p. done")} to complete tasks
|
|
1175
|
+
${W.dim("\u2022")} Use ${W.bold("p. ship")} to create PRs
|
|
1176
|
+
|
|
1177
|
+
${W.dim("Learn more: https://prjct.app/docs")}
|
|
1178
|
+
`)}async function IT(){CT();let r=hn.join(rd.homedir(),".prjct-cli","config","installed-editors.json");if(await P(r)&&JSON.parse(await qt.readFile(r,"utf-8")).version===fe&&(console.log(` ${W.yellow("\u2139")} Already configured for v${fe}`),console.log(` ${W.dim("Run with --force to reconfigure")}
|
|
1179
|
+
`),!process.argv.includes("--force")))return;let e=await vT();console.log(`
|
|
1180
|
+
${W.cyan("Setting up...")}
|
|
1181
|
+
`);for(let t of e){let n=Fe[t];process.stdout.write(` ${W.dim("\u2022")} ${n.displayName}... `);let s=await xT(t),o=await PT(t);console.log(s&&o?W.green("\u2713"):s||o?W.yellow("partial"):W.yellow("skipped"))}await TT(e),ET(e)}var ar,cr,lr,ur,dr,kT,bT,Fh=y(()=>{"use strict";Be();_();xe();dt();ar=W.rgb(0,255,255),cr=W.rgb(80,180,255),lr=W.rgb(140,120,255),ur=W.rgb(200,80,220),dr=W.rgb(255,80,180),kT=`
|
|
1182
|
+
|
|
1183
|
+
${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${lr(" \u2588\u2588\u2557")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1184
|
+
${ar(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${dr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1185
|
+
${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
|
|
1186
|
+
${ar(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr("\u2588\u2588 \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
|
|
1187
|
+
${ar(" \u2588\u2588\u2551 ")}${cr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${lr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr(" \u2588\u2588\u2551 ")}
|
|
1188
|
+
${ar(" \u255A\u2550\u255D ")}${cr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${lr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${ur(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${dr(" \u255A\u2550\u255D ")}
|
|
1189
|
+
|
|
1190
|
+
`,bT=` ${W.white("Context Layer for AI Agents")} ${W.dim(`v${fe}`)}
|
|
1191
|
+
|
|
1192
|
+
${W.dim(`Project context layer for AI coding agents.
|
|
1476
1193
|
Works with Claude Code, Gemini CLI, and more.`)}
|
|
1477
|
-
${
|
|
1478
|
-
`;l(
|
|
1479
|
-
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function
|
|
1194
|
+
${W.cyan("https://prjct.app")}
|
|
1195
|
+
`;l(CT,"showBanner");l(Mh,"showProviderSelection");l(vT,"selectProviders");l(xT,"installRouter");l(PT,"installGlobalConfig");l(TT,"saveSetupConfig");l(ET,"showCompletion");l(IT,"runStart")});import{exec as AT}from"node:child_process";import Lh from"node:fs/promises";import rn from"node:path";import{promisify as jT}from"node:util";async function pr(r,e=process.cwd(),t={}){let n=rn.isAbsolute(r)?r:rn.join(e,r),s;try{s=await Lh.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=rn.extname(r).toLowerCase(),i=OT[o]||"unknown",a=MT[i]||[],c=await FT(s,a,n,e),u=[];t.reverse&&(u=await NT(r,e));let d;t.depth&&t.depth>0&&(d=await Hh(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 FT(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 _T(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function _T(r,e,t){let n=rn.dirname(e);if(r.startsWith("@/")){let o=rn.join(t,"src",r.slice(2));return Nh(o,t)}let s=rn.resolve(n,r);return Nh(s,t)}async function Nh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await Lh.stat(s)).isFile())return rn.relative(e,s)}catch{}}return null}async function NT(r,e){let t=[],n=rn.basename(r,rn.extname(r)),s=rn.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await DT(`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(`
|
|
1196
|
+
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function Hh(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 pr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Hh(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var DT,_h,RT,$T,MT,OT,od=y(()=>{"use strict";_();DT=jT(AT),_h=[{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}],RT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],$T=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],MT={typescript:_h,javascript:_h,python:RT,go:$T},OT={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(pr,"analyzeImports");l(FT,"extractImports");l(_T,"resolveImport");l(Nh,"tryResolve");l(NT,"findImportedBy");l(Hh,"buildDependencyTree")});import Uh from"node:fs/promises";import on from"node:path";async function Ca(r,e=process.cwd()){let t=on.isAbsolute(r)?r:on.join(e,r),n;try{n=await Uh.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Qn("")};throw p}let s=on.extname(r).toLowerCase(),o=Gh[s]||"unknown",i=await An(r,e),a=await pr(r,e),c=HT(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?UT(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=GT(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function id(r,e=process.cwd(),t={}){let n=on.isAbsolute(r)?r:on.join(e,r),s=[];async function o(i){let a=await Uh.readdir(i,{withFileTypes:!0});for(let c of a){let u=on.join(i,c.name),d=on.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=on.extname(c.name).toLowerCase();if(Gh[m]){let p=await Ca(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function HT(r,e){let t=LT[e]||[],n=r.split(`
|
|
1480
1197
|
`);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]}
|
|
1481
1198
|
`,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1482
1199
|
`).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(`
|
|
1483
|
-
`)[0]||"";return`Module: ${
|
|
1484
|
-
`)[0].trim()}function
|
|
1485
|
-
`)}var
|
|
1200
|
+
`)[0]||"";return`Module: ${on.basename(s,on.extname(s))}`}function UT(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1201
|
+
`)[0].trim()}function GT(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(`
|
|
1202
|
+
`)}var LT,Gh,zh=y(()=>{"use strict";_();od();_i();eo();LT={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}]},Gh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ca,"summarizeFile");l(id,"summarizeDirectory");l(HT,"extractFilePurpose");l(UT,"extractDescriptionFromDocstring");l(GT,"buildSummaryText")});var Wh=y(()=>{"use strict"});var Bh={};ge(Bh,{analyzeImports:()=>pr,combineMetrics:()=>Fi,countTokens:()=>Oi,extractDirectorySignatures:()=>El,extractSignatures:()=>An,findRelevantFiles:()=>Yr,formatCompressionRate:()=>av,formatCostSaved:()=>Tl,formatTokenCount:()=>iv,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>Qn,runContextTool:()=>zT,summarizeDirectory:()=>id,summarizeFile:()=>Ca});async function zT(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await WT(o,t);break;case"signatures":i=await BT(o,t);break;case"imports":i=await VT(o,t);break;case"recent":i=await JT(o,t);break;case"summary":i=await qT(o,t);break;case"help":return{tool:"error",result:{error:QT(),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=KT(i),u=YT(i);return await XT(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 WT(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 Yr(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function BT(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 El(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Fi(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 An(t,e)}}async function VT(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 pr(t,e,n)}}async function JT(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 Qr(e,t)}}async function qT(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 id(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:Fi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ca(t,e)}}function KT(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 YT(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 XT(r,e){try{await un.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function QT(){return`
|
|
1486
1203
|
Context Tools - Smart context filtering for AI agents
|
|
1487
1204
|
|
|
1488
1205
|
USAGE:
|
|
@@ -1543,7 +1260,7 @@ TOOLS:
|
|
|
1543
1260
|
OUTPUT:
|
|
1544
1261
|
All tools output JSON for easy parsing by AI agents.
|
|
1545
1262
|
Each output includes metrics showing token savings.
|
|
1546
|
-
`.trim()}var
|
|
1263
|
+
`.trim()}var Vh=y(()=>{"use strict";zr();_();le();vl();od();xl();_i();zh();eo();eo();Wh();l(zT,"runContextTool");l(WT,"runFilesTool");l(BT,"runSignaturesTool");l(VT,"runImportsTool");l(JT,"runRecentTool");l(qT,"runSummaryTool");l(KT,"getTokensSaved");l(YT,"getCompressionRate");l(XT,"recordToolUsage");l(QT,"getHelpText")});var Yh={};ge(Yh,{hooksService:()=>oE});import He from"node:fs/promises";import Re from"node:path";import vt from"chalk";function qh(){return`#!/bin/sh
|
|
1547
1264
|
# prjct auto-sync hook (post-commit)
|
|
1548
1265
|
# Syncs project context after each commit
|
|
1549
1266
|
# Installed by: prjct hooks install
|
|
@@ -1564,7 +1281,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1564
1281
|
fi
|
|
1565
1282
|
|
|
1566
1283
|
exit 0
|
|
1567
|
-
`}function
|
|
1284
|
+
`}function Kh(){return`#!/bin/sh
|
|
1568
1285
|
# prjct auto-sync hook (post-checkout)
|
|
1569
1286
|
# Syncs project context after branch switch
|
|
1570
1287
|
# Installed by: prjct hooks install
|
|
@@ -1596,7 +1313,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1596
1313
|
fi
|
|
1597
1314
|
|
|
1598
1315
|
exit 0
|
|
1599
|
-
`}async function
|
|
1316
|
+
`}async function ad(r){let e=[];return(await P(Re.join(r,"lefthook.yml"))||await P(Re.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P(Re.join(r,".husky"))||await P(Re.join(r,".husky","_")))&&e.push("husky"),await P(Re.join(r,".git"))&&e.push("direct"),e}function Jh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ZT(r,e){let t=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(r,t),s=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
|
|
1600
1317
|
${i}:
|
|
1601
1318
|
commands:
|
|
1602
1319
|
${a}:
|
|
@@ -1607,32 +1324,32 @@ ${i}:
|
|
|
1607
1324
|
${a}:
|
|
1608
1325
|
run: prjct sync --quiet --yes
|
|
1609
1326
|
fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
|
|
1610
|
-
${c}`}return await
|
|
1327
|
+
${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function eE(r,e){let t=Re.join(r,".husky");for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1611
1328
|
# prjct auto-sync
|
|
1612
1329
|
prjct sync --quiet --yes &
|
|
1613
|
-
`)}else await
|
|
1330
|
+
`)}else await He.writeFile(s,o,{mode:493})}return!0}async function tE(r,e){let t=Re.join(r,".git","hooks");await P(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1614
1331
|
# prjct auto-sync
|
|
1615
1332
|
${o.split(`
|
|
1616
1333
|
`).slice(1).join(`
|
|
1617
|
-
`)}`)}else await
|
|
1618
|
-
`,"utf-8"),!0}async function
|
|
1334
|
+
`)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function nE(r){let e=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(r,e);if(!await P(t))return!1;let n=await He.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 He.writeFile(t,`${n.trimEnd()}
|
|
1335
|
+
`,"utf-8"),!0}async function sE(r){let e=Re.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
|
|
1619
1336
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1620
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await
|
|
1337
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function rE(r){let e=Re.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=s.split(`
|
|
1621
1338
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1622
|
-
`);await
|
|
1623
|
-
`).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)return{name:"task state",status:"warn",message:"project not initialized"};
|
|
1624
|
-
\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(
|
|
1625
|
-
${
|
|
1626
|
-
`)}function
|
|
1627
|
-
`)}function
|
|
1628
|
-
`)}function
|
|
1629
|
-
${
|
|
1339
|
+
`);await He.writeFile(n,o,{mode:493})}}return!0}var cd,oE,Xh=y(()=>{"use strict";Ve();he();_();xe();Nt();l(qh,"getPostCommitScript");l(Kh,"getPostCheckoutScript");l(ad,"detectHookManagers");l(Jh,"selectStrategy");l(ZT,"installLefthook");l(eE,"installHusky");l(tE,"installDirect");l(nE,"uninstallLefthook");l(sE,"uninstallHusky");l(rE,"uninstallDirect");cd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await ad(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Jh(s);try{let i=!1;switch(o){case"lefthook":i=await ZT(e,n);break;case"husky":i=await eE(e,n);break;case"direct":i=await tE(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 nE(e);break;case"husky":s=await sE(e);break;case"direct":s=await rE(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 ad(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 R.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 ad(e),n=Jh(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.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(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.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: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await P(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await P(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=Re.join(e,".git","hooks",t);return await P(s)?(await He.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=$.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let s=$.getDoc(n,"project")||{};s.hooks=t,$.setDoc(n,"project",s)}catch{}}},oE=new cd});var ey={};ge(ey,{DoctorService:()=>va,doctorService:()=>iE});import{execSync as ld}from"node:child_process";import Qh from"node:fs/promises";import Zh from"node:path";import Mn from"chalk";var va,iE,ty=y(()=>{"use strict";Ve();Ce();Ut();Nt();dt();va=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=A.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=ld(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=Zh.join(this.projectPath,".prjct","prjct.config.json");try{return await Qh.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=Zh.join(this.globalPath,"context","CLAUDE.md");try{let t=await Qh.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{ld("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=ld("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
|
|
1340
|
+
`).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${fe}`)}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"?Mn.dim(" (optional)"):"";return`${o} ${i} ${Mn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Mn.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 Mn.green("\u2713");case"warn":return Mn.yellow("\u26A0");case"error":return t?Mn.dim("\u25CB"):Mn.red("\u2717")}}},iE=new va});var ny={};ge(ny,{WatchService:()=>xa,watchService:()=>dE});import aE from"node:path";import tt from"chalk";import cE from"chokidar";var lE,uE,xa,dE,sy=y(()=>{"use strict";Ve();_();le();ku();lE=["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"],uE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],xa=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 R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=cE.watch(lE,{cwd:this.projectPath,ignored:uE,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(tt.dim(`
|
|
1341
|
+
\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(tt.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(tt.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(`
|
|
1342
|
+
${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await as.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(`${tt.dim(`[${t}]`)} ${tt.green("\u2713")} Synced${o}`)}}else console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(tt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(tt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(tt.dim(` Project: ${aE.basename(this.projectPath)}`)),console.log(tt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(tt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(tt.dim(" Press Ctrl+C to stop")),console.log("")}},dE=new xa});var uy={};ge(uy,{formatAgentCommandHelp:()=>ay,formatCommandHelp:()=>cy,formatCommandList:()=>ly,formatMainHelp:()=>oy,formatTerminalCommandHelp:()=>iy,getHelp:()=>mE});import J from"chalk";function oy(){let r=[];r.push(""),r.push(`${J.cyan.bold("prjct")} v${fe} - Context layer for AI coding agents`),r.push(J.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(J.bold("QUICK START")),r.push(J.dim("\u2500".repeat(60))),r.push(` ${J.green("1.")} prjct start ${J.dim("# Configure AI providers")}`),r.push(` ${J.green("2.")} cd my-project && prjct init`),r.push(` ${J.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${J.green("4.")} p. sync ${J.dim("# Analyze project")}`),r.push(""),r.push(J.bold("TERMINAL COMMANDS")),r.push(J.dim("\u2500".repeat(60)));for(let t of ry){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${J.bold("AI AGENT COMMANDS")} ${J.dim("(inside Claude/Gemini/Cursor)")}`),r.push(J.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${J.dim("\u2500".repeat(56))}`);let e=tr.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(` ${J.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(J.bold("FLAGS")),r.push(J.dim("\u2500".repeat(60)));for(let t of pE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(J.bold("MORE INFO")),r.push(J.dim("\u2500".repeat(60))),r.push(` Documentation: ${J.cyan("https://prjct.app")}`),r.push(` GitHub: ${J.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1343
|
+
`)}function iy(r){let e=ry.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(J.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(J.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
|
|
1344
|
+
`)}function ay(r){let e=tr.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.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(J.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(J.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(J.bold("REQUIREMENTS")),t.push(` ${J.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=po[e.group];return n&&(t.push(J.dim(`Category: ${n.title}`)),e.isOptional&&t.push(J.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1345
|
+
`)}function cy(r){let e=iy(r);if(e)return e;let t=ay(r);return t||`
|
|
1346
|
+
${J.yellow(`Command '${r}' not found.`)}
|
|
1630
1347
|
|
|
1631
1348
|
Run 'prjct help' to see all available commands.
|
|
1632
|
-
`}function
|
|
1633
|
-
`)}function
|
|
1349
|
+
`}function ly(){let r=[];r.push(""),r.push(J.cyan.bold("All Commands")),r.push("");let e=Object.entries(po).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=tr.filter(o=>o.group===t);if(s.length!==0){r.push(`${J.bold(n.title)} ${J.dim(`(${s.length} commands)`)}`),r.push(J.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(J.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1350
|
+
`)}function mE(r){return r?r==="commands"||r==="all"?ly():cy(r):oy()}var ry,pE,dy=y(()=>{"use strict";ed();dt();ry=[{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"]}],pE=[{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(oy,"formatMainHelp");l(iy,"formatTerminalCommandHelp");l(ay,"formatAgentCommandHelp");l(cy,"formatCommandHelp");l(ly,"formatCommandList");l(mE,"getHelp")});var hy={};ge(hy,{installAntigravitySkill:()=>fy,needsAntigravityInstallation:()=>wE,run:()=>gy});import{execSync as gE}from"node:child_process";import q from"node:fs/promises";import us from"node:os";import re from"node:path";import me from"chalk";async function fE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Fs.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${r.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gE(`npm install -g ${e}`,{stdio:"inherit",timeout:Ts("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function gy(){let r=await an(),e=await Oa(),t=Fe[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let i of s){let a=Fe[i],c=r[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!c.installed)if(i===e.provider)if(await fE(a))u.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Ee.detectClaude()){let m=await Ee.syncCommands();m.success&&(u.commandsAdded=m.added,u.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let p=await Ee.installGlobalConfig();p.success&&(u.configAction=p.action,n.configAction||(n.configAction=p.action)),await Ee.installDocs(),await kE(),await bE()}}else if(i==="gemini"){await hE()&&(u.commandsAdded=1,n.commandsAdded+=1);let m=await yE();m.success&&(u.configAction=m.action)}n.providers.push(u)}(await ws()).installed&&(await fy()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),await Ba.saveConfig(fe,await Ee.getInstallPath(),e.provider),await SE();for(let i of n.providers)CE(i,Fe[i.provider]);return n}async function hE(){try{let r=re.join(us.homedir(),".gemini","commands"),e=re.join(r,"p.toml");await q.mkdir(r,{recursive:!0});let t=ve("commands/p.toml");if(t)return await q.writeFile(e,t,"utf-8"),!0;let n=re.join(pe,"templates","commands","p.toml");return await P(n)?(await q.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function yE(){try{let r=re.join(us.homedir(),".gemini"),e=re.join(r,"GEMINI.md");await q.mkdir(r,{recursive:!0});let t=ve("global/GEMINI.md");if(!t){let p=re.join(pe,"templates","global","GEMINI.md");t=await q.readFile(p,"utf-8")}let n="",s=!1;try{n=await q.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await q.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}
|
|
1634
1351
|
|
|
1635
|
-
${t}`;return await
|
|
1352
|
+
${t}`;return await q.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 q.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 fy(){try{let r=re.join(us.homedir(),".gemini","antigravity","skills"),e=re.join(r,"prjct"),t=re.join(e,"SKILL.md");await q.mkdir(e,{recursive:!0});let n=await P(t),s=ve("antigravity/SKILL.md");if(!s){let o=re.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 q.readFile(o,"utf-8")}return await q.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 wE(){let r=await ws();return r.installed&&!r.skillInstalled}async function SE(){try{let r=re.join(us.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await q.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=$.getDoc(n,"project");if(!s)continue;s.cliVersion!==fe&&(s.cliVersion=fe,$.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${fe}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function py(r,e){let t={};if(await P(r))try{t=JSON.parse(await q.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await q.writeFile(r,JSON.stringify(t,null,2))}async function kE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"settings.json"),t=re.join(r,"prjct-statusline.sh"),n=re.join(us.homedir(),".prjct-cli","statusline"),s=re.join(n,"statusline.sh"),o=re.join(n,"themes"),i=re.join(n,"lib"),a=re.join(n,"components"),c=re.join(n,"config.json"),u=re.join(pe,"assets","statusline"),d=re.join(u,"statusline.sh"),m=re.join(u,"themes"),p=re.join(u,"lib"),g=re.join(u,"components"),f=re.join(u,"default-config.json");if(await P(r)||await q.mkdir(r,{recursive:!0}),await P(n)||await q.mkdir(n,{recursive:!0}),await P(o)||await q.mkdir(o,{recursive:!0}),await P(i)||await q.mkdir(i,{recursive:!0}),await P(a)||await q.mkdir(a,{recursive:!0}),await P(s)){let S=await q.readFile(s,"utf8");if(S.includes("CLI_VERSION=")){let b=S.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==fe){let D=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`);await q.writeFile(s,D,{mode:493})}await Pa(p,i),await Pa(g,a),await my(t,s),await py(e,t);return}}if(await P(d)){let S=await q.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`),await q.writeFile(s,S,{mode:493}),await Pa(p,i),await Pa(g,a),await P(m)){let b=await q.readdir(m);for(let D of b){let x=re.join(m,D),O=re.join(o,D);await q.copyFile(x,O)}}!await P(c)&&await P(f)&&await q.copyFile(f,c)}else{let S=`#!/bin/bash
|
|
1636
1353
|
# prjct Status Line for Claude Code
|
|
1637
1354
|
CLI_VERSION="${fe}"
|
|
1638
1355
|
input=$(cat)
|
|
@@ -1663,14 +1380,14 @@ if [ -f "$CONFIG" ]; then
|
|
|
1663
1380
|
fi
|
|
1664
1381
|
fi
|
|
1665
1382
|
echo "prjct"
|
|
1666
|
-
`;await
|
|
1667
|
-
${
|
|
1668
|
-
${
|
|
1669
|
-
|
|
1670
|
-
${
|
|
1671
|
-
${
|
|
1672
|
-
${
|
|
1673
|
-
`)}function
|
|
1383
|
+
`;await q.writeFile(s,S,{mode:493})}await my(t,s),await py(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function bE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"mcp.json");await P(r)||await q.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await q.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await q.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await q.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function Pa(r,e){if(!await P(r))return;let t=await q.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=re.join(r,n),o=re.join(e,n);await q.copyFile(s,o),await q.chmod(o,493)}}async function my(r,e){try{if(await P(r)){if((await q.lstat(r)).isSymbolicLink()&&await q.readlink(r)===e)return;await q.unlink(r)}await q.symlink(e,r)}catch{try{await P(e)&&(await q.copyFile(e,r),await q.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function CE(r,e){if(console.log(""),r.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var vE,yy=y(()=>{"use strict";qn();ki();he();_();ln();xe();Ln();dt();Be();xn();Va();l(fE,"installAICLI");l(gy,"run");l(hE,"installGeminiRouter");l(yE,"installGeminiGlobalConfig");l(fy,"installAntigravitySkill");l(wE,"needsAntigravityInstallation");l(SE,"migrateProjectsCliVersion");l(py,"ensureStatusLineSettings");l(kE,"installStatusLine");l(bE,"installContext7MCP");l(Pa,"installStatusLineModules");l(my,"ensureStatusLineSymlink");l(CE,"showResults");vE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");vE&&gy().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var wy=Iy((qJ,xE)=>{xE.exports={name:"prjct-cli",version:"1.27.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:{"@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",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",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","prompts"]}});var RE={};import Sy from"node:os";import Ta from"node:path";import $e from"chalk";async function PE(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Ay(wy()));await jE(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(DE(),process.exit(0)),h.start();try{let t=G.getByName(r);if(!t){let d=EE(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Gn("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}=AE(t,e),o=TE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await vn.expireIfStale(i),await vn.touch(i))}catch{}let c=new gn,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"),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 vn.trackCommand(i,r,d)}catch{}try{await zn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await zn.recordTiming(i,"startup_time",p)}await zn.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(wo(t)),h.end(),process.exit(1)}}function TE(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 Gn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function EE(r){let e=G.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=IE(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function IE(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 AE(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 jE(r){let e=await an(),t=Ta.join(Sy.homedir(),".claude","commands","p.md"),n=Ta.join(Sy.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Ta.join(process.cwd(),".cursor","commands","sync.md")),P(Ta.join(process.cwd(),".cursor"))]),c=await ws();if(console.log(`
|
|
1384
|
+
${$e.cyan("p/")} prjct v${r}
|
|
1385
|
+
${$e.dim("Context layer for AI coding agents")}
|
|
1386
|
+
|
|
1387
|
+
${$e.dim("Providers:")}`),e.claude.installed){let u=s?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1388
|
+
${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1389
|
+
${$e.cyan("https://prjct.app")}
|
|
1390
|
+
`)}function DE(){console.log(`
|
|
1674
1391
|
prjct - Context layer for AI coding agents
|
|
1675
1392
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1676
1393
|
|
|
@@ -1729,21 +1446,21 @@ MORE INFO
|
|
|
1729
1446
|
---------
|
|
1730
1447
|
Documentation: https://prjct.app
|
|
1731
1448
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1732
|
-
`)}var
|
|
1449
|
+
`)}var ky=y(()=>{"use strict";sd();Us();ba();Be();Ve();ei();Zo();_();Or();xe();Nt();l(PE,"main");l(TE,"validateCommandParams");l(EE,"findClosestCommand");l(IE,"editDistance");l(AE,"parseCommandArgs");l(jE,"displayVersion");l(DE,"displayHelp");PE().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(wo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var mr=process.argv.slice(2),ud=mr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),$E=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(ud&&!$E.has(ud)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(ho(),md)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(ms(),ps)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<mr.length;a++){let c=mr[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<mr.length&&!mr[a+1].startsWith("--")?i[u]=mr[++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:ud,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 ME(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Be(),ut)),s=(await Promise.resolve().then(()=>(Ve(),_d))).default,o=(await Promise.resolve().then(()=>(Va(),Ld))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(wc(),_p)),{fileExists:c}=await Promise.resolve().then(()=>(xe(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ra(),Td)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),Ao));async function m(){let x=r.homedir(),O=await n();if(O.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(O.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!O.claude.installed&&!O.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(()=>(Nt(),Up));x(!0)}let S=p.indexOf("--refresh"),b=S!==-1;b&&(p.splice(S,1),await u());async function D(x){let O=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:K}=await Promise.resolve().then(()=>(Zo(),Wp));return await K.expireIfStale(F),await K.touch(F),()=>{let oe=Date.now()-O;K.trackCommand(F,x,oe).catch(()=>{}),Promise.resolve().then(()=>(ei(),Vp)).then(({performanceTracker:k})=>{k.recordTiming(F,"command_duration",oe,{command:x}).catch(()=>{}),k.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:O,spawnDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:oe}=await Promise.resolve().then(()=>($h(),Rh)),k=parseInt(p.find(ee=>ee.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await oe({port:k,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:O,stopDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O()){let K=await F();console.log(K?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=K?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:O}=await Promise.resolve().then(()=>(ms(),ps)),F=await O();if(F.running){let K=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${K}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(()=>(Fh(),Oh));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(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(O,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:K}=await Promise.resolve().then(()=>(Vh(),Bh)),oe=await K(p.slice(1),O,x);console.log(JSON.stringify(oe,null,2)),process.exitCode=oe.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:O}=await Promise.resolve().then(()=>(Xh(),Yh)),F=p[1]||"status",K=await O.run(process.cwd(),F);process.exitCode=K,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:O}=await Promise.resolve().then(()=>(ty(),ey)),F=await O.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(nd(),Eh)),O=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),K=p.includes("--dry-run")||p.includes("-n"),oe=p.includes("--keep-package"),k=await x({force:O,backup:F,dryRun:K,keepPackage:oe});process.exitCode=k.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(()=>(sy(),ny)),K=p.includes("--verbose")||p.includes("-v"),oe=p.find(it=>it.startsWith("--debounce=")),k=oe?parseInt(oe.split("=")[1],10):void 0,j=p.find(it=>it.startsWith("--interval=")),ee=j?parseInt(j.split("=")[1],10)*1e3:void 0,N=await F.start(x,{verbose:K,quiet:f,debounceMs:k,minIntervalMs:ee});N.success||(console.error(N.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),O=await import("node:fs"),F=process.cwd(),K=await s.getProjectId(F);if(!K)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let oe=e.join(__dirname,"..","core","cli","linear.ts"),k=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),ee,N;if(O.existsSync(oe)?(ee=oe,N="bun"):O.existsSync(j)?(ee=j,N="node"):O.existsSync(k)?(ee=k,N="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,ee="",N=""),ee){let it=["--project",K,...p.slice(1)];x(N,[ee,...it],{stdio:"inherit",cwd:F}).on("close",gr=>{process.exitCode=gr||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(dy(),uy)),O=p[1];console.log(x(O)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),O=r.homedir(),F=process.cwd(),[K,oe,k,j,ee,N]=await Promise.all([c(e.join(O,".claude","commands","p.md")),c(e.join(O,".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(`
|
|
1733
1450
|
${t.cyan("p/")} prjct v${d}
|
|
1734
1451
|
${t.dim("Context layer for AI coding agents")}
|
|
1735
1452
|
|
|
1736
|
-
${t.dim("Providers:")}`),
|
|
1453
|
+
${t.dim("Providers:")}`),x.claude.installed){let it=K?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${it}${t.dim(On)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let it=oe?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${it}${t.dim(On)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(k){let it=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${it}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(ee){let it=N?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${it}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
|
|
1737
1454
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1738
1455
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1739
1456
|
${t.cyan("https://prjct.app")}
|
|
1740
|
-
`)}else{let
|
|
1457
|
+
`)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),O=await m();if(!await c(x)||!O)console.log(`
|
|
1741
1458
|
${t.cyan.bold(" Welcome to prjct!")}
|
|
1742
1459
|
|
|
1743
1460
|
Run ${t.bold("prjct start")} to configure your AI providers.
|
|
1744
1461
|
|
|
1745
1462
|
${t.dim(`This is a one-time setup that lets you choose between
|
|
1746
1463
|
Claude Code, Gemini CLI, or both.`)}
|
|
1747
|
-
`),process.exitCode=0;else{try{let
|
|
1748
|
-
${t.yellow("\u2139")} Updating prjct v${
|
|
1749
|
-
`);let{default:
|
|
1464
|
+
`),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
|
|
1465
|
+
${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
|
|
1466
|
+
`);let{default:K}=await Promise.resolve().then(()=>(yy(),hy));await K.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(ms(),ps)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(ky(),RE))}}}l(ME,"main");ME().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|