prjct-cli 1.33.0 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/dist/bin/prjct-core.mjs +233 -229
- package/dist/daemon/entry.mjs +198 -194
- package/package.json +1 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,11 +5,11 @@ import { dirname as __pathDirname } from 'path';
|
|
|
5
5
|
var require = __createRequire(import.meta.url);
|
|
6
6
|
var __filename = __fileURLToPath(import.meta.url);
|
|
7
7
|
var __dirname = __pathDirname(__filename);
|
|
8
|
-
var
|
|
9
|
-
`,"utf-8")}async function
|
|
10
|
-
`)}async function
|
|
11
|
-
`);await Ul(r,t)}function Mf(r){return Wn.extname(r)}function Of(r){return Wn.basename(r,Wn.extname(r))}var _e=w(()=>{"use strict";Ll();F();l(mn,"readJson");l(Rs,"writeJson");l(Bn,"readFile");l(Ul,"writeFile");l(Pf,"atomicWrite");l(xf,"appendToFile");l(Ti,"appendLine");l(vf,"prependToFile");l(M,"fileExists");l(Er,"dirExists");l(Ct,"ensureDir");l(Tf,"deleteFile");l(Ef,"deleteDir");l(Vn,"listFiles");l(Af,"getFileSize");l(If,"getFileModifiedTime");l(Df,"copyFile");l(Rf,"moveFile");l(jf,"readLines");l($f,"writeLines");l(Mf,"getFileExtension");l(Of,"getFileNameWithoutExtension")});import{z as $t}from"zod";function Hl(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 Wx,Bx,Vx,js,Jx,$s=w(()=>{"use strict";Wx=$t.enum(["opus","sonnet","haiku"]),Bx=$t.enum(["2.5-pro","2.5-flash","2.0-flash"]),Vx=$t.string().min(1),js=$t.object({provider:$t.string(),model:$t.string(),cliVersion:$t.string().optional(),recordedAt:$t.string()}),Jx=$t.object({preferredModel:$t.string().optional(),lastAnalysisModel:js.optional()});l(Hl,"compareSemver")});import Ei from"node:fs/promises";import Ff from"node:os";import Gl from"node:path";async function Bl(){try{let r=await Ei.readFile(Wl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>_f?null:e.detection}catch{return null}}async function Vl(r){let e={timestamp:new Date().toISOString(),detection:r};await Ei.mkdir(zl,{recursive:!0}),await Ei.writeFile(Wl,JSON.stringify(e,null,2))}var zl,Wl,_f,Jl=w(()=>{"use strict";zl=Gl.join(Ff.homedir(),".prjct-cli","cache"),Wl=Gl.join(zl,"providers.json"),_f=600*1e3;l(Bl,"readProviderCache");l(Vl,"writeProviderCache")});var it={};Gn(it,{AntigravityProvider:()=>Di,ClaudeProvider:()=>Ar,CodexProvider:()=>Ri,CursorProvider:()=>Yl,GeminiProvider:()=>Ii,Providers:()=>Pt,WindsurfProvider:()=>Xl,detectAllProviders:()=>ji,detectAntigravity:()=>Bf,detectCodex:()=>Vf,detectCursorProject:()=>eu,detectProvider:()=>Ai,detectWindsurfProject:()=>tu,getActiveProvider:()=>Hf,getCommandsDir:()=>Yf,getGlobalContextPath:()=>Jf,getGlobalSettingsPath:()=>qf,getProjectCommandsPath:()=>Xf,getProviderBranding:()=>Ir,getSkillsPath:()=>Kf,hasProviderConfig:()=>Gf,needsCursorRouterRegeneration:()=>zf,needsWindsurfRouterRegeneration:()=>Wf,selectProvider:()=>Qf,validateCliVersion:()=>Zl});import{exec as Nf}from"node:child_process";import Xt from"node:os";import Ae from"node:path";import{promisify as Lf}from"node:util";async function Ql(r){try{let{stdout:e}=await ql(`which ${r}`,{timeout:Kl});return e.trim()}catch{return null}}async function Uf(r){try{let{stdout:e}=await ql(`${r} --version`,{timeout:Kl}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ai(r){let e=Pt[r];if(!e.cliCommand)return{installed:!1};let t=await Ql(e.cliCommand);if(!t)return{installed:!1};let n=await Uf(e.cliCommand),s=Zl(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Zl(r,e){let t=Pt[r];return!t.minCliVersion||!e?null:Hl(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 ji(r=!1){if(!r){let s=await Bl();if(s)return s}let[e,t]=await Promise.all([Ai("claude"),Ai("gemini")]),n={claude:e,gemini:t};return await Vl(n).catch(()=>{}),n}async function Hf(r){if(r&&Pt[r])return Pt[r];let e=await ji();return e.claude.installed&&!e.gemini.installed?Ar:e.gemini.installed&&!e.claude.installed?Ii:Ar}async function Gf(r){let e=Pt[r];return e.configDir?M(e.configDir):!1}function Ir(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function eu(r){let e=Ae.join(r,".cursor"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.mdc"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function zf(r){let e=await eu(r);return e.detected&&!e.routerInstalled}async function tu(r){let e=Ae.join(r,".windsurf"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.md"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Wf(r){let e=await tu(r);return e.detected&&!e.routerInstalled}async function Bf(){let r=Di.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ae.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([M(r),M(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Vf(){let r=Ri.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Ql("codex"),t=Ae.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([M(r),M(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Jf(r){let e=Pt[r];return e.configDir?Ae.join(e.configDir,e.contextFile):null}function qf(r){let e=Pt[r];return!e.configDir||!e.settingsFile?null:Ae.join(e.configDir,e.settingsFile)}function Kf(r){return Pt[r].skillsDir}function Yf(r){return Pt[r].commandsDir}function Xf(r,e){let t=Pt[r];return Ae.join(e,t.commandsDir)}async function Qf(){let r=await ji(),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 ql,Kl,Ar,Ii,Di,Yl,Xl,Ri,Pt,Xe=w(()=>{"use strict";$s();_e();Jl();ql=Lf(Nf),Kl=2e3,Ar={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ae.join(Xt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ae.join(Xt.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"},Ii={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ae.join(Xt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ae.join(Xt.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"},Di={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ae.join(Xt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ae.join(Xt.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},Yl={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},Xl={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},Ri={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ae.join(Xt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ae.join(Xt.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null},Pt={claude:Ar,gemini:Ii,cursor:Yl,antigravity:Di,windsurf:Xl,codex:Ri};l(Ql,"whichCommand");l(Uf,"getCliVersion");l(Ai,"detectProvider");l(Zl,"validateCliVersion");l(ji,"detectAllProviders");l(Hf,"getActiveProvider");l(Gf,"hasProviderConfig");l(Ir,"getProviderBranding");l(eu,"detectCursorProject");l(zf,"needsCursorRouterRegeneration");l(tu,"detectWindsurfProject");l(Wf,"needsWindsurfRouterRegeneration");l(Bf,"detectAntigravity");l(Vf,"detectCodex");l(Jf,"getGlobalContextPath");l(qf,"getGlobalSettingsPath");l(Kf,"getSkillsPath");l(Yf,"getCommandsDir");l(Xf,"getProjectCommandsPath");l(Qf,"selectProvider")});import Zf from"node:crypto";import Mt from"node:fs/promises";import $i from"node:os";import N from"node:path";import{globSync as eh}from"glob";var Mi,th,v,le=w(()=>{"use strict";se();_e();Mi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?N.resolve(e):N.join($i.homedir(),".prjct-cli"),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=N.resolve(e),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}generateProjectId(e){return Zf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return N.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return N.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return N.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return N.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Er(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await Ct(this.globalBaseDir),await Ct(this.globalProjectsDir),await Ct(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 Ct(N.join(t,s));return await Ct(N.join(t,"planning","tasks")),await Ct(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=vi(t);return N.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 Ct(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Mt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await Mt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=N.join(c,d.name),p=await Mt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:N.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 N.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Mt.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 Er(t)}getDisplayPath(e){let t=$i.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return N.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return N.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return N.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return N.join(this.globalBaseDir,".running")}getDocsPath(){return N.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Xe(),gt(it)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Xe(),gt(it)).getActiveProvider();return(Xe(),gt(it)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join($i.homedir(),".claude")}getClaudeSettingsPath(){return N.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?N.join(this.getGlobalProjectPath(e),"agents"):N.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return N.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return N.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=N.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=N.join(e,"package.json");if(await M(s))try{let o=await Mt.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 Mt.readFile(N.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
12
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=N.join(e,"package.json"),i=await Mt.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=N.join(e,"lerna.json");if(await M(c)){let u=await Mt.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=N.join(e,"package.json"),i=await Mt.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=
|
|
8
|
+
var Pr=Object.defineProperty;var cf=Object.getOwnPropertyDescriptor;var lf=Object.getOwnPropertyNames;var uf=Object.prototype.hasOwnProperty;var l=(r,e)=>Pr(r,"name",{value:e,configurable:!0}),Ds=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var Gn=(r,e)=>{for(var t in e)Pr(r,t,{get:e[t],enumerable:!0})},df=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of lf(e))!uf.call(r,s)&&s!==t&&Pr(r,s,{get:()=>e[s],enumerable:!(n=cf(e,s))||n.enumerable});return r};var ft=r=>df(Pr({},"__esModule",{value:!0}),r);var Rl=w(()=>{"use strict"});var vr,jl=w(()=>{"use strict";vr={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 Is,xr=w(()=>{"use strict";Is={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 $l(r){return r instanceof Error&&"code"in r}function P(r){return $l(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=w(()=>{"use strict";l($l,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Ml=w(()=>{"use strict"});var Ol=w(()=>{"use strict";Ml()});function Tr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,Fl,zn=w(()=>{"use strict";j={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"},Fl=["frontend","backend","devops","docs","testing","database","general"];l(Tr,"calculateConfidence")});var vi=w(()=>{"use strict"});var xi=w(()=>{"use strict";Rl();jl();xr();F();Ol();zn();vi()});var U={};Gn(U,{calculateDuration:()=>Pf,formatDate:()=>Er,formatDuration:()=>zt,formatMonth:()=>hf,getDateKey:()=>yf,getDateRange:()=>kf,getDaysAgo:()=>Yt,getDaysFromNow:()=>Sf,getEndOfDay:()=>xf,getStartOfDay:()=>vf,getTimestamp:()=>b,getTodayKey:()=>_l,getYearMonthDay:()=>Ti,isToday:()=>bf,isWithinLastDays:()=>Cf,parseDate:()=>wf,toRelative:()=>Tf});import{formatDistanceToNowStrict as ff}from"date-fns";function Er(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 hf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function _l(){return Er(new Date)}function yf(r){return Er(r)}function Ti(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function wf(r){return new Date(r)}function b(){return new Date().toISOString()}function Yt(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Sf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function kf(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 bf(r){return Er(r)===_l()}function Cf(r,e){let t=Yt(e);return r>=t}function zt(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 Pf(r,e=new Date){let t=e.getTime()-r.getTime();return zt(t)}function vf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function xf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Tf(r){let e=typeof r=="string"?new Date(r):r;return ff(e,{addSuffix:!0})}var se=w(()=>{"use strict";l(Er,"formatDate");l(hf,"formatMonth");l(_l,"getTodayKey");l(yf,"getDateKey");l(Ti,"getYearMonthDay");l(wf,"parseDate");l(b,"getTimestamp");l(Yt,"getDaysAgo");l(Sf,"getDaysFromNow");l(kf,"getDateRange");l(bf,"isToday");l(Cf,"isWithinLastDays");l(zt,"formatDuration");l(Pf,"calculateDuration");l(vf,"getStartOfDay");l(xf,"getEndOfDay");l(Tf,"toRelative")});import Ul from"node:fs/promises";async function Hl(r,e){let t;try{t=await Ul.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Nl(r,t),Ll(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Nl(r,t),Ll(r,Ef(s.error)),null)}async function Nl(r,e){let t=`${r}.backup`;try{await Ul.writeFile(t,e,"utf-8")}catch{}}function Ll(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 Ef(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Gl=w(()=>{"use strict";F();l(Hl,"safeRead");l(Nl,"createBackup");l(Ll,"logCorruption");l(Ef,"formatZodError")});var re={};Gn(re,{appendLine:()=>Ei,appendToFile:()=>Df,atomicWrite:()=>Af,copyFile:()=>Of,deleteDir:()=>jf,deleteFile:()=>Rf,dirExists:()=>Ar,ensureDir:()=>Ct,fileExists:()=>M,getFileExtension:()=>Lf,getFileModifiedTime:()=>Mf,getFileNameWithoutExtension:()=>Uf,getFileSize:()=>$f,listFiles:()=>Vn,moveFile:()=>Ff,prependToFile:()=>If,readFile:()=>Bn,readJson:()=>mn,readLines:()=>_f,writeFile:()=>zl,writeJson:()=>Rs,writeLines:()=>Nf});import ce from"node:fs/promises";import Wn from"node:path";async function mn(r,e=null,t){if(t)return await Hl(r,t)??e;try{let n=await ce.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function Rs(r,e,t=2){let n=JSON.stringify(e,null,t);await ce.writeFile(r,n,"utf-8")}async function Bn(r,e=""){try{return await ce.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function zl(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0}),await ce.writeFile(r,e,"utf-8")}async function Af(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ce.writeFile(n,e,"utf-8"),await ce.rename(n,r)}async function Df(r,e){await ce.appendFile(r,e,"utf-8")}async function Ei(r,e){let t=Wn.dirname(r);await ce.mkdir(t,{recursive:!0}),await ce.appendFile(r,`${e}
|
|
9
|
+
`,"utf-8")}async function If(r,e){try{let t=await ce.readFile(r,"utf-8");await ce.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await ce.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await ce.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function Ar(r){try{return(await ce.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Ct(r){await ce.mkdir(r,{recursive:!0})}async function Rf(r){try{return await ce.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function jf(r){try{return await ce.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function Vn(r,e={}){try{let n=await ce.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(P(t))return[];throw t}}async function $f(r){return(await ce.stat(r)).size}async function Mf(r){return(await ce.stat(r)).mtime}async function Of(r,e){await ce.copyFile(r,e)}async function Ff(r,e){await ce.rename(r,e)}async function _f(r){return(await Bn(r,"")).split(`
|
|
10
|
+
`)}async function Nf(r,e){let t=e.join(`
|
|
11
|
+
`);await zl(r,t)}function Lf(r){return Wn.extname(r)}function Uf(r){return Wn.basename(r,Wn.extname(r))}var _e=w(()=>{"use strict";Gl();F();l(mn,"readJson");l(Rs,"writeJson");l(Bn,"readFile");l(zl,"writeFile");l(Af,"atomicWrite");l(Df,"appendToFile");l(Ei,"appendLine");l(If,"prependToFile");l(M,"fileExists");l(Ar,"dirExists");l(Ct,"ensureDir");l(Rf,"deleteFile");l(jf,"deleteDir");l(Vn,"listFiles");l($f,"getFileSize");l(Mf,"getFileModifiedTime");l(Of,"copyFile");l(Ff,"moveFile");l(_f,"readLines");l(Nf,"writeLines");l(Lf,"getFileExtension");l(Uf,"getFileNameWithoutExtension")});import{z as $t}from"zod";function Wl(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 Kv,Yv,Xv,js,Qv,$s=w(()=>{"use strict";Kv=$t.enum(["opus","sonnet","haiku"]),Yv=$t.enum(["2.5-pro","2.5-flash","2.0-flash"]),Xv=$t.string().min(1),js=$t.object({provider:$t.string(),model:$t.string(),cliVersion:$t.string().optional(),recordedAt:$t.string()}),Qv=$t.object({preferredModel:$t.string().optional(),lastAnalysisModel:js.optional()});l(Wl,"compareSemver")});import Ai from"node:fs/promises";import Hf from"node:os";import Bl from"node:path";async function ql(){try{let r=await Ai.readFile(Jl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Gf?null:e.detection}catch{return null}}async function Kl(r){let e={timestamp:new Date().toISOString(),detection:r};await Ai.mkdir(Vl,{recursive:!0}),await Ai.writeFile(Jl,JSON.stringify(e,null,2))}var Vl,Jl,Gf,Yl=w(()=>{"use strict";Vl=Bl.join(Hf.homedir(),".prjct-cli","cache"),Jl=Bl.join(Vl,"providers.json"),Gf=600*1e3;l(ql,"readProviderCache");l(Kl,"writeProviderCache")});var at={};Gn(at,{AntigravityProvider:()=>Ri,ClaudeProvider:()=>Dr,CodexProvider:()=>ji,CursorProvider:()=>Zl,GeminiProvider:()=>Ii,Providers:()=>Pt,WindsurfProvider:()=>eu,detectAllProviders:()=>$i,detectAntigravity:()=>Yf,detectCodex:()=>Xf,detectCursorProject:()=>su,detectProvider:()=>Di,detectWindsurfProject:()=>ru,getActiveProvider:()=>Vf,getCommandsDir:()=>th,getGlobalContextPath:()=>Qf,getGlobalSettingsPath:()=>Zf,getProjectCommandsPath:()=>nh,getProviderBranding:()=>Ir,getSkillsPath:()=>eh,hasProviderConfig:()=>Jf,needsCursorRouterRegeneration:()=>qf,needsWindsurfRouterRegeneration:()=>Kf,selectProvider:()=>sh,validateCliVersion:()=>nu});import{exec as zf}from"node:child_process";import Xt from"node:os";import Ae from"node:path";import{promisify as Wf}from"node:util";async function tu(r){try{let{stdout:e}=await Xl(`which ${r}`,{timeout:Ql});return e.trim()}catch{return null}}async function Bf(r){try{let{stdout:e}=await Xl(`${r} --version`,{timeout:Ql}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Di(r){let e=Pt[r];if(!e.cliCommand)return{installed:!1};let t=await tu(e.cliCommand);if(!t)return{installed:!1};let n=await Bf(e.cliCommand),s=nu(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function nu(r,e){let t=Pt[r];return!t.minCliVersion||!e?null:Wl(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 $i(r=!1){if(!r){let s=await ql();if(s)return s}let[e,t]=await Promise.all([Di("claude"),Di("gemini")]),n={claude:e,gemini:t};return await Kl(n).catch(()=>{}),n}async function Vf(r){if(r&&Pt[r])return Pt[r];let e=await $i();return e.claude.installed&&!e.gemini.installed?Dr:e.gemini.installed&&!e.claude.installed?Ii:Dr}async function Jf(r){let e=Pt[r];return e.configDir?M(e.configDir):!1}function Ir(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function su(r){let e=Ae.join(r,".cursor"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.mdc"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function qf(r){let e=await su(r);return e.detected&&!e.routerInstalled}async function ru(r){let e=Ae.join(r,".windsurf"),t=Ae.join(e,"rules"),n=Ae.join(t,"prjct.md"),[s,o]=await Promise.all([M(e),M(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Kf(r){let e=await ru(r);return e.detected&&!e.routerInstalled}async function Yf(){let r=Ri.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ae.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([M(r),M(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Xf(){let r=ji.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await tu("codex"),t=Ae.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([M(r),M(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Qf(r){let e=Pt[r];return e.configDir?Ae.join(e.configDir,e.contextFile):null}function Zf(r){let e=Pt[r];return!e.configDir||!e.settingsFile?null:Ae.join(e.configDir,e.settingsFile)}function eh(r){return Pt[r].skillsDir}function th(r){return Pt[r].commandsDir}function nh(r,e){let t=Pt[r];return Ae.join(e,t.commandsDir)}async function sh(){let r=await $i(),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 Xl,Ql,Dr,Ii,Ri,Zl,eu,ji,Pt,Qe=w(()=>{"use strict";$s();_e();Yl();Xl=Wf(zf),Ql=2e3,Dr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ae.join(Xt.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ae.join(Xt.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"},Ii={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ae.join(Xt.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ae.join(Xt.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"},Ri={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ae.join(Xt.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ae.join(Xt.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},Zl={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},eu={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},ji={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ae.join(Xt.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ae.join(Xt.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null},Pt={claude:Dr,gemini:Ii,cursor:Zl,antigravity:Ri,windsurf:eu,codex:ji};l(tu,"whichCommand");l(Bf,"getCliVersion");l(Di,"detectProvider");l(nu,"validateCliVersion");l($i,"detectAllProviders");l(Vf,"getActiveProvider");l(Jf,"hasProviderConfig");l(Ir,"getProviderBranding");l(su,"detectCursorProject");l(qf,"needsCursorRouterRegeneration");l(ru,"detectWindsurfProject");l(Kf,"needsWindsurfRouterRegeneration");l(Yf,"detectAntigravity");l(Xf,"detectCodex");l(Qf,"getGlobalContextPath");l(Zf,"getGlobalSettingsPath");l(eh,"getSkillsPath");l(th,"getCommandsDir");l(nh,"getProjectCommandsPath");l(sh,"selectProvider")});import rh from"node:crypto";import Mt from"node:fs/promises";import Mi from"node:os";import N from"node:path";import{globSync as oh}from"glob";var Oi,ih,x,le=w(()=>{"use strict";se();_e();Oi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?N.resolve(e):N.join(Mi.homedir(),".prjct-cli"),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=N.resolve(e),this.globalProjectsDir=N.join(this.globalBaseDir,"projects"),this.globalConfigDir=N.join(this.globalBaseDir,"config")}generateProjectId(e){return rh.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return N.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return N.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return N.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return N.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Ar(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await Ct(this.globalBaseDir),await Ct(this.globalProjectsDir),await Ct(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 Ct(N.join(t,s));return await Ct(N.join(t,"planning","tasks")),await Ct(N.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Ti(t);return N.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 Ct(n),n}async listSessions(e,t=null,n=null){let s=N.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Mt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=N.join(s,a.name),u=await Mt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=N.join(c,d.name),p=await Mt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:N.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 N.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Mt.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 Ar(t)}getDisplayPath(e){let t=Mi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return N.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return N.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return N.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return N.join(this.globalBaseDir,".running")}getDocsPath(){return N.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Qe(),ft(at)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Qe(),ft(at)).getActiveProvider();return(Qe(),ft(at)).getGlobalSettingsPath(e.name)}getClaudeDir(){return N.join(Mi.homedir(),".claude")}getClaudeSettingsPath(){return N.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?N.join(this.getGlobalProjectPath(e),"agents"):N.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return N.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return N.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=N.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=N.join(e,"package.json");if(await M(s))try{let o=await Mt.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 Mt.readFile(N.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
12
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=N.join(e,"package.json"),i=await Mt.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=N.join(e,"lerna.json");if(await M(c)){let u=await Mt.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=N.join(e,"package.json"),i=await Mt.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=oh(o,{cwd:e,absolute:!1});for(let a of i){let c=N.join(e,a),u=N.join(c,"package.json");if(await M(u))try{let d=await Mt.readFile(u,"utf-8"),m=JSON.parse(d),p=N.join(c,"PRJCT.md");n.push({name:m.name||N.basename(a),path:c,relativePath:a,hasPrjctMd:await M(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=N.resolve(e);for(let s of t.packages){let o=N.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=N.resolve(e),n=N.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=N.dirname(t)}return null}},ih=new Oi,x=ih});function ah(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ms(){return ah()==="bun"}var Fi=w(()=>{"use strict";l(ah,"detectRuntime");l(Ms,"isBun")});import _i from"node:fs";import ou from"node:path";function ch(r){if(Ms()){let{Database:s}=Ds("bun:sqlite");return new s(r,{create:!0})}let e=Ds("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var lh,Rr,D,G,ae=w(()=>{"use strict";le();Fi();l(ch,"openDatabase");lh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
13
13
|
-- =======================================================================
|
|
14
14
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
15
15
|
-- =======================================================================
|
|
@@ -258,13 +258,13 @@ var Cr=Object.defineProperty;var nf=Object.getOwnPropertyDescriptor;var sf=Objec
|
|
|
258
258
|
);
|
|
259
259
|
|
|
260
260
|
CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
|
|
261
|
-
`)},"up")}],
|
|
261
|
+
`)},"up")}],Rr=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return ou.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=ou.dirname(n);_i.existsSync(s)||_i.mkdirSync(s,{recursive:!0});let o=ch(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 _i.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(`
|
|
262
262
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
263
263
|
version INTEGER PRIMARY KEY,
|
|
264
264
|
name TEXT NOT NULL,
|
|
265
265
|
applied_at TEXT NOT NULL
|
|
266
266
|
)
|
|
267
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of rh)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},A=new Dr,G=A});function Ni(r){if($l.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Rr))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 _i,Rr,gn,Os,Fs,_s=w(()=>{"use strict";ae();zn();se();_i={frontend:[j.CODE_STYLE,j.FILE_STRUCTURE,j.ARCHITECTURE,j.TECH_STACK],backend:[j.CODE_STYLE,j.ARCHITECTURE,j.DEPENDENCIES,j.TECH_STACK],devops:[j.SHIP_WORKFLOW,j.TEST_BEHAVIOR,j.DEPENDENCIES,j.ARCHITECTURE],docs:[j.CODE_STYLE,j.NAMING_CONVENTION,j.FILE_STRUCTURE],testing:[j.TEST_BEHAVIOR,j.CODE_STYLE,j.DEPENDENCIES],database:[j.ARCHITECTURE,j.NAMING_CONVENTION,j.TECH_STACK,j.DEPENDENCIES],general:Object.values(j)},Rr={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(Ni,"resolveCanonicalDomains");gn=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=G.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();G.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}},Os=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()}},Fs=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};G.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return G.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 Ns,Li=w(()=>{"use strict";ae();zn();se();_s();Ns=class r extends gn{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=vr(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=vr(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:vr(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=G.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return G.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var su=w(()=>{"use strict"});import Ls from"node:fs/promises";import Qt from"node:path";import{z as ne}from"zod";async function lh(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=Qt.join(e,"package.json"),s=await Ls.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function uh(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 gh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=ch[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 dh(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=Qt.join(e,a);try{await Ls.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 ph(r,e){let t=Date.now();try{let n=await fh(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 mh(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=Qt.join(e,o.file);try{await Ls.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 ru(r,e){let t=Date.now(),n=await Promise.all([lh(r,e),uh(r,e),dh(r,e),ph(r,e),mh(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 gh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Qt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function fh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.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 oh,ih,ah,Ui,Hv,ch,Hi=w(()=>{"use strict";F();$s();oh=ne.enum(["draft","verified","sealed"]),ih=ne.object({name:ne.string(),description:ne.string(),location:ne.string().optional()}),ah=ne.object({issue:ne.string(),file:ne.string(),suggestion:ne.string()}),Ui=ne.object({projectId:ne.string(),languages:ne.array(ne.string()),frameworks:ne.array(ne.string()),packageManager:ne.string().optional(),sourceDir:ne.string().optional(),testDir:ne.string().optional(),configFiles:ne.array(ne.string()),fileCount:ne.number(),patterns:ne.array(ih),antiPatterns:ne.array(ah),analyzedAt:ne.string(),modelMetadata:js.optional(),status:oh.default("draft"),commitHash:ne.string().optional(),signature:ne.string().optional(),sealedAt:ne.string().optional(),verifiedAt:ne.string().optional()}),Hv={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},ch={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(lh,"verifyFrameworks");l(uh,"verifyLanguages");l(dh,"verifyPatternLocations");l(ph,"verifyFileCount");l(mh,"verifyAntiPatternFiles");l(ru,"semanticVerify");l(gh,"getProjectExtensions");l(fh,"countProjectFiles")});import{z as Ce}from"zod";var jr,Zt,hh,Bv,Gi,ou,Us=w(()=>{"use strict";jr=Ce.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Zt=Ce.object({primaryDomain:jr,secondaryDomains:Ce.array(jr),confidence:Ce.number().min(0).max(1),filePatterns:Ce.array(Ce.string()),relevantAgents:Ce.array(Ce.string())}),hh=Ce.object({classification:Zt,classifiedAt:Ce.string(),source:Ce.enum(["cache","history","llm","heuristic"]),descriptionHash:Ce.string(),projectId:Ce.string()}),Bv=Ce.object({entries:Ce.record(Ce.string(),hh),confirmedPatterns:Ce.array(Ce.object({descriptionHash:Ce.string(),classification:Zt,confirmedAt:Ce.string(),taskDescription:Ce.string()}))}),Gi={entries:{},confirmedPatterns:[]},ou={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as L}from"zod";var yh,wh,iu,kh,Sh,bh,Ch,Ph,au,qv,zi=w(()=>{"use strict";yh=L.enum(["low","medium","high"]),wh=L.enum(["pending","converted","completed","archived","dormant"]),iu=L.enum(["high","medium","low"]),kh=L.object({impact:iu,effort:iu}),Sh=L.object({frontend:L.string().optional(),backend:L.string().optional(),payments:L.string().optional(),ai:L.string().optional(),deploy:L.string().optional(),other:L.array(L.string()).optional()}),bh=L.object({name:L.string(),description:L.string()}),Ch=L.object({name:L.string(),description:L.string().optional()}),Ph=L.object({id:L.string(),text:L.string(),details:L.string().optional(),priority:yh,status:wh,tags:L.array(L.string()),addedAt:L.string(),completedAt:L.string().optional(),convertedTo:L.string().optional(),source:L.string().optional(),sourceFiles:L.array(L.string()).optional(),painPoints:L.array(L.string()).optional(),solutions:L.array(L.string()).optional(),filesAffected:L.array(L.string()).optional(),impactEffort:kh.optional(),implementationNotes:L.string().optional(),stack:Sh.optional(),modules:L.array(bh).optional(),roles:L.array(Ch).optional(),risks:L.array(L.string()).optional(),risksCount:L.number().optional()}),au=L.object({ideas:L.array(Ph),lastUpdated:L.string()}),qv={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function lu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var cu,xh,vh,Th,Eh,Qv,Zv,Wi=w(()=>{"use strict";cu=z.enum(["linear","jira","github","monday","asana","none"]),xh=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),vh=z.enum(["none","urgent","high","medium","low"]),Th=z.enum(["feature","bug","improvement","task","chore","epic"]),Eh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:xh,priority:vh,type:Th.optional(),assignee:z.object({id:z.string(),name:z.string(),email:z.string().optional()}).optional(),labels:z.array(z.string()).default([]),team:z.object({id:z.string(),name:z.string(),key:z.string().optional()}).optional(),project:z.object({id:z.string(),name:z.string()}).optional(),url:z.string(),createdAt:z.string(),updatedAt:z.string(),fetchedAt:z.string()}),Qv=z.object({provider:cu,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),Eh)}),Zv=z.object({provider:cu,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(lu,"createEmptyIssues")});var gu={};Gn(gu,{AgentAssignmentSchema:()=>uu,OUTPUT_SCHEMAS:()=>pu,SubtaskBreakdownSchema:()=>du,TaskClassificationSchema:()=>Zt,renderSchemaForPrompt:()=>Bi});import{z as Me}from"zod";function Bi(r){let e=pu[r];return e?`## OUTPUT FORMAT
|
|
267
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of lh)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}},D=new Rr,G=D});function Li(r){if(Fl.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(jr))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 Ni,jr,gn,Os,Fs,_s=w(()=>{"use strict";ae();zn();se();Ni={frontend:[j.CODE_STYLE,j.FILE_STRUCTURE,j.ARCHITECTURE,j.TECH_STACK],backend:[j.CODE_STYLE,j.ARCHITECTURE,j.DEPENDENCIES,j.TECH_STACK],devops:[j.SHIP_WORKFLOW,j.TEST_BEHAVIOR,j.DEPENDENCIES,j.ARCHITECTURE],docs:[j.CODE_STYLE,j.NAMING_CONVENTION,j.FILE_STRUCTURE],testing:[j.TEST_BEHAVIOR,j.CODE_STYLE,j.DEPENDENCIES],database:[j.ARCHITECTURE,j.NAMING_CONVENTION,j.TECH_STACK,j.DEPENDENCIES],general:Object.values(j)},jr={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(Li,"resolveCanonicalDomains");gn=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=G.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();G.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}},Os=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()}},Fs=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};G.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return G.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 Ns,Ui=w(()=>{"use strict";ae();zn();se();_s();Ns=class r extends gn{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=Tr(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=Tr(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:Tr(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=G.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return G.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var iu=w(()=>{"use strict"});import Ls from"node:fs/promises";import Qt from"node:path";import{z as ne}from"zod";async function gh(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=Qt.join(e,"package.json"),s=await Ls.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function fh(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 Sh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=mh[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 hh(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=Qt.join(e,a);try{await Ls.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 yh(r,e){let t=Date.now();try{let n=await kh(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 wh(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=Qt.join(e,o.file);try{await Ls.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 au(r,e){let t=Date.now(),n=await Promise.all([gh(r,e),fh(r,e),hh(r,e),yh(r,e),wh(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 Sh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Qt.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function kh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ls.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qt.join(s,i.name),c=Qt.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 uh,dh,ph,Hi,Vx,mh,Gi=w(()=>{"use strict";F();$s();uh=ne.enum(["draft","verified","sealed"]),dh=ne.object({name:ne.string(),description:ne.string(),location:ne.string().optional()}),ph=ne.object({issue:ne.string(),file:ne.string(),suggestion:ne.string()}),Hi=ne.object({projectId:ne.string(),languages:ne.array(ne.string()),frameworks:ne.array(ne.string()),packageManager:ne.string().optional(),sourceDir:ne.string().optional(),testDir:ne.string().optional(),configFiles:ne.array(ne.string()),fileCount:ne.number(),patterns:ne.array(dh),antiPatterns:ne.array(ph),analyzedAt:ne.string(),modelMetadata:js.optional(),status:uh.default("draft"),commitHash:ne.string().optional(),signature:ne.string().optional(),sealedAt:ne.string().optional(),verifiedAt:ne.string().optional()}),Vx={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},mh={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(gh,"verifyFrameworks");l(fh,"verifyLanguages");l(hh,"verifyPatternLocations");l(yh,"verifyFileCount");l(wh,"verifyAntiPatternFiles");l(au,"semanticVerify");l(Sh,"getProjectExtensions");l(kh,"countProjectFiles")});import{z as Ce}from"zod";var $r,Zt,bh,Yx,zi,cu,Us=w(()=>{"use strict";$r=Ce.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Zt=Ce.object({primaryDomain:$r,secondaryDomains:Ce.array($r),confidence:Ce.number().min(0).max(1),filePatterns:Ce.array(Ce.string()),relevantAgents:Ce.array(Ce.string())}),bh=Ce.object({classification:Zt,classifiedAt:Ce.string(),source:Ce.enum(["cache","history","llm","heuristic"]),descriptionHash:Ce.string(),projectId:Ce.string()}),Yx=Ce.object({entries:Ce.record(Ce.string(),bh),confirmedPatterns:Ce.array(Ce.object({descriptionHash:Ce.string(),classification:Zt,confirmedAt:Ce.string(),taskDescription:Ce.string()}))}),zi={entries:{},confirmedPatterns:[]},cu={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as L}from"zod";var Ch,Ph,lu,vh,xh,Th,Eh,Ah,uu,Zx,Wi=w(()=>{"use strict";Ch=L.enum(["low","medium","high"]),Ph=L.enum(["pending","converted","completed","archived","dormant"]),lu=L.enum(["high","medium","low"]),vh=L.object({impact:lu,effort:lu}),xh=L.object({frontend:L.string().optional(),backend:L.string().optional(),payments:L.string().optional(),ai:L.string().optional(),deploy:L.string().optional(),other:L.array(L.string()).optional()}),Th=L.object({name:L.string(),description:L.string()}),Eh=L.object({name:L.string(),description:L.string().optional()}),Ah=L.object({id:L.string(),text:L.string(),details:L.string().optional(),priority:Ch,status:Ph,tags:L.array(L.string()),addedAt:L.string(),completedAt:L.string().optional(),convertedTo:L.string().optional(),source:L.string().optional(),sourceFiles:L.array(L.string()).optional(),painPoints:L.array(L.string()).optional(),solutions:L.array(L.string()).optional(),filesAffected:L.array(L.string()).optional(),impactEffort:vh.optional(),implementationNotes:L.string().optional(),stack:xh.optional(),modules:L.array(Th).optional(),roles:L.array(Eh).optional(),risks:L.array(L.string()).optional(),risksCount:L.number().optional()}),uu=L.object({ideas:L.array(Ah),lastUpdated:L.string()}),Zx={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function pu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var du,Dh,Ih,Rh,jh,sT,rT,Bi=w(()=>{"use strict";du=z.enum(["linear","jira","github","monday","asana","none"]),Dh=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Ih=z.enum(["none","urgent","high","medium","low"]),Rh=z.enum(["feature","bug","improvement","task","chore","epic"]),jh=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:Dh,priority:Ih,type:Rh.optional(),assignee:z.object({id:z.string(),name:z.string(),email:z.string().optional()}).optional(),labels:z.array(z.string()).default([]),team:z.object({id:z.string(),name:z.string(),key:z.string().optional()}).optional(),project:z.object({id:z.string(),name:z.string()}).optional(),url:z.string(),createdAt:z.string(),updatedAt:z.string(),fetchedAt:z.string()}),sT=z.object({provider:du,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),jh)}),rT=z.object({provider:du,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(pu,"createEmptyIssues")});var yu={};Gn(yu,{AgentAssignmentSchema:()=>mu,OUTPUT_SCHEMAS:()=>fu,SubtaskBreakdownSchema:()=>gu,TaskClassificationSchema:()=>Zt,renderSchemaForPrompt:()=>Vi});import{z as Me}from"zod";function Vi(r){let e=fu[r];return e?`## OUTPUT FORMAT
|
|
268
268
|
|
|
269
269
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
270
270
|
|
|
@@ -273,15 +273,15 @@ ${e.example}
|
|
|
273
273
|
\`\`\`
|
|
274
274
|
|
|
275
275
|
Fields:
|
|
276
|
-
${
|
|
277
|
-
`)}return"(see example above)"}function mu(r){return r instanceof Me.ZodString?"string":r instanceof Me.ZodNumber?"number":r instanceof Me.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Me.ZodArray?`array of ${mu(r.element)}`:r instanceof Me.ZodObject?"object":"any"}var uu,du,pu,$r=w(()=>{"use strict";Us();Us();uu=Me.object({agentName:Me.string(),reasoning:Me.string(),confidence:Me.number().min(0).max(1)}),du=Me.object({subtasks:Me.array(Me.object({description:Me.string(),domain:jr,agent:Me.string(),dependsOn:Me.array(Me.number())})),effort:Me.enum(["low","medium","high"])}),pu={classification:{schema:Zt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:uu,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:du,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(Bi,"renderSchemaForPrompt");l(Ah,"describeSchema");l(mu,"describeField")});import{z as T}from"zod";var fu,Ih,Dh,hu,Rh,jh,$h,Mh,Oh,Fh,_h,yu,Nh,Lh,aT,wu,ku,Su,bu,Uh,Mr,Vi=w(()=>{"use strict";fu=T.number().min(1).max(5),Ih=T.enum(["exceeded","met","partial","failed"]),Dh=T.enum(["definitely","probably","maybe","no"]),hu=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Rh=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:hu.optional(),explanation:T.string().optional()})}),jh=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),$h=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Mh=T.object({metrics:T.array(jh),acceptanceCriteria:T.array($h),overallSuccess:Ih,successScore:T.number().min(0).max(100)}),Oh=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Fh=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Oh)}),_h=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:Dh,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),yu=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:fu,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),Nh=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:Rh,success:Mh.optional(),learnings:Fh,roi:_h,rating:fu,taskOutcomes:T.array(yu).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Lh=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:hu,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),aT=T.object({outcomes:T.array(Nh),taskOutcomes:T.array(yu).optional(),aggregates:Lh.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),wu={outcomes:[],taskOutcomes:[],lastUpdated:""},ku=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"),Su=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),bu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Uh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Mr=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=>Uh(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 Ie}from"zod";function Vh(){let r={};for(let e of zh)r[e]="allow";for(let e of Wh)r[e]="ask";for(let e of Bh)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Or,dT,Hh,Ji,Gh,pT,zh,Wh,Bh,mT,Cu=w(()=>{"use strict";Or=Ie.enum(["allow","deny","ask"]),dT=Ie.enum(["read","write","delete","create"]),Hh=Ie.record(Ie.string(),Or),Ji=Ie.record(Ie.string(),Or),Gh=Ie.object({enabled:Ie.boolean().default(!0),allowedDomains:Ie.array(Ie.string()).optional(),blockedDomains:Ie.array(Ie.string()).optional()}),pT=Ie.object({bash:Hh.optional(),files:Ie.object({read:Ji.optional(),write:Ji.optional(),delete:Ji.optional()}).optional(),web:Gh.optional(),skills:Ie.record(Ie.string(),Or).optional(),doomLoop:Ie.object({enabled:Ie.boolean().default(!0),maxRetries:Ie.number().default(3)}).optional(),externalDirectories:Or.default("ask")}),zh=["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*"],Wh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Bh=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Vh,"buildDefaultPermissions");mT=Vh()});import{z as qe}from"zod";var yT,wT,Pu=w(()=>{"use strict";yT=qe.object({projectId:qe.string(),name:qe.string(),repoPath:qe.string(),description:qe.string().optional(),version:qe.string().optional(),cliVersion:qe.string().optional(),techStack:qe.array(qe.string()),fileCount:qe.number(),commitCount:qe.number(),createdAt:qe.string(),lastSync:qe.string(),lastSyncCommit:qe.string().optional(),lastSyncBranch:qe.string().optional()}),wT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Jh,qh,Kh,Yh,Xh,Qh,Zh,ey,ty,ny,sy,ry,oy,iy,ay,cy,ly,uy,CT,PT,xu=w(()=>{"use strict";Jh=E.enum(["planned","active","completed","shipped"]),qh=E.enum(["low","medium","high"]),Kh=E.enum(["feature","breaking_change","refactor","infrastructure"]),Yh=E.enum(["completed","active","planned"]),Xh=E.enum(["planned","active","completed"]),Qh=E.enum(["git","git-branch","manual","prd"]),Zh=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),ey=E.object({id:E.string(),name:E.string(),status:Yh,completedAt:E.string().optional()}),ty=E.object({goal:E.string(),phases:E.array(ey),successMetrics:E.array(E.string()).optional()}),ny=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),sy=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),ry=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),oy=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),iy=E.object({estimated:ry.nullable(),actual:oy.nullable()}),ay=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),cy=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:ay.optional(),status:Xh,startDate:E.string().optional(),endDate:E.string().optional()}),ly=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Jh,impact:qh,effort:E.string().optional(),progress:E.number(),type:Kh.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(Zh),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:ny.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:Qh.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:iy.optional(),valueScore:E.number().optional(),commits:E.array(sy).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),uy=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),CT=E.object({strategy:ty.nullable().optional(),features:E.array(ly),backlog:E.array(E.union([E.string(),uy])),lastUpdated:E.string(),quarters:E.array(cy).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),PT={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 dy from"node:crypto";import{homedir as py}from"node:os";import{join as my}from"node:path";function ie(){return dy.randomUUID()}var gy,vu=w(()=>{"use strict";l(ie,"generateUUID");gy=my(py(),".prjct-cli","projects")});import{z as ze}from"zod";var jT,Tu=w(()=>{"use strict";jT=ze.object({sessionId:ze.string(),projectId:ze.string(),projectPath:ze.string(),projectName:ze.string().optional(),taskDescription:ze.string(),taskStatus:ze.enum(["active","paused"]),activeSubtaskIndex:ze.number().optional(),subtaskCount:ze.number().optional(),branch:ze.string().optional(),linearId:ze.string().optional(),filesModified:ze.array(ze.string()).optional(),durationWorkedSec:ze.number().optional(),timestamp:ze.string(),resumeHint:ze.string()})});import{z as J}from"zod";var fy,Eu,hy,yy,wy,ky,Sy,by,Cy,Au,qi=w(()=>{"use strict";fy=J.enum(["feature","fix","improvement","refactor"]),Eu=J.enum(["pass","warning","fail","skipped"]),hy=J.enum(["added","changed","fixed","removed"]),yy=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),wy=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),ky=J.object({description:J.string(),type:hy.optional()}),Sy=J.object({lintStatus:Eu.nullable().optional(),lintDetails:J.string().optional(),testStatus:Eu.nullable().optional(),testDetails:J.string().optional()}),by=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),Cy=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:fy,agent:J.string().optional(),description:J.string().optional(),changes:J.array(ky).optional(),codeSnippets:J.array(J.string()).optional(),commit:by.optional(),codeMetrics:wy.optional(),qualityMetrics:Sy.optional(),quantitativeImpact:J.string().optional(),duration:yy.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),Au=J.object({shipped:J.array(Cy),lastUpdated:J.string()})});import{z as x}from"zod";var Py,Du,xy,vy,Ty,Ki,Ru,Ey,Ay,ju,Iu,Iy,Dy,$u,Mu,Ou,Ry,jy,LT,Fr=w(()=>{"use strict";$s();Py=x.enum(["low","medium","high","critical"]),Du=x.enum(["feature","bug","improvement","chore"]),xy=x.enum(["active","backlog","previously_active"]),vy=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ty=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ki=x.object({title:x.string(),description:x.string(),filesChanged:x.array(x.object({path:x.string(),action:x.enum(["created","modified","deleted"])})),whatWasDone:x.array(x.string()).min(1),outputForNextAgent:x.string().min(1),notes:x.string().optional()}),Ru=x.object({output:x.string().min(1,"Subtask output is required"),summary:Ki}),Ey=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:vy,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Ki.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),Ay=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),ju=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(Ey).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:Ay.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:js.optional()}),Iu=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),Iy=x.object({stackConfirmed:x.array(x.string()).optional(),patternsDiscovered:x.array(x.string()).optional(),agentAccuracy:x.array(x.object({agent:x.string(),rating:x.enum(["helpful","neutral","inaccurate"]),note:x.string().optional()})).optional(),issuesEncountered:x.array(x.string()).optional()}),Dy=x.object({taskId:x.string(),title:x.string(),classification:Du,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Ki),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:Iy.optional()}),$u=x.object({currentTask:ju.nullable(),previousTask:Iu.nullable().optional(),pausedTasks:x.array(Iu).optional(),taskHistory:x.array(Dy).optional(),lastUpdated:x.string()}),Mu=x.object({id:x.string(),description:x.string(),priority:Py,type:Du,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:xy,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Ou=x.object({tasks:x.array(Mu),lastUpdated:x.string()}),Ry=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),jy=x.object({type:Ty,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),LT=x.object({projectId:x.string(),currentTask:ju.nullable(),queue:x.array(Mu),stats:Ry,recentActivity:x.array(jy),lastSync:x.string()})});import{z as ee}from"zod";var $y,My,Fu,zT,WT,BT,en,_u,Jn=w(()=>{"use strict";$y=ee.enum(["improving","stable","declining"]),My=ee.object({sprintNumber:ee.number(),startDate:ee.string(),endDate:ee.string(),pointsCompleted:ee.number(),tasksCompleted:ee.number(),avgVariance:ee.number(),estimationAccuracy:ee.number()}),Fu=ee.object({category:ee.string(),avgVariance:ee.number(),taskCount:ee.number()}),zT=ee.object({totalPoints:ee.number(),sprints:ee.number(),estimatedDate:ee.string()}),WT=ee.object({sprints:ee.array(My),averageVelocity:ee.number(),velocityTrend:$y,estimationAccuracy:ee.number(),overEstimated:ee.array(Fu),underEstimated:ee.array(Fu),lastUpdated:ee.string()}),BT=ee.object({sprintLengthDays:ee.number().min(1).max(90).default(7),startDay:ee.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ee.number().min(1).max(52).default(6),accuracyTolerance:ee.number().min(0).max(100).default(20)}),en={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},_u={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var xt=w(()=>{"use strict";su();Hi();Us();zi();Wi();$r();$s();Vi();Cu();Pu();xu();vu();Tu();qi();Fr();Jn()});var fn,Yi=w(()=>{"use strict";xt();zn();se();_s();fn=class extends gn{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(j),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(j);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(j));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:ie(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let I=this._getCommandTags(t.commandName),D=(p.tags||[]).filter(V=>I.includes(V));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let I=this._extractKeywordsFromText(t.taskDescription),D=0;for(let V of I)p.content.toLowerCase().includes(V)&&(D+=2),p.title.toLowerCase().includes(V)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=_i[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Rr[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 Ni(e)}_getCommandTags(e){return{ship:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.CODE_STYLE],task:[j.BRANCH_NAMING,j.CODE_STYLE],sync:[j.TECH_STACK,j.ARCHITECTURE,j.DEPENDENCIES],test:[j.TEST_BEHAVIOR],bug:[j.CODE_STYLE,j.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:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.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:[j.COMMIT_STYLE],branch_naming:[j.BRANCH_NAMING],test_before_ship:[j.TEST_BEHAVIOR,j.SHIP_WORKFLOW],preferred_agent:[j.AGENT_PREFERENCE],code_style:[j.CODE_STYLE],verbosity:[j.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?`
|
|
278
|
-
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
|
|
279
|
-
`).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
|
|
280
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
281
|
-
`).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
|
|
282
|
-
`)}async function
|
|
276
|
+
${$h(e.schema)}`:null}function $h(r){if(r instanceof Me.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${hu(n)}`).join(`
|
|
277
|
+
`)}return"(see example above)"}function hu(r){return r instanceof Me.ZodString?"string":r instanceof Me.ZodNumber?"number":r instanceof Me.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Me.ZodArray?`array of ${hu(r.element)}`:r instanceof Me.ZodObject?"object":"any"}var mu,gu,fu,Mr=w(()=>{"use strict";Us();Us();mu=Me.object({agentName:Me.string(),reasoning:Me.string(),confidence:Me.number().min(0).max(1)}),gu=Me.object({subtasks:Me.array(Me.object({description:Me.string(),domain:$r,agent:Me.string(),dependsOn:Me.array(Me.number())})),effort:Me.enum(["low","medium","high"])}),fu={classification:{schema:Zt,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:mu,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:gu,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(Vi,"renderSchemaForPrompt");l($h,"describeSchema");l(hu,"describeField")});import{z as T}from"zod";var wu,Mh,Oh,Su,Fh,_h,Nh,Lh,Uh,Hh,Gh,ku,zh,Wh,pT,bu,Cu,Pu,vu,Bh,Or,Ji=w(()=>{"use strict";wu=T.number().min(1).max(5),Mh=T.enum(["exceeded","met","partial","failed"]),Oh=T.enum(["definitely","probably","maybe","no"]),Su=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Fh=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Su.optional(),explanation:T.string().optional()})}),_h=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),Nh=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),Lh=T.object({metrics:T.array(_h),acceptanceCriteria:T.array(Nh),overallSuccess:Mh,successScore:T.number().min(0).max(100)}),Uh=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),Hh=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(Uh)}),Gh=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:Oh,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),ku=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:wu,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),zh=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:Fh,success:Lh.optional(),learnings:Hh,roi:Gh,rating:wu,taskOutcomes:T.array(ku).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),Wh=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Su,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),pT=T.object({outcomes:T.array(zh),taskOutcomes:T.array(ku).optional(),aggregates:Wh.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),bu={outcomes:[],taskOutcomes:[],lastUpdated:""},Cu=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"),Pu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),vu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Bh=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Or=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=>Bh(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 De}from"zod";function Xh(){let r={};for(let e of qh)r[e]="allow";for(let e of Kh)r[e]="ask";for(let e of Yh)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Fr,hT,Vh,qi,Jh,yT,qh,Kh,Yh,wT,xu=w(()=>{"use strict";Fr=De.enum(["allow","deny","ask"]),hT=De.enum(["read","write","delete","create"]),Vh=De.record(De.string(),Fr),qi=De.record(De.string(),Fr),Jh=De.object({enabled:De.boolean().default(!0),allowedDomains:De.array(De.string()).optional(),blockedDomains:De.array(De.string()).optional()}),yT=De.object({bash:Vh.optional(),files:De.object({read:qi.optional(),write:qi.optional(),delete:qi.optional()}).optional(),web:Jh.optional(),skills:De.record(De.string(),Fr).optional(),doomLoop:De.object({enabled:De.boolean().default(!0),maxRetries:De.number().default(3)}).optional(),externalDirectories:Fr.default("ask")}),qh=["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*"],Kh=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Yh=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Xh,"buildDefaultPermissions");wT=Xh()});import{z as Ye}from"zod";var CT,PT,Tu=w(()=>{"use strict";CT=Ye.object({projectId:Ye.string(),name:Ye.string(),repoPath:Ye.string(),description:Ye.string().optional(),version:Ye.string().optional(),cliVersion:Ye.string().optional(),techStack:Ye.array(Ye.string()),fileCount:Ye.number(),commitCount:Ye.number(),createdAt:Ye.string(),lastSync:Ye.string(),lastSyncCommit:Ye.string().optional(),lastSyncBranch:Ye.string().optional()}),PT={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Qh,Zh,ey,ty,ny,sy,ry,oy,iy,ay,cy,ly,uy,dy,py,my,gy,fy,ET,AT,Eu=w(()=>{"use strict";Qh=E.enum(["planned","active","completed","shipped"]),Zh=E.enum(["low","medium","high"]),ey=E.enum(["feature","breaking_change","refactor","infrastructure"]),ty=E.enum(["completed","active","planned"]),ny=E.enum(["planned","active","completed"]),sy=E.enum(["git","git-branch","manual","prd"]),ry=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),oy=E.object({id:E.string(),name:E.string(),status:ty,completedAt:E.string().optional()}),iy=E.object({goal:E.string(),phases:E.array(oy),successMetrics:E.array(E.string()).optional()}),ay=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),cy=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),ly=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),uy=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),dy=E.object({estimated:ly.nullable(),actual:uy.nullable()}),py=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),my=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:py.optional(),status:ny,startDate:E.string().optional(),endDate:E.string().optional()}),gy=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Qh,impact:Zh,effort:E.string().optional(),progress:E.number(),type:ey.optional(),roi:E.number().optional(),why:E.array(E.string()).optional(),technicalNotes:E.array(E.string()).optional(),compatibility:E.string().optional(),phase:E.string().optional(),tasks:E.array(ry),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:ay.optional(),taskCount:E.number().optional(),agent:E.string().optional(),sprintName:E.string().optional(),completedDate:E.string().optional(),prdId:E.string().nullable().optional(),legacy:E.boolean().optional(),inferredFrom:sy.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:dy.optional(),valueScore:E.number().optional(),commits:E.array(cy).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),fy=E.object({id:E.string(),title:E.string(),prdId:E.string().nullable().optional(),valueScore:E.number().optional(),effortEstimate:E.number().optional(),reason:E.string().optional()}),ET=E.object({strategy:iy.nullable().optional(),features:E.array(gy),backlog:E.array(E.union([E.string(),fy])),lastUpdated:E.string(),quarters:E.array(my).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),AT={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 hy from"node:crypto";import{homedir as yy}from"node:os";import{join as wy}from"node:path";function ie(){return hy.randomUUID()}var Sy,Au=w(()=>{"use strict";l(ie,"generateUUID");Sy=wy(yy(),".prjct-cli","projects")});import{z as ze}from"zod";var _T,Du=w(()=>{"use strict";_T=ze.object({sessionId:ze.string(),projectId:ze.string(),projectPath:ze.string(),projectName:ze.string().optional(),taskDescription:ze.string(),taskStatus:ze.enum(["active","paused"]),activeSubtaskIndex:ze.number().optional(),subtaskCount:ze.number().optional(),branch:ze.string().optional(),linearId:ze.string().optional(),filesModified:ze.array(ze.string()).optional(),durationWorkedSec:ze.number().optional(),timestamp:ze.string(),resumeHint:ze.string()})});import{z as J}from"zod";var ky,Iu,by,Cy,Py,vy,xy,Ty,Ey,Ru,Ki=w(()=>{"use strict";ky=J.enum(["feature","fix","improvement","refactor"]),Iu=J.enum(["pass","warning","fail","skipped"]),by=J.enum(["added","changed","fixed","removed"]),Cy=J.object({hours:J.number(),minutes:J.number(),totalMinutes:J.number()}),Py=J.object({filesChanged:J.number().nullable().optional(),linesAdded:J.number().nullable().optional(),linesRemoved:J.number().nullable().optional(),commits:J.number().nullable().optional()}),vy=J.object({description:J.string(),type:by.optional()}),xy=J.object({lintStatus:Iu.nullable().optional(),lintDetails:J.string().optional(),testStatus:Iu.nullable().optional(),testDetails:J.string().optional()}),Ty=J.object({hash:J.string().optional(),message:J.string().optional(),branch:J.string().optional()}),Ey=J.object({id:J.string(),name:J.string(),version:J.string().nullable().optional(),type:ky,agent:J.string().optional(),description:J.string().optional(),changes:J.array(vy).optional(),codeSnippets:J.array(J.string()).optional(),commit:Ty.optional(),codeMetrics:Py.optional(),qualityMetrics:xy.optional(),quantitativeImpact:J.string().optional(),duration:Cy.optional(),tasksCompleted:J.number().nullable().optional(),shippedAt:J.string(),featureId:J.string().optional()}),Ru=J.object({shipped:J.array(Ey),lastUpdated:J.string()})});import{z as v}from"zod";var Ay,$u,Dy,Iy,Ry,Yi,Mu,jy,$y,Ou,ju,My,Oy,Fu,_u,Nu,Fy,_y,WT,_r=w(()=>{"use strict";$s();Ay=v.enum(["low","medium","high","critical"]),$u=v.enum(["feature","bug","improvement","chore"]),Dy=v.enum(["active","backlog","previously_active"]),Iy=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ry=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Yi=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Mu=v.object({output:v.string().min(1,"Subtask output is required"),summary:Yi}),jy=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:Iy,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Yi.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),$y=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Ou=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(jy).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:$y.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:js.optional()}),ju=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),My=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),Oy=v.object({taskId:v.string(),title:v.string(),classification:$u,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Yi),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:My.optional()}),Fu=v.object({currentTask:Ou.nullable(),previousTask:ju.nullable().optional(),pausedTasks:v.array(ju).optional(),taskHistory:v.array(Oy).optional(),lastUpdated:v.string()}),_u=v.object({id:v.string(),description:v.string(),priority:Ay,type:$u,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:Dy,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Nu=v.object({tasks:v.array(_u),lastUpdated:v.string()}),Fy=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),_y=v.object({type:Ry,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),WT=v.object({projectId:v.string(),currentTask:Ou.nullable(),queue:v.array(_u),stats:Fy,recentActivity:v.array(_y),lastSync:v.string()})});import{z as ee}from"zod";var Ny,Ly,Lu,qT,KT,YT,en,Uu,Jn=w(()=>{"use strict";Ny=ee.enum(["improving","stable","declining"]),Ly=ee.object({sprintNumber:ee.number(),startDate:ee.string(),endDate:ee.string(),pointsCompleted:ee.number(),tasksCompleted:ee.number(),avgVariance:ee.number(),estimationAccuracy:ee.number()}),Lu=ee.object({category:ee.string(),avgVariance:ee.number(),taskCount:ee.number()}),qT=ee.object({totalPoints:ee.number(),sprints:ee.number(),estimatedDate:ee.string()}),KT=ee.object({sprints:ee.array(Ly),averageVelocity:ee.number(),velocityTrend:Ny,estimationAccuracy:ee.number(),overEstimated:ee.array(Lu),underEstimated:ee.array(Lu),lastUpdated:ee.string()}),YT=ee.object({sprintLengthDays:ee.number().min(1).max(90).default(7),startDay:ee.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ee.number().min(1).max(52).default(6),accuracyTolerance:ee.number().min(0).max(100).default(20)}),en={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Uu={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var vt=w(()=>{"use strict";iu();Gi();Us();Wi();Bi();Mr();$s();Ji();xu();Tu();Eu();Au();Du();Ki();_r();Jn()});var fn,Xi=w(()=>{"use strict";vt();zn();se();_s();fn=class extends gn{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(j),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(j);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(j));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:ie(),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 A=this._getCommandTags(t.commandName),I=(p.tags||[]).filter(V=>A.includes(V));g.tagMatch=Math.min(20,I.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 A=this._extractKeywordsFromText(t.taskDescription),I=0;for(let V of A)p.content.toLowerCase().includes(V)&&(I+=2),p.title.toLowerCase().includes(V)&&(I+=3);g.keywords=Math.min(15,I)}p.userTriggered&&(g.userTriggered=5);let k=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:k,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=Ni[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=jr[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 Li(e)}_getCommandTags(e){return{ship:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.CODE_STYLE],task:[j.BRANCH_NAMING,j.CODE_STYLE],sync:[j.TECH_STACK,j.ARCHITECTURE,j.DEPENDENCIES],test:[j.TEST_BEHAVIOR],bug:[j.CODE_STYLE,j.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:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.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:[j.COMMIT_STYLE],branch_naming:[j.BRANCH_NAMING],test_before_ship:[j.TEST_BEHAVIOR,j.SHIP_WORKFLOW],preferred_agent:[j.AGENT_PREFERENCE],code_style:[j.CODE_STYLE],verbosity:[j.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?`
|
|
278
|
+
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 Qi,Uy,ve,qn=w(()=>{"use strict";_s();Ui();Xi();_s();Ui();Xi();Qi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new fn,this._patternStore=new Ns,this._historyStore=new Fs,this._sessionStore=new Os}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()}},Uy=new Qi,ve=Uy});import{exec as Hy}from"node:child_process";import ct from"node:fs/promises";import xt from"node:path";import{promisify as Gy}from"node:util";var hn,Zi,zy,Oe,Hu=w(()=>{"use strict";F();hn=Gy(Hy),Zi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=xt.join(this.projectPath,"package.json"),t=await ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=xt.join(this.projectPath,"Cargo.toml");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=xt.join(this.projectPath,"requirements.txt");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=xt.join(this.projectPath,"go.mod");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=xt.join(this.projectPath,"Gemfile");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=xt.join(this.projectPath,"mix.exs");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=xt.join(this.projectPath,"pom.xml");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=xt.join(this.projectPath,"composer.json"),t=await ct.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=xt.join(this.projectPath,"pyproject.toml");return await ct.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await hn('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(`
|
|
279
|
+
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await ct.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await ct.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await hn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await hn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await hn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await hn('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 hn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await ct.access(xt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=xt.join(this.projectPath,e);return await ct.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await hn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
280
|
+
`).filter(Boolean)}catch{return[]}}},zy=new Zi,Oe=zy});import{z as ue}from"zod";function Wy(r){return r instanceof Kn}function Y(r){return Wy(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Yn,WE,BE,VE,JE,qE,KE,Kn,Nr,Lr,Hs,Wt=w(()=>{"use strict";Yn={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}},WE=Yn.create("FileError",ue.object({path:ue.string(),operation:ue.enum(["read","write","delete","create","copy"]),reason:ue.string().optional()})),BE=Yn.create("ValidationError",ue.object({field:ue.string(),expected:ue.string(),received:ue.string().optional(),message:ue.string().optional()})),VE=Yn.create("PermissionError",ue.object({action:ue.string(),resource:ue.string(),reason:ue.string().optional()})),JE=Yn.create("TaskError",ue.object({taskId:ue.string().optional(),operation:ue.enum(["create","update","complete","pause","resume","delete"]),reason:ue.string()})),qE=Yn.create("SessionError",ue.object({sessionId:ue.string().optional(),reason:ue.string()})),KE=Yn.create("SyncError",ue.object({projectId:ue.string().optional(),operation:ue.enum(["push","pull","auth","connect"]),reason:ue.string()})),Kn=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)}},Nr=class r extends Kn{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")}},Lr=class r extends Kn{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")}},Hs=class r extends Kn{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(Wy,"isPrjctError");l(Y,"getErrorMessage")});import ea from"node:fs";import Hr from"node:path";function Gu(){if(Gs)return Gs;let r=__dirname;for(let e=0;e<5;e++){let t=Hr.join(r,"package.json");if(ea.existsSync(t))try{if(JSON.parse(ea.readFileSync(t,"utf-8")).name==="prjct-cli")return Gs=r,r}catch{}r=Hr.dirname(r)}return Gs=Hr.join(__dirname,"..","..",".."),Gs}function ta(){if(Ur)return Ur;try{let r=Hr.join(Gu(),"package.json"),e=JSON.parse(ea.readFileSync(r,"utf-8"));return Ur=e.version,By=e,Ur}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var Ur,By,Gs,Xn,xe,tn=w(()=>{"use strict";F();Ur=null,By=null,Gs=null;l(Gu,"getPackageRoot");l(ta,"getVersion");Xn=ta(),xe=Gu()});import sa from"node:fs";import Vy from"node:fs/promises";import Gr from"node:path";function ra(){if(zu)return na;zu=!0;let r=Gr.join(xe,"dist","templates.json");try{let e=sa.readFileSync(r,"utf-8");return na=JSON.parse(e),na}catch{return null}}function qy(r){let e=yn.indexOf(r);e>-1&&yn.splice(e,1),yn.push(r)}function Ky(){for(;Qn.size>=Jy&&yn.length>0;){let r=yn.shift();r&&Qn.delete(r)}}function zr(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(`
|
|
281
|
+
`).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 Wu(r){if(Qn.has(r))return qy(r),Qn.get(r);let e,t=ra();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Gr.join(xe,"templates","commands",`${r}.md`);try{e=await Vy.readFile(s,"utf-8")}catch{throw Lr.notFound(r)}}let n=zr(e);return Ky(),Qn.set(r,n),yn.push(r),n}async function Yy(r){return(await Wu(r)).frontmatter["allowed-tools"]||[]}function Xy(){Qn.clear(),yn.length=0}function Ie(r){let e=ra();if(e?.[r])return e[r];let t=Gr.join(xe,"templates",r);try{return sa.readFileSync(t,"utf-8")}catch{return null}}function Zn(r){let e=ra();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Gr.join(xe,"templates",r);try{return sa.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Jy,Qn,yn,na,zu,Qy,oa,es=w(()=>{"use strict";Wt();tn();Jy=50,Qn=new Map,yn=[],na=null,zu=!1;l(ra,"loadBundle");l(qy,"updateLruOrder");l(Ky,"evictLru");l(zr,"parseFrontmatter");l(Wu,"load");l(Yy,"getAllowedTools");l(Xy,"clearCache");l(Ie,"getTemplateContent");l(Zn,"listTemplates");Qy={load:Wu,parseFrontmatter:zr,getAllowedTools:Yy,clearCache:Xy,getTemplateContent:Ie,listTemplates:Zn},oa=Qy});import W from"node:fs/promises";import aa from"node:os";import K from"node:path";async function Zy(){try{let r=Ie("global/modules/module-config.json");if(r)return JSON.parse(r);let e=K.join(xe,"templates/global/modules/module-config.json"),t=await W.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function ew(r){let e=await Zy();if(!e){let i=Ie("global/CLAUDE.md");if(i)return i;let a=K.join(xe,"templates/global/CLAUDE.md");return W.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Ie("global/CLAUDE.md");if(a)return a;let c=K.join(xe,"templates/global/CLAUDE.md");return W.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=Ie(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=K.join(xe,"templates/global/modules",i),u=await W.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(`
|
|
282
|
+
`)}async function tw(){try{let r=K.join(aa.homedir(),".prjct-cli","docs");await W.mkdir(r,{recursive:!0});let e=Zn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Ie(s);if(o){let i=K.basename(s);await W.writeFile(K.join(r,i),o,"utf-8")}}return{success:!0}}let t=K.join(xe,"templates/global/docs"),n=await W.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=K.join(t,s),i=K.join(r,s),a=await W.readFile(o,"utf-8");await W.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function nw(){let r=(Qe(),ft(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 W.mkdir(e.configDir,{recursive:!0});let s=K.join(e.configDir,e.contextFile),o=K.join(xe,"templates","global",e.contextFile),i="";try{let u=Ie(`global/${e.contextFile}`);u?i=u:i=await W.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await ew()}catch{let d=Ie("global/CLAUDE.md");if(d)i=d;else{let m=K.join(xe,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}}else{let d=Ie("global/CLAUDE.md");if(d)i=d;else{let m=K.join(xe,"templates/global/CLAUDE.md");i=await W.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await W.readFile(s,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),S=p+f+g;return await W.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
283
283
|
|
|
284
|
-
${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await W.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function
|
|
284
|
+
${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await W.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Bu(){let r=aa.homedir();return{claude:{commands:K.join(r,".claude","commands","p"),config:K.join(r,".claude"),router:K.join(r,".claude","commands","p.md")},gemini:{commands:K.join(r,".gemini","commands"),config:K.join(r,".gemini"),router:K.join(r,".gemini","commands","p.toml")}}}var ia,sw,We,wn=w(()=>{"use strict";es();F();tn();l(Zy,"loadModuleConfig");l(ew,"composeGlobalTemplate");l(tw,"installDocs");l(nw,"installGlobalConfig");ia=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=aa.homedir(),this.templatesDir=K.join(xe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Qe(),ft(at)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=K.join(t.configDir,"commands"):this.claudeCommandsPath=K.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await W.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Zn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await W.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Qe(),ft(at)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await W.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=K.join(this.claudeCommandsPath,a),u=Ie(`commands/${a}`);if(u)await W.writeFile(c,u,"utf-8");else{let d=K.join(this.templatesDir,a),m=await W.readFile(d,"utf-8");await W.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=K.join(this.claudeCommandsPath,s);await W.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await W.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await W.access(this.claudeCommandsPath);let n=(await W.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(Ie(`commands/${e}.md`))return!0;try{let n=K.join(this.templatesDir,`${e}.md`);return await W.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Qe(),ft(at)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=K.join(t.configDir,"commands",n);await W.mkdir(K.dirname(s),{recursive:!0});let o=Ie(`commands/${n}`);if(o)return await W.writeFile(s,o,"utf-8"),!0;let i=K.join(this.templatesDir,n),a=await W.readFile(i,"utf-8");return await W.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Qe(),ft(at)).getActiveProvider(),n=K.join(t.configDir,"commands"),s=0;try{let i=(await W.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await W.unlink(K.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 W.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await W.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=K.join(this.claudeCommandsPath,o),a=n.includes(o),c=Ie(`commands/${o}`);if(c)await W.writeFile(i,c,"utf-8");else{let u=K.join(this.templatesDir,o),d=await W.readFile(u,"utf-8");await W.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return nw()}async installDocs(){return tw()}};l(Bu,"getProviderPaths");sw=new ia,We=sw});import{z as Pe}from"zod";function Ku(r,e="default"){let t=Vu[e]||Vu.default;return r/1e3*t}function Wr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var rw,ow,Ju,qu,Vu,Br=w(()=>{"use strict";rw=Pe.object({date:Pe.string(),tokensSaved:Pe.number(),syncs:Pe.number(),avgCompressionRate:Pe.number(),totalDuration:Pe.number()}),ow=Pe.object({agentName:Pe.string(),usageCount:Pe.number(),tokensSaved:Pe.number()}),Ju=Pe.object({totalTokensSaved:Pe.number(),avgCompressionRate:Pe.number(),syncCount:Pe.number(),watchTriggers:Pe.number(),avgSyncDuration:Pe.number(),totalSyncDuration:Pe.number(),agentUsage:Pe.array(ow),dailyStats:Pe.array(rw),firstSync:Pe.string(),lastUpdated:Pe.string()}),qu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Vu={"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(Ku,"estimateCostSaved");l(Wr,"formatCost")});function iw(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function aw(r){let e=[],t=iw(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(ca,o+i.length);if(c===-1)continue;let u=c+ca.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function la(r,e){let t=aw(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
285
285
|
|
|
286
286
|
---
|
|
287
287
|
|
|
@@ -292,11 +292,11 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
|
|
|
292
292
|
`;for(let s of t)n+=s.content,n+=`
|
|
293
293
|
|
|
294
294
|
`;return`${n.trimEnd()}
|
|
295
|
-
`}function
|
|
296
|
-
`);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(
|
|
297
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=
|
|
298
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Xn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=
|
|
299
|
-
`;await
|
|
295
|
+
`}function ua(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(`
|
|
296
|
+
`);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(ca)&&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 ca,da=w(()=>{"use strict";ca="<!-- /prjct:preserve -->";l(iw,"createPreserveStartRegex");l(aw,"extractPreservedSections");l(la,"mergePreservedSections");l(ua,"validatePreserveBlocks")});function zs(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&cw.has(e.code))return!0;if(e.code&&Xu.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 Jr(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Xu.has(e.code))}function Yu(r,e,t){let n=nn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(nn.delete(r),!1):!0:!1}function pa(r,e){let t=nn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),nn.set(r,t)}function lw(r){nn.delete(r)}var cw,Xu,nn,Vr,Qu,Ws,qr=w(()=>{"use strict";cw=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Xu=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(zs,"isTransientError");l(Jr,"isPermanentError");nn=new Map;l(Yu,"isCircuitOpen");l(pa,"recordFailure");l(lw,"recordSuccess");Vr=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(Yu(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 lw(t),o}catch(o){if(n=o,s++,Jr(o))throw pa(t,this.options.circuitBreakerThreshold),o;if(!(zs(o)&&s<this.options.maxAttempts))throw pa(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 pa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return zs(e)}isCircuitOpen(e){return Yu(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return nn.get(e)}resetCircuit(e){nn.delete(e)}resetAllCircuits(){nn.clear()}},Qu=new Vr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ws=new Vr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Zu=w(()=>{"use strict";da();qr()});import{exec as uw}from"node:child_process";import{promisify as dw}from"node:util";async function Kr(r){try{let{stdout:e}=await pw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mw(){let r=await Kr("gh api user --jq .login");return r.success&&r.output||(r=await Kr("git config --global github.user"),r.success&&r.output)?r.output:null}async function gw(){let r=await Kr("git config user.name");return r.success&&r.output?r.output:null}async function fw(){let r=await Kr("git config user.email");return r.success&&r.output?r.output:null}async function ts(){let[r,e,t]=await Promise.all([mw(),gw(),fw()]);return{github:r,email:t,name:e||r||"Unknown"}}var pw,Yr=w(()=>{"use strict";pw=dw(uw);l(Kr,"execCommand");l(mw,"detectGitHubUsername");l(gw,"detectGitName");l(fw,"detectGitEmail");l(ts,"detect")});import Sn from"node:fs/promises";import hw from"node:path";import*as Xr from"jsonc-parser";function ed(r){let e=[],t=Xr.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}: ${Xr.printParseErrorCode(n.error)}`)}return t}var ga,yw,$,lt=w(()=>{"use strict";Wt();F();se();tn();Yr();le();l(ed,"parseJsonc");ga=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await Sn.readFile(t,"utf-8");return ed(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${Y(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await Sn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Sn.writeFile(n,`${o}
|
|
297
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await Sn.readFile(t,"utf-8");return ed(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${Y(t)}`),null}}async writeGlobalConfig(e,t){let n=x.getGlobalProjectConfigPath(e),s=x.getGlobalProjectPath(e);await Sn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Sn.writeFile(n,`${o}
|
|
298
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:Xn,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=x.generateProjectId(e),s=x.getGlobalProjectPath(n),o=x.getDisplayPath(s),i=b(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Xn,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await x.hasLegacyStructure(e))return!1;if(!await x.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=x.getGlobalProjectPath(s.projectId);try{return(await Sn.readdir(hw.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:x.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=b();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ts(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=x.generateProjectId(e);return{projectId:n,dataPath:x.getDisplayPath(x.getGlobalProjectPath(n))}}},yw=new ga,$=yw});import Qr from"node:fs/promises";import fa from"node:path";var ha,td,nd=w(()=>{"use strict";lt();le();F();ha=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Qr.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Qr.readFile(fa.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=fa.join(this.agentsPath,`${e}.md`),n=await Qr.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=fa.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})}
|
|
299
|
+
`;await Qr.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},td=ha});import sd from"node:path";async function kw(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await M(sd.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await M(sd.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function bw(){return{...ww}}function Cw(){return{...Sw}}async function rd(){return Zr||(Zr=await kw()?bw():Cw(),Zr)}var Zr,ww,Sw,od=w(()=>{"use strict";_e();Zr=null,ww={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}},Sw={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(kw,"isClaudeEnvironment");l(bw,"getClaudeAgent");l(Cw,"getTerminalAgent");l(rd,"detect")});import Bs from"node:fs/promises";var ya,id,ad=w(()=>{"use strict";F();ya=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await Bs.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${y(n)}`)}await Bs.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await Bs.readdir(e)}async fileExists(e){try{return await Bs.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await Bs.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
300
300
|
${e.map((t,n)=>`${n+1}. ${t}`).join(`
|
|
301
301
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
302
302
|
|
|
@@ -341,7 +341,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
341
341
|
|
|
342
342
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
343
343
|
|
|
344
|
-
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},
|
|
344
|
+
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},id=ya});var vw,eo,ns,cd=w(()=>{"use strict";nd();Wt();od();ad();qr();vw=["claude"],eo=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new td}async initialize(){return this.agent?this.agent:await Qu.execute(async()=>{if(this.agentInfo=await rd(),!this.agentInfo?.isSupported)throw Hs.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!vw.includes(e))throw Hs.notSupported(this.agentInfo?.type??"unknown");return this.agent=new id,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:`
|
|
345
345
|
AGENTIC EXECUTION:
|
|
346
346
|
- Read: templates/agentic/orchestrator.md
|
|
347
347
|
- Analyze task: "${e}"
|
|
@@ -349,14 +349,18 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
|
|
|
349
349
|
- Claude decides which agent(s) to use
|
|
350
350
|
- Always prefer specialists over generalist
|
|
351
351
|
- Fragment complex tasks into subtasks
|
|
352
|
-
`}}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}},ns=new Zr});var eo,to,id=w(()=>{"use strict";eo=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"}},to=new eo});import Sw from"node:crypto";import no from"node:fs/promises";import ad from"node:path";function cd(){return{version:Tt,lastUpdated:"",checksums:{}}}var Tt,ya,Ne,Vs=w(()=>{"use strict";le();F();se();ae();Tt="1.0.0";l(cd,"getDefaultChecksums");ya=class{static{l(this,"IndexStorage")}getIndexPath(e){return ad.join(v.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await no.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Tt?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 cd()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await no.readFile(e);return Sw.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:Tt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{A.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await no.readdir(t);await Promise.all(n.map(s=>no.unlink(ad.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Tt?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!==Tt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=A.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=A.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Ne=new ya});var ld,bw,so,Cw,ud=w(()=>{"use strict";Vs();ld=8e4,bw={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"]},so=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||ld,[c,u,d]=await Promise.all([Ne.readIndex(t),Ne.readDomains(t),Ne.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let V=d.domainIndex[D]||[];for(let me of V)p.add(me)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let V of D)p.add(V)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,V)=>V.score-D.score);let f=0,k=[];for(let D of g){let V=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+V>a||k.length>=s)break;k.push(D),f+=V}let S=Math.ceil(c.relevantFiles.reduce((D,V)=>D+V.size,0)/this.CHARS_PER_TOKEN),I=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:I,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(bw))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 Ne.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 Ne.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ne.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||ld,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)}},Cw=new so});import dd from"node:path";var wa,ro,Pw,pd=w(()=>{"use strict";Vs();se();wa=[{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"}],ro=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 wa)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=dd.dirname(i.path);n.get(u).add(`**/${dd.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=wa.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 wa)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:Tt,projectId:e,domains:t,discoveredAt:s};await Ne.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:Tt,lastUpdate:s,fileCategories:n,domainIndex:i};await Ne.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ne.readDomains(e),Ne.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 Ne.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 Ne.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:Tt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Ne.writeCategories(e,m)}return o}},Pw=new ro});import ka from"node:path";var Sa,xw,vw,oo,md,ba=w(()=>{"use strict";Sa=30,xw=[/^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$/],vw=[/^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],oo=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=Sa){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=ka.basename(e.path);for(let n of xw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ka.basename(e.path);for(let s of vw)if(s.test(t))return 15;let n=ka.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}},md=new oo});function ao(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 Tw[r]}var Y,Ca,Pa,io,Tw,Et,gd,sn=w(()=>{"use strict";Y={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ca=["feature","spec","design","refactor","migrate"],Pa=["ship","cleanup","git","migrate"],io=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Tw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(ao,"getTimeout");Et={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},gd={HISTORY_MAX:100}});function xa(r,e){return{...Ds[r],...e}}function co(r,e,t){return{message:r,hint:e,...t}}var lo=w(()=>{"use strict";xr();xr();l(xa,"getError");l(co,"createError")});import{execSync as va}from"node:child_process";var uo,Ta,po,mo,Ea=w(()=>{"use strict";lo();uo={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ta=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=uo[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=uo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new po(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=uo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
353
|
-
`);throw new
|
|
354
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
355
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
356
|
-
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(Q.dim(`\u250C${s}\u2510`)),console.log(`${Q.dim("\u2502")} ${Q.bold(r.padEnd(n))} ${Q.dim("\u2502")}`),console.log(Q.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${Q.dim("\u2502")} ${o.padEnd(n)} ${Q.dim("\u2502")}`);return console.log(Q.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),
|
|
357
|
-
${Q.bold(r)}`),console.log(Q.dim("\u2500".repeat(r.length))),this)},stop(){return ss&&(clearInterval(ss),ss=null,
|
|
358
|
-
`),this)},progress(r,e,t){if(
|
|
359
|
-
`),this)}},h=Nw});function Uw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Lw.has(r)||r.includes("prjct"))return{level:rs.debug,name:"debug"};let e=rs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function fo(r,e,t){return Sd>=r?(...n)=>console[t](e,...n):Gw}var rs,Lw,Sd,Hw,Gw,zw,B,os=w(()=>{"use strict";rs={error:0,warn:1,info:2,debug:3},Lw=new Set(["1","true","*"]);l(Uw,"getLogLevel");({level:Sd,name:Hw}=Uw()),Gw=l(()=>{},"noop");l(fo,"createLogMethod");zw={error:fo(rs.error,"[prjct:error]","error"),warn:fo(rs.warn,"[prjct:warn]","warn"),info:fo(rs.info,"[prjct:info]","log"),debug:fo(rs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Sd>=0,"isEnabled"),level:l(()=>Hw,"level")},B=zw});var ho,Ww,bd=w(()=>{"use strict";Wt();ae();xi();sn();os();ho=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=gd.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"&&B.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(Pr.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(Pr.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 B.error("Event callback error:",n),n}}async logEvent(e){try{A.appendEvent(this.projectId,e.type,e)}catch(t){B.debug("Failed to log event:",K(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())}},Ww=new ho});var yo,wo,Cd=w(()=>{"use strict";le();se();_e();yo=class{static{l(this,"SyncEventBus")}async publish(e){let t=v.getSyncPendingPath(e.projectId),n=await mn(t,[])??[];n.push(e),await Rs(t,n)}async getPending(e){let t=v.getSyncPendingPath(e);return await mn(t,[])??[]}async clearPending(e){let t=v.getSyncPendingPath(e);await Rs(t,[])}async updateLastSync(e){let t=v.getLastSyncPath(e),n={timestamp:b(),success:!0};await Rs(t,n)}async getLastSync(e){let t=v.getLastSyncPath(e);return await mn(t,null)}},wo=new yo});var ja=w(()=>{"use strict";bd();Cd()});var It,ko=w(()=>{"use strict";It=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 Re,Ft=w(()=>{"use strict";ja();ko();se();ae();Re=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new It({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=A.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await wo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as Vw}from"node:crypto";var $a,dt,So=w(()=>{"use strict";Hi();se();Ft();$a=class extends Re{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"};Ui.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 Ui.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 ru(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 Vw("sha256").update(JSON.stringify(t)).digest("hex")}},dt=new $a});var Ma,Le,Js=w(()=>{"use strict";xt();zi();se();rn();Ft();Ma=class extends Re{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",au)}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:ie(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Yt(Ot.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Le=new Ma});var Oa,Pn,bo=w(()=>{"use strict";Wr();se();Ft();Oa=class extends Re{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Wu)}getDefault(){return{...Bu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(I=>I.date===o);if(p>=0){let I=m[p];m[p]={...I,tokensSaved:I.tokensSaved+n,syncs:I.syncs+1,avgCompressionRate:(I.avgCompressionRate*I.syncs+s)/(I.syncs+1),totalDuration:I.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(I=>I.date>=f),S=[...i.agentUsage];if(t.agents)for(let I of t.agents){let D=S.findIndex(V=>V.agentName===I);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].tokensSaved+Math.floor(n/t.agents.length)}:S.push({agentName:I,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:S,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Vu(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)}},Pn=new Oa});import Ke from"node:fs/promises";import oe from"node:path";async function qs(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(r)&&A.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=v.getGlobalProjectPath(r),s=oe.join(n,"storage"),o=oe.join(n,"index"),i=oe.join(n,"memory");t.backupDir=await Jw(s,o,i),A.getDb(r);for(let{filename:a,key:c}of Na){let u=oe.join(s,a),d=await xn(u);if(d===null){t.skippedFiles.push(a);continue}try{A.setDoc(r,c,d),Pd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of _a){let u=oe.join(o,a),d=await xn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),xd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await tk(r,o,t),await nk(r,o,t),await sk(r,i,t),await rk(r,i,t),t.errors.length===0&&await ok(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 Jw(r,e,t){let n=oe.join(r,"backup");return await Ke.mkdir(n,{recursive:!0}),await Ke.mkdir(oe.join(n,"index"),{recursive:!0}),await Ke.mkdir(oe.join(n,"memory"),{recursive:!0}),await Fa(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Fa(e,oe.join(n,"index")),await Fa(t,oe.join(n,"memory")),n}async function Fa(r,e,t){try{let n=await Ke.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=oe.join(r,s.name),i=oe.join(e,s.name);await Ke.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Pd(r,e,t){switch(e){case"state":qw(r,t);break;case"queue":Kw(r,t);break;case"ideas":Yw(r,t);break;case"shipped":Xw(r,t);break;case"metrics":Qw(r,t);break;case"analysis":Zw(r,t);break}}function qw(r,e){let t=A.getDb(r),n=t.prepare(`
|
|
352
|
+
`}}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}},ns=new eo});var to,no,ld=w(()=>{"use strict";to=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"}},no=new to});import xw from"node:crypto";import so from"node:fs/promises";import ud from"node:path";function dd(){return{version:Tt,lastUpdated:"",checksums:{}}}var Tt,wa,Ne,Vs=w(()=>{"use strict";le();F();se();ae();Tt="1.0.0";l(dd,"getDefaultChecksums");wa=class{static{l(this,"IndexStorage")}getIndexPath(e){return ud.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await so.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Tt?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 dd()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await so.readFile(e);return xw.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:Tt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{D.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await so.readdir(t);await Promise.all(n.map(s=>so.unlink(ud.join(t,s))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Tt?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!==Tt?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=D.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=D.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)}},Ne=new wa});var pd,Tw,ro,Ew,md=w(()=>{"use strict";Vs();pd=8e4,Tw={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"]},ro=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||pd,[c,u,d]=await Promise.all([Ne.readIndex(t),Ne.readDomains(t),Ne.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let I of m){let V=d.domainIndex[I]||[];for(let ge of V)p.add(ge)}if(i&&d.domainIndex.general){let I=d.domainIndex.general.slice(0,10);for(let V of I)p.add(V)}let g=c.relevantFiles.filter(I=>p.has(I.path)&&I.score>=o);g.sort((I,V)=>V.score-I.score);let f=0,S=[];for(let I of g){let V=Math.ceil(I.size/this.CHARS_PER_TOKEN);if(f+V>a||S.length>=s)break;S.push(I),f+=V}let k=Math.ceil(c.relevantFiles.reduce((I,V)=>I+V.size,0)/this.CHARS_PER_TOKEN),A=k>0?(k-f)/k:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:A,estimatedTokensSaved:k-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Tw))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 Ne.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 Ne.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ne.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||pd,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)}},Ew=new ro});import gd from"node:path";var Sa,oo,Aw,fd=w(()=>{"use strict";Vs();se();Sa=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],oo=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Sa)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=gd.dirname(i.path);n.get(u).add(`**/${gd.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=Sa.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 Sa)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:Tt,projectId:e,domains:t,discoveredAt:s};await Ne.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:Tt,lastUpdate:s,fileCategories:n,domainIndex:i};await Ne.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ne.readDomains(e),Ne.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 Ne.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 Ne.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:Tt,lastUpdate:b(),fileCategories:u,domainIndex:d};await Ne.writeCategories(e,m)}return o}},Aw=new oo});import ka from"node:path";var ba,Dw,Iw,io,hd,Ca=w(()=>{"use strict";ba=30,Dw=[/^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$/],Iw=[/^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],io=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=ba){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=ka.basename(e.path);for(let n of Dw)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ka.basename(e.path);for(let s of Iw)if(s.test(t))return 15;let n=ka.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}},hd=new io});function co(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 Rw[r]}var X,Pa,va,ao,Rw,Et,yd,sn=w(()=>{"use strict";X={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Pa=["feature","spec","design","refactor","migrate"],va=["ship","cleanup","git","migrate"],ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Rw={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(co,"getTimeout");Et={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},yd={HISTORY_MAX:100}});function xa(r,e){return{...Is[r],...e}}function lo(r,e,t){return{message:r,hint:e,...t}}var uo=w(()=>{"use strict";xr();xr();l(xa,"getError");l(lo,"createError")});import{execSync as Ta}from"node:child_process";var po,Ea,mo,go,Aa=w(()=>{"use strict";uo();po={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"}},Ea=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=po[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=po[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new mo(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=po[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
353
|
+
`);throw new mo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
354
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(po),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=Ta(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:lo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Ta(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Ta(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:lo(`${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())}},mo=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}},go=new Ea});import{exec as jw}from"node:child_process";import{promisify as $w}from"node:util";var WD,wd=w(()=>{"use strict";sn();Aa();WD=$w(jw)});var Ot,Da,ut,rn=w(()=>{"use strict";vt();se();ae();Ot={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Da=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ie(),s=b();return D.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 D.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(ie(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?D.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):D.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=D.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=D.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(D.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);D.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return D.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ut=new Da});var fo,Ze,Ia=w(()=>{"use strict";lt();rn();ae();fo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;G.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?G.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await $.getProjectId(e);return s?G.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;G.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 G.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=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Ot.MEMORY_MAX_ENTRIES)return 0;let s=n-Ot.MEMORY_MAX_ENTRIES,o=G.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);ut.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&&G.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}}},Ze=new fo});var Sd=w(()=>{"use strict";le();_e()});import{exec as Ow}from"node:child_process";import{promisify as Fw}from"node:util";var dI,kd=w(()=>{"use strict";Vs();se();Ca();dI=Fw(Ow)});import kn from"chalk";var bd,_w,Nw,At,Cd=w(()=>{"use strict";Qe();bd=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],_w=80,Nw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:bd,speed:_w},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(bd[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")=>Ir(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Ir(r).signature,"getSignature")},At=Nw});import Q from"chalk";function Hw(){return Lw[Uw]}var CI,Ra,Lw,Uw,bn,ss,ja,dt,on,Gw,zw,h,Cn=w(()=>{"use strict";Cd();sn();uo();uo();CI=At.spinner.frames,Ra=At.spinner.speed,Lw={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}},Uw="compact";l(Hw,"getTierConfig");bn={success:Q.green("\u2713"),fail:Q.red("\u2717"),warn:Q.yellow("\u26A0"),info:Q.blue("\u2139"),debug:Q.dim("\u{1F527}"),bullet:Q.dim("\u2022"),arrow:Q.dim("\u2192"),check:Q.green("\u2713"),cross:Q.red("\u2717"),spinner:Q.cyan("\u25D0")},ss=null,ja=0,dt=!1,on=l((r,e)=>{let t=e??(Hw().maxCharsPerLine||Et.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Gw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Et.CLEAR_WIDTH)}\r`):!0,"clear"),zw={start(){return dt||console.log(At.cli.header()),this},end(){return dt||console.log(At.cli.footer()),this},spin(r){return dt?this:(this.stop(),process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(ja++,on(r,Et.SPINNER_MSG))}`)},Ra),this):(process.stdout.write(`${At.cli.spin(0,on(r,Et.SPINNER_MSG))}
|
|
355
|
+
`),this))},done(r,e){if(this.stop(),!dt){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=Q.dim(` [${n.join(" | ")}]`))}console.log(`${bn.success} ${on(r,Et.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${bn.fail} ${on(r,Et.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?xa(r):r;return console.error(),console.error(`${bn.fail} ${e.message}`),e.file&&console.error(Q.dim(` File: ${e.file}`)),e.hint&&console.error(Q.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(Q.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),dt||console.log(`${bn.warn} ${on(r,Et.WARN_MSG)}`),this},info(r){return this.stop(),dt||console.log(`${bn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!dt&&e&&console.log(`${bn.debug} ${Q.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),dt)return this;let t=e.bullet||bn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),dt||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(Q.dim(s)),console.log(Q.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),dt)return this;let t=e.split(`
|
|
356
|
+
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(Q.dim(`\u250C${s}\u2510`)),console.log(`${Q.dim("\u2502")} ${Q.bold(r.padEnd(n))} ${Q.dim("\u2502")}`),console.log(Q.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${Q.dim("\u2502")} ${o.padEnd(n)} ${Q.dim("\u2502")}`);return console.log(Q.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),dt?this:(console.log(`
|
|
357
|
+
${Q.bold(r)}`),console.log(Q.dim("\u2500".repeat(r.length))),this)},stop(){return ss&&(clearInterval(ss),ss=null,Gw()),this},step(r,e,t){if(dt)return this;this.stop();let n=Q.dim(`[${r}/${e}]`);return process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(ja++,`${n} ${on(t,Et.STEP_MSG)}`)}`)},Ra),this):(process.stdout.write(`${At.cli.spin(0,`${n} ${on(t,Et.STEP_MSG)}`)}
|
|
358
|
+
`),this)},progress(r,e,t){if(dt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=Q.cyan("\u2588".repeat(s))+Q.dim("\u2591".repeat(o)),a=t?` ${on(t,Et.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ss=setInterval(()=>{process.stdout.write(`\r${At.cli.spin(ja++,`[${i}] ${n}%${a}`)}`)},Ra),this):(process.stdout.write(`${At.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
359
|
+
`),this)}},h=zw});function Pd(r,e){let t=[];Js("Languages",r.languages,e.languages,t),Js("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Js("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let n=r.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Js("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Js("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function $a(r){if(!r.hasChanges)return`## Analysis Diff
|
|
360
|
+
|
|
361
|
+
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let n of r.items){let s=n.type==="added"?"+":n.type==="removed"?"-":"~",o=n.type==="changed"?`${n.before} \u2192 ${n.after}`:n.after??n.before??"";e.push(`| ${s} | ${n.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
362
|
+
`)}function vd(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
|
|
363
|
+
`)}function Js(r,e,t,n){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||n.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:r,type:"removed",before:i})}var Ma=w(()=>{"use strict";l(Pd,"generateAnalysisDiff");l($a,"formatAnalysisDiffMd");l(vd,"formatAnalysisDiffText");l(Js,"diffStringArray")});function Bw(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Ww.has(r)||r.includes("prjct"))return{level:rs.debug,name:"debug"};let e=rs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ho(r,e,t){return xd>=r?(...n)=>console[t](e,...n):Jw}var rs,Ww,xd,Vw,Jw,qw,B,os=w(()=>{"use strict";rs={error:0,warn:1,info:2,debug:3},Ww=new Set(["1","true","*"]);l(Bw,"getLogLevel");({level:xd,name:Vw}=Bw()),Jw=l(()=>{},"noop");l(ho,"createLogMethod");qw={error:ho(rs.error,"[prjct:error]","error"),warn:ho(rs.warn,"[prjct:warn]","warn"),info:ho(rs.info,"[prjct:info]","log"),debug:ho(rs.debug,"[prjct:debug]","log"),isEnabled:l(()=>xd>=0,"isEnabled"),level:l(()=>Vw,"level")},B=qw});var yo,Kw,Td=w(()=>{"use strict";Wt();ae();xi();sn();os();yo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=yd.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"&&B.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(vr.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(vr.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 B.error("Event callback error:",n),n}}async logEvent(e){try{D.appendEvent(this.projectId,e.type,e)}catch(t){B.debug("Failed to log event:",Y(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Kw=new yo});var wo,So,Ed=w(()=>{"use strict";le();se();_e();wo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await mn(t,[])??[];n.push(e),await Rs(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await mn(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await Rs(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await Rs(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await mn(t,null)}},So=new wo});var Oa=w(()=>{"use strict";Td();Ed()});var Dt,ko=w(()=>{"use strict";Dt=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 Re,Ft=w(()=>{"use strict";Oa();ko();se();ae();Re=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Dt({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=D.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){D.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:b(),projectId:e};await So.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 D.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 Xw}from"node:crypto";var Fa,Be,bo=w(()=>{"use strict";Gi();Ma();se();Ft();Fa=class extends Re{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Hi.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 Hi.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Pd(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await au(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 Xw("sha256").update(JSON.stringify(t)).digest("hex")}},Be=new Fa});var _a,Le,qs=w(()=>{"use strict";vt();Wi();se();rn();Ft();_a=class extends Re{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",uu)}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:ie(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Yt(Ot.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;ut.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Le=new _a});var Na,Pn,Co=w(()=>{"use strict";Br();se();Ft();Na=class extends Re{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Ju)}getDefault(){return{...qu}}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(A=>A.date===o);if(p>=0){let A=m[p];m[p]={...A,tokensSaved:A.tokensSaved+n,syncs:A.syncs+1,avgCompressionRate:(A.avgCompressionRate*A.syncs+s)/(A.syncs+1),totalDuration:A.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(A=>A.date>=f),k=[...i.agentUsage];if(t.agents)for(let A of t.agents){let I=k.findIndex(V=>V.agentName===A);I>=0?k[I]={...k[I],usageCount:k[I].usageCount+1,tokensSaved:k[I].tokensSaved+Math.floor(n/t.agents.length)}:k.push({agentName:A,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:k,dailyStats:S,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ku(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)}},Pn=new Na});import Xe from"node:fs/promises";import oe from"node:path";async function Ks(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(D.exists(r)&&D.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=oe.join(n,"storage"),o=oe.join(n,"index"),i=oe.join(n,"memory");t.backupDir=await Qw(s,o,i),D.getDb(r);for(let{filename:a,key:c}of Ha){let u=oe.join(s,a),d=await vn(u);if(d===null){t.skippedFiles.push(a);continue}try{D.setDoc(r,c,d),Ad(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Ua){let u=oe.join(o,a),d=await vn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{D.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Dd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await iS(r,o,t),await aS(r,o,t),await cS(r,i,t),await lS(r,i,t),t.errors.length===0&&await uS(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 Qw(r,e,t){let n=oe.join(r,"backup");return await Xe.mkdir(n,{recursive:!0}),await Xe.mkdir(oe.join(n,"index"),{recursive:!0}),await Xe.mkdir(oe.join(n,"memory"),{recursive:!0}),await La(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await La(e,oe.join(n,"index")),await La(t,oe.join(n,"memory")),n}async function La(r,e,t){try{let n=await Xe.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=oe.join(r,s.name),i=oe.join(e,s.name);await Xe.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Ad(r,e,t){switch(e){case"state":Zw(r,t);break;case"queue":eS(r,t);break;case"ideas":tS(r,t);break;case"shipped":nS(r,t);break;case"metrics":sS(r,t);break;case"analysis":rS(r,t);break}}function Zw(r,e){let t=D.getDb(r),n=t.prepare(`
|
|
360
364
|
INSERT OR REPLACE INTO tasks
|
|
361
365
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
362
366
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -367,80 +371,80 @@ ${Q.bold(r)}`),console.log(Q.dim("\u2500".repeat(r.length))),this)},stop(){retur
|
|
|
367
371
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
368
372
|
depends_on, started_at, completed_at, output, summary)
|
|
369
373
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
370
|
-
`),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
|
|
374
|
+
`),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 eS(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
|
|
371
375
|
INSERT OR REPLACE INTO queue_tasks
|
|
372
376
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
373
377
|
feature_id, feature_name)
|
|
374
378
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
375
|
-
`);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
|
|
379
|
+
`);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 tS(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
|
|
376
380
|
INSERT OR REPLACE INTO ideas
|
|
377
381
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
378
382
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
379
|
-
`);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
|
|
383
|
+
`);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 nS(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
|
|
380
384
|
INSERT OR REPLACE INTO shipped_features
|
|
381
385
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
382
386
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
383
|
-
`);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
|
|
387
|
+
`);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 sS(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
|
|
384
388
|
INSERT OR REPLACE INTO metrics_daily
|
|
385
389
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
386
390
|
VALUES (?, ?, ?, ?, ?)
|
|
387
|
-
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function
|
|
391
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function rS(r,e){let n=D.getDb(r).prepare(`
|
|
388
392
|
INSERT OR REPLACE INTO analysis
|
|
389
393
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
390
394
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
391
|
-
`),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
|
|
395
|
+
`),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 Dd(r,e,t){e==="categories-cache"&&oS(r,t)}function oS(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=D.getDb(r).prepare(`
|
|
392
396
|
INSERT OR REPLACE INTO index_files
|
|
393
397
|
(path, categories, domain, score, size, mtime, language)
|
|
394
398
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
395
|
-
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function
|
|
399
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function iS(r,e,t){let n=oe.join(e,"checksums.json"),s=await vn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=D.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 aS(r,e,t){let n=oe.join(e,"file-scores.json"),s=await vn(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=D.getDb(r),a=i.prepare(`
|
|
396
400
|
INSERT OR REPLACE INTO index_files
|
|
397
401
|
(path, score, size, mtime, language, categories, domain)
|
|
398
402
|
VALUES (?, ?, ?, ?, NULL,
|
|
399
403
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
400
404
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
401
|
-
`);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
|
|
402
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=
|
|
403
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=
|
|
404
|
-
`).filter(f=>f.trim());if(p.length===0){await Ke.unlink(d),n++;continue}let g=A.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,k,S.timestamp??S.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let S=JSON.parse(k),I=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(I,D?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await Ke.unlink(d),n++}catch{}}let a=oe.join(e,"index"),c=[..._a.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=oe.join(a,u),m=await xn(d);if(m===null)continue;let p=_a.find(g=>g.filename===u);p&&(A.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),xd(r,p.key,m));try{await Ke.unlink(d)}catch{}n++}return n}var Na,_a,Po=w(()=>{"use strict";le();F();ae();Na=[{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"}],_a=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(qs,"migrateJsonToSqlite");l(Jw,"createBackup");l(Fa,"copyFiles");l(Pd,"populateNormalized");l(qw,"populateTasksFromState");l(Kw,"populateQueueTasks");l(Yw,"populateIdeas");l(Xw,"populateShippedFeatures");l(Qw,"populateMetricsDaily");l(Zw,"populateAnalysis");l(xd,"populateIndexTables");l(ek,"populateCategoriesIndex");l(tk,"migrateChecksums");l(nk,"migrateFileScores");l(sk,"migrateEventsJsonl");l(rk,"migrateLearningsJsonl");l(ok,"cleanupJsonFiles");l(xn,"readJsonSafe");l(Co,"sweepLegacyJson")});var La,ge,Ks=w(()=>{"use strict";xt();Fr();se();rn();Ft();La=class extends Re{static{l(this,"QueueStorage")}constructor(){super("queue.json",Ou)}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:ie(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ie(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Yt(Ot.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},ge=new La});var Ua,Ze,Ys=w(()=>{"use strict";xt();qi();se();rn();Ft();Ua=class extends Re{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Au)}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:ie(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Yt(Ot.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;lt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},Ze=new Ua});var Xs,Ha,vn,Ga=w(()=>{"use strict";Xs={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"}},Ha=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=Xs[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 Xs[e]}getPrompt(e){return Xs[e].prompt}getValidCommands(e){return Xs[e].transitions}formatNextSteps(e){return Xs[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}`}})}},vn=new Ha});var za,_,Qs=w(()=>{"use strict";xt();Fr();se();Ga();rn();Ft();za=class extends Re{static{l(this,"StateStorage")}constructor(){super("state.json",$u)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=vn.getCurrentState(e),s=vn.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:ie()};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[];lt.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=Ru.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
405
|
+
`);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 cS(r,e,t){let n=oe.join(e,"events.jsonl");try{let o=(await Xe.readFile(n,"utf-8")).split(`
|
|
406
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=D.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function lS(r,e,t){let n=oe.join(e,"learnings.jsonl");try{let o=(await Xe.readFile(n,"utf-8")).split(`
|
|
407
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=D.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function uS(r,e,t,n){let s=l(async(i,a)=>{try{await Xe.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Ha)await s(oe.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(oe.join(e,i),`cleanup:index/${i}`);await s(oe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(oe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function vn(r){try{let e=await Xe.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Po(r){let e=x.getGlobalProjectPath(r),t=oe.join(e,"storage"),n=0;D.getDb(r);for(let{filename:u,key:d}of Ha){let m=oe.join(t,u),p=await vn(m);if(p!==null){D.setDoc(r,d,p),Ad(r,d,p);try{await Xe.unlink(m)}catch{}n++}}let s=oe.join(e,"project.json"),o=await vn(s);if(o!==null){D.setDoc(r,"project",o);try{await Xe.unlink(s)}catch{}n++}let i=oe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=oe.join(i,u);try{let p=(await Xe.readFile(d,"utf-8")).split(`
|
|
408
|
+
`).filter(f=>f.trim());if(p.length===0){await Xe.unlink(d),n++;continue}let g=D.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 k=JSON.parse(S);f.run(k.type??k.action??"unknown",k.taskId??k.task_id??null,S,k.timestamp??k.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 k=JSON.parse(S),A=`learning:${k.taskId??k.timestamp??Date.now()}`,I=k.tags;f.run(A,I?.[0]??null,S,1,k.timestamp??new Date().toISOString())}catch{}})()}await Xe.unlink(d),n++}catch{}}let a=oe.join(e,"index"),c=[...Ua.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=oe.join(a,u),m=await vn(d);if(m===null)continue;let p=Ua.find(g=>g.filename===u);p&&(D.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Dd(r,p.key,m));try{await Xe.unlink(d)}catch{}n++}return n}var Ha,Ua,vo=w(()=>{"use strict";le();F();ae();Ha=[{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"}],Ua=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Ks,"migrateJsonToSqlite");l(Qw,"createBackup");l(La,"copyFiles");l(Ad,"populateNormalized");l(Zw,"populateTasksFromState");l(eS,"populateQueueTasks");l(tS,"populateIdeas");l(nS,"populateShippedFeatures");l(sS,"populateMetricsDaily");l(rS,"populateAnalysis");l(Dd,"populateIndexTables");l(oS,"populateCategoriesIndex");l(iS,"migrateChecksums");l(aS,"migrateFileScores");l(cS,"migrateEventsJsonl");l(lS,"migrateLearningsJsonl");l(uS,"cleanupJsonFiles");l(vn,"readJsonSafe");l(Po,"sweepLegacyJson")});var Ga,fe,Ys=w(()=>{"use strict";vt();_r();se();rn();Ft();Ga=class extends Re{static{l(this,"QueueStorage")}constructor(){super("queue.json",Nu)}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:ie(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=b(),s=t.map(o=>({...o,id:ie(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:b()},n):i),lastUpdated:b()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Yt(Ot.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;ut.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},fe=new Ga});var za,et,Xs=w(()=>{"use strict";vt();Ki();se();rn();Ft();za=class extends Re{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ru)}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:ie(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Yt(Ot.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;ut.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},et=new za});var Qs,Wa,xn,Ba=w(()=>{"use strict";Qs={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"}},Wa=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=Qs[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 Qs[e]}getPrompt(e){return Qs[e].prompt}getValidCommands(e){return Qs[e].transitions}formatNextSteps(e){return Qs[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}`}})}},xn=new Wa});var Va,_,Zs=w(()=>{"use strict";vt();_r();se();Ba();rn();Ft();Va=class extends Re{static{l(this,"StateStorage")}constructor(){super("state.json",Fu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=xn.getCurrentState(e),s=xn.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:ie()};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[];ut.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=Mu.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:
|
|
405
409
|
${f.join(`
|
|
406
|
-
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new
|
|
407
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),
|
|
410
|
+
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new Va});var Id=w(()=>{"use strict";Oa();F()});var Ja,qa,Ka=w(()=>{"use strict";Jn();Ft();Ja=class extends Re{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Uu,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}},qa=new Ja});function Rd(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Ya,ht,er=w(()=>{"use strict";ae();l(Rd,"rowToRule");Ya=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=D.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return D.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
411
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),D.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return D.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(D.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}getRulesForCommand(e,t){return D.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Rd)}getAllRules(e){return D.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Rd)}resetRules(e){let t=D.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return D.run(e,"DELETE FROM workflow_rules"),t?.c??0}},ht=new Ya});var _t=w(()=>{"use strict";bo();rn();ae();qs();Vs();Co();vo();Ys();Xs();Zs();Id();Ft();Ka();er()});function dS(){return`\u26A1 prjct
|
|
408
412
|
|
|
409
|
-
---`}function
|
|
410
|
-
\u26A1 prjct \xB7 v${
|
|
413
|
+
---`}function pS(){return`---
|
|
414
|
+
\u26A1 prjct \xB7 v${ta()}`}function q(...r){return mS(dS(),...r.filter(Boolean),pS())}function Xa(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
|
|
411
415
|
`)}function je(r,e,t=3){return`### ${r}
|
|
412
|
-
${e}`}function
|
|
413
|
-
`)}function
|
|
414
|
-
> ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function
|
|
415
|
-
${
|
|
416
|
+
${e}`}function tt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
417
|
+
`)}function Qa(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
418
|
+
> ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function jd(r,e){let t=["#","Status","Description"],n=r.map((s,o)=>{let i=String(o+1),a;s.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${s.description}${c}`]});return`### Subtasks
|
|
419
|
+
${Xa(t,n)}`}function $d(r){return r.length===0?"":`### Relevant Files
|
|
416
420
|
${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
|
|
417
|
-
`)}`}function
|
|
418
|
-
${
|
|
419
|
-
${
|
|
420
|
-
> ${e}`:`## \u2705 ${r}`}function
|
|
421
|
-
|
|
422
|
-
`)}function Nt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var is=w(()=>{"use strict";tn();l(
|
|
423
|
-
Next:`));for(let o of s){let i=
|
|
424
|
-
`);Z.note(e,"Configuration Summary");let t=await Z.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Z.isCancel(t)||!t?(Z.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,Z.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return
|
|
425
|
-
`).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}},dk=new To,tt=dk});var Eo,pk,Xa,Od=w(()=>{"use strict";En();Eo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await tt.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 tt.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 tt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),I=this.parseDuration(k.estimatedDuration);return I===0?!1:Math.abs(S)/I<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await tt.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 tt.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}},pk=new Eo,Xa=pk});var nr,Ao,Qa,Za=w(()=>{"use strict";zn();se();nr=3,Ao=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>=nr){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}/${nr} 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>=nr){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}/${nr} 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>=nr&&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:[j.FILE_STRUCTURE,j.ARCHITECTURE],tech_stack:[j.TECH_STACK],architecture:[j.ARCHITECTURE,j.CODE_STYLE],estimation:[j.SHIP_WORKFLOW],workflow:[j.SHIP_WORKFLOW,j.CODE_STYLE],gotcha:[j.TEST_BEHAVIOR,j.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(`
|
|
426
|
-
`)}},
|
|
421
|
+
`)}`}function Md(r){return`### Rules
|
|
422
|
+
${tt(r)}`}function he(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
|
|
423
|
+
${Xa(e,t)}`}function pt(r){let e=Object.entries(r).filter(([,s])=>s!=null);if(e.length===0)return"";let t=["Metric","Value"],n=e.map(([s,o])=>[s,String(o)]);return Xa(t,n)}function Ve(r,e){return e?`## \u2705 ${r}
|
|
424
|
+
> ${e}`:`## \u2705 ${r}`}function Od(r){return`> \u26A0\uFE0F **${r}**`}function mS(...r){return r.filter(Boolean).join(`
|
|
425
|
+
|
|
426
|
+
`)}function Nt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var is=w(()=>{"use strict";tn();l(dS,"mdHeader");l(pS,"mdFooter");l(q,"mdOutput");l(Xa,"mdTable");l(je,"mdSection");l(tt,"mdList");l(Qa,"mdTaskHeader");l(jd,"mdSubtasks");l($d,"mdRelevantFiles");l(Md,"mdRules");l(he,"mdNextSteps");l(pt,"mdStats");l(Ve,"mdDone");l(Od,"mdWarn");l(mS,"mdJoin");l(Nt,"mdActionRequired")});import tr from"chalk";function mt(r,e={}){if(e.quiet)return;let t=_d[r]||"idle",n=xn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Fd[o]||o}));console.log(tr.dim(`
|
|
427
|
+
Next:`));for(let o of s){let i=tr.cyan(o.cmd.padEnd(12));console.log(tr.dim(` ${i} \u2192 ${o.desc}`))}}function xo(r){let e=_d[r]||"idle";return xn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Fd[n]||n}))}function nr(r){let e=xn.getStateInfo(r);console.log(tr.dim(`\u{1F4CD} State: ${tr.white(r.toUpperCase())} - ${e.description}`))}var Fd,_d,as=w(()=>{"use strict";Ba();Fd={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"},_d={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(mt,"showNextSteps");l(xo,"getNextSteps");l(nr,"showStateInfo")});import*as Z from"@clack/prompts";import Tn from"chalk";var To,Nd,cs,Ld=w(()=>{"use strict";Cn();To=[{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."}],Nd=[{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"}],cs=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){Z.intro(Tn.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return Z.outro(Tn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=To.findIndex(n=>n.value===this.detectedType),t=await Z.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:To.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?To[e].value:void 0});return Z.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Z.multiselect({message:"Which AI agents do you use?",options:Nd.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return Z.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);Z.note(e,"Detected stack");let t=await Z.confirm({message:"Is this stack correct?",initialValue:!0});if(Z.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await Z.group({language:l(()=>Z.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Z.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Z.group({verbosity:l(()=>Z.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>Z.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Tn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Tn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Tn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Tn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Tn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
428
|
+
`);Z.note(e,"Configuration Summary");let t=await Z.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Z.isCancel(t)||!t?(Z.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}handleCancel(){this.aborted=!0,Z.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return To.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Nd.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 Za from"node:path";var gS,fS,Eo,hS,nt,En=w(()=>{"use strict";le();vt();_e();gS="outcomes",fS="outcomes.jsonl",Eo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return Za.join(t,gS)}getOutcomesPath(e){return Za.join(this.getOutcomesDir(e),fS)}async record(e,t){let n={...t,id:ie()},s=this.getOutcomesPath(e);return await Ct(Za.dirname(s)),await Ei(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Bn(t);return n.trim()?n.trim().split(`
|
|
429
|
+
`).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}},hS=new Eo,nt=hS});var Ao,yS,ec,Ud=w(()=>{"use strict";En();Ao=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await nt.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 nt.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 nt.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,k)=>S+k.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let k=this.parseVariance(S.variance),A=this.parseDuration(S.estimatedDuration);return A===0?!1:Math.abs(k)/A<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(k=>k.completedAsPlanned))for(let k of S.tags||[])g.set(k,(g.get(k)||0)+1);let f=[...g.entries()].sort((S,k)=>k[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 nt.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 nt.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}},yS=new Ao,ec=yS});var sr,Do,tc,nc=w(()=>{"use strict";zn();se();sr=3,Do=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>=sr){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}/${sr} 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>=sr){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}/${sr} 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>=sr&&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:[j.FILE_STRUCTURE,j.ARCHITECTURE],tech_stack:[j.TECH_STACK],architecture:[j.ARCHITECTURE,j.CODE_STYLE],estimation:[j.SHIP_WORKFLOW],workflow:[j.SHIP_WORKFLOW,j.CODE_STYLE],gotcha:[j.TEST_BEHAVIOR,j.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(`
|
|
430
|
+
`)}},tc=new Do});var Io,Hd,sc=w(()=>{"use strict";Ji();Ft();se();Io=class extends Re{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...bu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Or([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?Or(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Or(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=Cu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Pu(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:vu(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}},Hd=new Io});var rc=w(()=>{"use strict";Ld();Ud();nc();En();sc()});import Lt from"chalk";function wS(r){return Gd[r.toLowerCase()]||Gd.default}var Gd,oc,Ro,zd=w(()=>{"use strict";Gd={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(wS,"getIcon");oc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Lt.cyan(`
|
|
427
431
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
428
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
429
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Lt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Lt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},
|
|
430
|
-
`)}function
|
|
431
|
-
`)}var
|
|
432
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=wS(t);console.log(Lt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Lt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Lt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Lt.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?Lt.green("\u2713"):Lt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Lt.dim(`(${n})`)}
|
|
433
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Lt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Lt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Ro=new oc});import Ue from"chalk";function SS(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Wd.length;return Wd[t]}function kS(r,e,t="\u25B6"){let n=Ue.dim(String(r+1).padStart(2)),o=SS(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=Ue.green("\u2713 Complete");break;case"in_progress":a=Ue.yellow(`${t} Working...`);break;case"pending":a=Ue.gray("\u25CB Pending");break;case"failed":a=Ue.red("\u2717 Failed");break;case"blocked":a=Ue.gray("\u2298 Blocked");break;default:a=Ue.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function bS(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ue.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ue.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(kS(t,r[t]));return e.push(""),e.join(`
|
|
434
|
+
`)}function Bd(r){console.log(bS(r))}var Wd,Vd=w(()=>{"use strict";Wd=[Ue.cyan,Ue.magenta,Ue.yellow,Ue.blue,Ue.green,Ue.redBright,Ue.magentaBright,Ue.cyanBright];l(SS,"getDomainColor");l(kS,"formatSubtaskLine");l(bS,"renderSubtaskProgress");l(Bd,"printSubtaskProgress")});function CS(r){return Jd.includes(r)}async function PS(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 vS(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(`
|
|
435
|
+
`)}var Jd,xS,jo,qd=w(()=>{"use strict";Jd=["ship","feature","spec","cleanup","migrate"];l(CS,"requiresReasoning");l(PS,"reason");l(vS,"formatPlan");xS={requiresReasoning:CS,reason:PS,formatPlan:vS,REASONING_REQUIRED_COMMANDS:Jd},jo=xS});import rr from"node:fs/promises";var ic,TS,st,ac=w(()=>{"use strict";lt();le();F();ko();ic=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Dt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await $.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await rr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([rr.readFile(d,"utf-8"),rr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await rr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await rr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},TS=new ic,st=TS});import{exec as ES}from"node:child_process";import ye from"node:fs/promises";import Kd from"node:os";import an from"node:path";import{promisify as AS}from"node:util";function Yd(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 cc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function IS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
432
436
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
433
437
|
`}),r.recommendations.length>0&&(e+=`
|
|
434
438
|
Recommendations:
|
|
435
439
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
436
|
-
`})),e}async function
|
|
437
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=an.join(r.projectPath,"package.json");try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await he.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}.*${oc(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await he.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function qd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await he.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await he.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(oc(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await he.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Kd(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await he.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await he.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Yd(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let i=await he.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=an.join(Wd.homedir(),".prjct-cli");try{await he.access(o,he.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await he.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 Xd(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let a=await he.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=an.join(Wd.homedir(),".prjct-cli/projects",o||"");try{await he.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qd(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 he.access(an.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await he.stat(an.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Zd(r){let e=[],t=[],n={},s=r.paths.specs;try{await he.access(s),n.specsExists=!0;let i=await he.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function tp(r,e,t){let n=ep[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function Tk(r,e,t){let n=await tp(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Ek(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var xk,ep,Ak,jo,np=w(()=>{"use strict";F();xk=Pk(Ck);l(Bd,"formatDuration");l(oc,"escapeRegex");l(vk,"formatWarnings");l(Vd,"verifyDone");l(Jd,"verifyShip");l(qd,"verifyFeature");l(Kd,"verifyNow");l(Yd,"verifyInit");l(Xd,"verifySync");l(Qd,"verifyAnalyze");l(Zd,"verifySpec");ep={done:Vd,ship:Jd,feature:qd,now:Kd,init:Yd,sync:Xd,analyze:Qd,spec:Zd};l(tp,"verify");l(Tk,"prepareCommand");l(Ek,"requiresVerification");Ak={verify:tp,prepareCommand:Tk,requiresVerification:Ek,verifiers:ep,formatWarnings:vk,formatDuration:Bd,escapeRegex:oc,verifyDone:Vd,verifyShip:Jd,verifyFeature:qd,verifyNow:Kd,verifyInit:Yd,verifySync:Xd,verifyAnalyze:Qd,verifySpec:Zd},jo=Ak});function Dk(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 Rk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Ik)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Dk(t)};return{detected:!1}}function jk(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 $k(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 Mk(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 Ok(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 Ik,ic,Fk,ls,sp=w(()=>{"use strict";Ik=[{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(Dk,"getHallucinationSuggestion");l(Rk,"detectHallucination");l(jk,"isSimilarError");l($k,"analyzeErrorPattern");l(Mk,"generateEscalationMessage");l(Ok,"generateSuggestion");ic=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=>jk(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=$k(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:Mk(e,o,this.maxAttempts),suggestion:Ok(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 Rk(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}}},Fk=new ic,ls=Fk});function ac(r,e){let t=rr(e),n=_k[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 Nk(r,e){let t=rr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function Lk(r,e,t){let n=rr(t),s=ac(r,t),o=ac(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $o(r,e=en){let t=rr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=Uk(r,e),s=Hk(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=Wk(o),a=Gk(o),c=zk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Bk(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function op(r,e,t=en){let n=rr(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 Uk(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=Lk(i,s,e);if(!t.has(a)){let c=ac(i,e),u=Nk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Hk(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+Vk(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>lc(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 Gk(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 zk(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=lc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function Wk(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 Bk(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=lc(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 lc(r){if(!r.variance)return 0;let e=cc(r.estimatedDuration),t=cc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function cc(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 ip(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(`
|
|
438
|
-
`)}function
|
|
440
|
+
`})),e}async function Xd(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await ye.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=Yd(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await ye.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await ye.access(an.dirname(i),ye.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qd(r){let e=[],t=[],n={};try{let{stdout:i}=await DS("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
441
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=an.join(r.projectPath,"package.json");try{let i=await ye.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await ye.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}.*${cc(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await ye.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Zd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await ye.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await ye.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(cc(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await ye.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ep(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await ye.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await ye.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function tp(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let i=await ye.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=an.join(Kd.homedir(),".prjct-cli");try{await ye.access(o,ye.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await ye.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 np(r){let e=[],t=[],n={},s=an.join(r.projectPath,".prjct/prjct.config.json");try{let a=await ye.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=an.join(Kd.homedir(),".prjct-cli/projects",o||"");try{await ye.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sp(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 ye.access(an.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await ye.stat(an.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function rp(r){let e=[],t=[],n={},s=r.paths.specs;try{await ye.access(s),n.specsExists=!0;let i=await ye.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ip(r,e,t){let n=op[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function RS(r,e,t){let n=await ip(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function jS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var DS,op,$S,$o,ap=w(()=>{"use strict";F();DS=AS(ES);l(Yd,"formatDuration");l(cc,"escapeRegex");l(IS,"formatWarnings");l(Xd,"verifyDone");l(Qd,"verifyShip");l(Zd,"verifyFeature");l(ep,"verifyNow");l(tp,"verifyInit");l(np,"verifySync");l(sp,"verifyAnalyze");l(rp,"verifySpec");op={done:Xd,ship:Qd,feature:Zd,now:ep,init:tp,sync:np,analyze:sp,spec:rp};l(ip,"verify");l(RS,"prepareCommand");l(jS,"requiresVerification");$S={verify:ip,prepareCommand:RS,requiresVerification:jS,verifiers:op,formatWarnings:IS,formatDuration:Yd,escapeRegex:cc,verifyDone:Xd,verifyShip:Qd,verifyFeature:Zd,verifyNow:ep,verifyInit:tp,verifySync:np,verifyAnalyze:sp,verifySpec:rp},$o=$S});function OS(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 FS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of MS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:OS(t)};return{detected:!1}}function _S(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 NS(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 LS(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 US(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 MS,lc,HS,ls,cp=w(()=>{"use strict";MS=[{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(OS,"getHallucinationSuggestion");l(FS,"detectHallucination");l(_S,"isSimilarError");l(NS,"analyzeErrorPattern");l(LS,"generateEscalationMessage");l(US,"generateSuggestion");lc=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=>_S(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=NS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:LS(e,o,this.maxAttempts),suggestion:US(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 FS(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}}},HS=new lc,ls=HS});function uc(r,e){let t=or(e),n=GS[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 zS(r,e){let t=or(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function WS(r,e,t){let n=or(t),s=uc(r,t),o=uc(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Mo(r,e=en){let t=or(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=BS(r,e),s=VS(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=KS(o),a=JS(o),c=qS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=YS(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function up(r,e,t=en){let n=or(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 BS(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=WS(i,s,e);if(!t.has(a)){let c=uc(i,e),u=zS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function VS(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+XS(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>pc(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 JS(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 qS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=pc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function KS(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 YS(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=pc(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 pc(r){if(!r.variance)return 0;let e=dc(r.estimatedDuration),t=dc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function dc(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 dp(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(`
|
|
442
|
+
`)}function XS(r){if(!r.estimatedDuration)return 0;let e=dc(r.estimatedDuration);if(e<=0)return 0;let t=lp[0],n=Number.POSITIVE_INFINITY;for(let s of lp){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function or(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var GS,lp,mc=w(()=>{"use strict";Jn();GS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(uc,"getSprintStart");l(zS,"getSprintEnd");l(WS,"getSprintNumber");l(Mo,"calculateVelocity");l(up,"projectCompletion");l(BS,"bucketBySprint");l(VS,"buildSprintVelocities");l(JS,"detectTrend");l(qS,"calculateOverallAccuracy");l(KS,"calculateAverageVelocity");l(YS,"detectEstimationPatterns");l(pc,"parseVariancePercent");l(dc,"parseDurationMinutes");l(dp,"formatVelocityContext");lp=[{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(XS,"derivePoints");l(or,"resolveConfig")});import{exec as QS}from"node:child_process";import ZS from"node:fs/promises";import Oo from"node:path";import{promisify as ek}from"node:util";async function Fo(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=ok(r),c=await ik(e),u=await ak(e),d=[];for(let p of c){if(!i&&lk(p))continue;let g=ck(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 ok(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 ik(r){let e=[];async function t(n,s=""){try{let o=await ZS.readdir(n,{withFileTypes:!0});for(let i of o){let a=Oo.join(n,i.name),c=Oo.join(s,i.name);if(i.isDirectory()){if(rk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Oo.extname(i.name).toLowerCase();sk.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function ak(r){let e=new Map;try{let{stdout:t}=await tk(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
439
443
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
440
444
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
441
445
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
442
446
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
443
|
-
`).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
|
|
447
|
+
`).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 ck(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(nk))for(let S of f)if(c.includes(S)&&e.some(A=>f.includes(A)||A.includes(g)||g.includes(A))){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=Oo.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 lk(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 tk,nk,sk,rk,gc=w(()=>{"use strict";F();tk=ek(QS),nk={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"]},sk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),rk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Fo,"findRelevantFiles");l(ok,"extractKeywords");l(ik,"getAllCodeFiles");l(ak,"getGitRecency");l(ck,"scoreFile");l(lk,"isTestFile")});import{exec as uk}from"node:child_process";import{promisify as dk}from"node:util";async function pp(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 gk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await mk(r,t);return o=o.filter(c=>!fk(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 mk(r,e){let{stdout:t}=await ir(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
444
448
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
445
449
|
NF {
|
|
446
450
|
count[$0]++
|
|
@@ -450,8 +454,8 @@ Recommendations:
|
|
|
450
454
|
for (f in count) print count[f], lastmod[f], f
|
|
451
455
|
}
|
|
452
456
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
453
|
-
`).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),
|
|
454
|
-
`).filter(Boolean),{stdout:i}=await
|
|
457
|
+
`).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),k=u/i,A=S*.6+k*.4,I;f<1?I="just now":f<24?I=`${f}h ago`:g<7?I=`${g}d ago`:g<30?I=`${Math.floor(g/7)}w ago`:I=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(A*100)/100,lastChanged:I,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function gk(r){let{stdout:e}=await ir("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await ir("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await ir(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
458
|
+
`).filter(Boolean),{stdout:i}=await ir(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
455
459
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
456
460
|
NF {
|
|
457
461
|
count[$0]++
|
|
@@ -461,10 +465,10 @@ Recommendations:
|
|
|
461
465
|
for (f in count) print count[f], lastmod[f], f
|
|
462
466
|
}
|
|
463
467
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
464
|
-
`).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),
|
|
465
|
-
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:
|
|
468
|
+
`).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],k=u-f,A=Math.floor(k/86400),I=Math.floor(k/3600),V=Math.max(0,1-A/14),ge=g/d,ke=V*.5+ge*.5,Ge;I<1?Ge="just now":I<24?Ge=`${I}h ago`:Ge=`${A}d ago`,a.push({path:S,changes:g,heatScore:Math.round(ke*100)/100,lastChanged:Ge,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function fk(r){let e=r.split("/").pop()||"";for(let t of pk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var ir,pk,mp=w(()=>{"use strict";ir=dk(uk),pk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(pp,"getRecentFiles");l(mk,"getHotFilesFromCommits");l(gk,"getBranchOnlyFiles");l(fk,"shouldIgnore")});function fc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function gp(r,e){let t=hk[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function wk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function hp(r,e){let t=fc(r),n=fc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=gp(s,yk),a=fp.map(c=>({model:c,...gp(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:wk(i.total),byModel:a}}}function hc(r){let e=fc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:fp.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var hk,yk,fp,yp=w(()=>{"use strict";hk={"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}},yk="claude-sonnet-4.5";l(fc,"countTokens");fp=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(gp,"calculateModelCost");l(wk,"formatCostSaved");l(hp,"measureCompression");l(hc,"noCompression")});import Sk from"node:fs/promises";import yc from"node:path";async function kp(r,e=process.cwd()){let t=yc.isAbsolute(r)?r:yc.join(e,r),n;try{n=await Sk.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:hc("")};throw u}let s=yc.extname(r).toLowerCase(),o=kk[s]||"unknown",i=vk[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:hc(n)};let a=xk(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
469
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:hp(n,c)}}function xk(r,e){let t=[],n=r.split(`
|
|
466
470
|
`),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(`
|
|
467
|
-
`).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:
|
|
471
|
+
`).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:Tk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Tk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var kk,wp,bk,Ck,Pk,Sp,vk,bp=w(()=>{"use strict";F();yp();kk={".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"},wp=[{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}],bk=[{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}],Ck=[{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}],Pk=[{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}],Sp=[{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}],vk={typescript:wp,javascript:wp,python:bk,go:Ck,rust:Pk,java:Sp,csharp:Sp,php:[],ruby:[],unknown:[]};l(kp,"extractSignatures");l(xk,"extractFromContent");l(Tk,"cleanSignature")});import{createHash as Ek}from"node:crypto";import vp from"node:fs/promises";import xp from"node:path";function Cp(r){return Ek("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Pp(r){try{let e=xp.join(r,"storage","classification-cache.json"),t=await vp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?zi:(console.warn("[classifier] Failed to load cache:",y(e)),zi)}}async function wc(r,e){try{let t=xp.join(r,"storage","classification-cache.json");await vp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function Dk(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>Ak?null:n.classification}function Ik(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Rk(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Tp(e),s=Vi("classification")||"",o=`Classify this software engineering task into a domain.
|
|
468
472
|
|
|
469
473
|
Task: "${r}"
|
|
470
474
|
|
|
@@ -472,19 +476,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
472
476
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
473
477
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
474
478
|
|
|
475
|
-
${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=Zt.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
|
|
476
|
-
`);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([
|
|
477
|
-
`).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
|
|
478
|
-
`)}_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`}},
|
|
479
|
-
`);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=
|
|
479
|
+
${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=Zt.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 $k(r,e){let t=Tp(e),n=new Map;for(let[p,g]of Object.entries(jk)){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 cu;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=Mk(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 Tp(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 Mk(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 Ak,jk,Sc,Ok,Ep,Ap=w(()=>{"use strict";Us();Mr();F();Ak=3600*1e3;l(Cp,"hashDescription");l(Pp,"loadCache");l(wc,"saveCache");l(Dk,"lookupCache");l(Ik,"lookupPatterns");l(Rk,"classifyWithLLM");jk={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($k,"classifyWithHeuristic");l(Tp,"buildAvailableDomains");l(Mk,"getFilePatterns");Sc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Cp(e),i=await Pp(n),a=Dk(i,o,t);if(a)return{classification:a,source:"cache"};let c=Ik(i,o);if(c)return{classification:c,source:"history"};let u=await Rk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await wc(n,i),{classification:u,source:"llm"};let d=$k(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await wc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Cp(e),o=await Pp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await wc(n,o))}},Ok=new Sc,Ep=Ok});import{exec as Fk}from"node:child_process";import ar from"node:fs/promises";import _k from"node:os";import An from"node:path";import{promisify as Nk}from"node:util";var Dp,Ip,kc,Lk,_o,bc=w(()=>{"use strict";mc();lt();le();Jn();_t();gc();mp();bp();F();En();Ap();es();Dp=Nk(Fk),Ip=["database","backend","frontend","testing","devops"],kc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await $.getProjectId(n),o=x.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((ke,Ge)=>{if(ke.status==="fulfilled")return ke.value;g.push(p[Ge]),console.warn(`Context tool "${p[Ge]}" failed: ${y(ke.reason)}`)}),[S,k,A]=f,I={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},V=this.shouldFragment(a,t),ge=null;return V&&e==="task"&&(ge=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:V,subtasks:ge,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:S,sealedAnalysis:k??null,velocityContext:A??null,contextDegradation:I}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Fo(e,t,{maxFiles:10,minScore:.15}),pp(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await kp(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(`
|
|
480
|
+
`);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([Dp("git branch --show-current",{cwd:e}),Dp("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
481
|
+
`).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 Be.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await nt.getAll(e);if(t.length===0)return null;let n=Mo(t,en);return n.sprints.length===0?null:dp(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=An.join(e,"analysis","repo-analysis.json"),n=await ar.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Ep.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=An.join(e,"agents");return(await ar.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=An.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=An.join(s,u);try{let m=await ar.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=zr(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=An.join(_k.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=An.join(t,`${i}.md`),c=An.join(t,i,"SKILL.md");try{let u=await ar.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await ar.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=Ip.indexOf(a),d=Ip.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Lk=new kc,_o=Lk});function Uk(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 Cc,Hk,Te,Rp=w(()=>{"use strict";vt();se();sn();sn();l(Uk,"generateApprovalPrompt");Cc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Pa.includes(e)}isDestructive(e){return va.includes(e)}isToolAllowedInPlanning(e){return ao.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>ao.includes(n)):t}startPlanning(e,t,n){let s={id:ie(),projectId:e,command:t,params:n,status:X.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[X.GATHERING,X.ANALYZING,X.PROPOSING,X.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===X.APPROVED?n.approvedAt=b():t===X.EXECUTING?n.executionStartedAt=b():(t===X.COMPLETED||t===X.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=X.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=X.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!==X.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=X.APPROVED,n.approvedAt=b(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=X.REJECTED,n.userFeedback=t,n.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==X.APPROVED?null:(t.status=X.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==X.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!==X.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=X.COMPLETED,t.completedAt=b();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=X.ABORTED,n.completedAt=b(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Uk(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[X.GATHERING]:"\u{1F50D}",[X.ANALYZING]:"\u{1F9E0}",[X.PROPOSING]:"\u{1F4DD}",[X.PENDING_APPROVAL]:"\u23F3",[X.APPROVED]:"\u2705",[X.EXECUTING]:"\u26A1",[X.COMPLETED]:"\u{1F389}",[X.REJECTED]:"\u274C",[X.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===X.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
482
|
+
`)}_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`}},Hk=new Cc,Te=Hk});function Gk(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return No[t]?No[t]:No[e]?No[e]:e}function Lo(r){let e=new Set,t=[];for(let n of r){let s=Gk(n);e.has(s)||(e.add(s),t.push(n))}return t}var No,Pc=w(()=>{"use strict";No={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(Gk,"normalizeFrameworkName");l(Lo,"deduplicateTechStack")});import{z as Ee}from"zod";function jp(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
483
|
+
`);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=Lo(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])=>zk[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(`
|
|
480
484
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
481
|
-
`)}var
|
|
482
|
-
`,"utf-8"),
|
|
483
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
485
|
+
`)}var M$,zk,$p=w(()=>{"use strict";Pc();M$=Ee.object({projectPath:Ee.string(),language:Ee.string().optional(),framework:Ee.string().optional(),techStack:Ee.array(Ee.string()).default([]),domains:Ee.object({hasFrontend:Ee.boolean().default(!1),hasBackend:Ee.boolean().default(!1),hasDatabase:Ee.boolean().default(!1),hasTesting:Ee.boolean().default(!1),hasDocker:Ee.boolean().default(!1)}).optional(),fileCount:Ee.number().optional(),availableAgents:Ee.array(Ee.string()).default([]),analysisLanguages:Ee.array(Ee.string()).default([]),analysisFrameworks:Ee.array(Ee.string()).default([]),analysisPackageManager:Ee.string().optional()}),zk={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(jp,"buildAntiHallucinationBlock")});import{z as It}from"zod";var Wk,Mp,Op=w(()=>{"use strict";Wk=It.object({agents:It.boolean(),patterns:It.boolean(),checklist:It.boolean(),modules:It.array(It.string())}),Mp=It.object({version:It.string(),description:It.string().optional(),commands:It.record(It.string(),Wk).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function vc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Fp(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=vc(o,Bk),a=vc(o,Vk),c=vc(o,Jk);return s.some(d=>qk.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 Bk,Vk,Jk,qk,_p=w(()=>{"use strict";Bk=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Vk=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Jk=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],qk=["Write","Edit","Bash"];l(vc,"countMatches");l(Fp,"classifyCommand")});import xc from"node:fs/promises";import Kk from"node:path";async function Lp(){if(cr)return cr;let r=await xc.readFile(Tc,"utf-8"),e=JSON.parse(r);return cr=Mp.parse(e),cr}function Yk(r){return Up.get(r)}function Xk(r,e){Up.set(r,e)}function Zk(r,e){let t=r,n=Np.get(t);return n&&tb(n.entry,e)?(n.count++,n.count>=Qk):(Np.set(t,{entry:e,count:1}),!1)}async function eb(r,e){let t=await xc.readFile(Tc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await xc.writeFile(Tc,`${JSON.stringify(n,null,2)}
|
|
486
|
+
`,"utf-8"),cr=null}function tb(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 Hp(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Yk(e);if(n)return{entry:n,source:"cache"};if(t){let s=Fp(e,t);return Xk(e,s),Zk(e,s)&&eb(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Tc,cr,Up,Np,Qk,Gp=w(()=>{"use strict";Op();tn();_p();Tc=Kk.join(xe,"core/config/command-context.config.json"),cr=null;l(Lp,"loadCommandContextConfig");Up=new Map;l(Yk,"getCachedClassification");l(Xk,"cacheClassification");Np=new Map,Qk=3;l(Zk,"trackClassification");l(eb,"persistClassification");l(tb,"isSameEntry");l(Hp,"resolveCommandContextFull")});import nb from"node:os";import{z as Ut}from"zod";function sb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function rb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function zp(r){let e=r.platform??nb.platform(),t=r.runtime??sb(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
487
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",rb(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
484
488
|
`)}
|
|
485
|
-
</env>`}var
|
|
486
|
-
... (truncated to ~${e} tokens)`}function
|
|
487
|
-
`);return
|
|
489
|
+
</env>`}var Y$,Wp=w(()=>{"use strict";Y$=Ut.object({projectName:Ut.string(),projectPath:Ut.string(),isGitRepo:Ut.boolean().default(!0),gitBranch:Ut.string().optional(),platform:Ut.string().optional(),runtime:Ut.string().optional(),date:Ut.string().optional(),model:Ut.string().optional(),provider:Ut.string().optional()});l(sb,"detectRuntime");l(rb,"normalizePlatform");l(zp,"buildEnvironmentBlock")});function Vp(r){let e=r.getAllocationFor("injection");return{...Ho,totalPrompt:e}}function Dn(r,e){let t=e*Jp;return r.length<=t?r:`${r.substring(0,t)}
|
|
490
|
+
... (truncated to ~${e} tokens)`}function Bp(r){return Math.ceil(r.length/Jp)}function qp(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=ob[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 Ho,Jp,ob,Uo,Kp=w(()=>{"use strict";Ho={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Vp,"budgetsFromCoordinator");Jp=4;l(Dn,"truncateToTokenBudget");l(Bp,"estimateTokens");ob={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(qp,"filterSkillsByDomains");Uo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ho,...e}}addSection(e,t){let n=Dn(e,t),s=Bp(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Dn(n,o);return this.used+=Bp(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 Yp from"node:fs/promises";import In from"node:path";var Ec,ib,Xp,Qp=w(()=>{"use strict";_t();F();_e();tn();rc();$p();Gp();Wp();Kp();Pc();es();Ec=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 M(e)){let s=await Yp.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){P(s)||console.error(`Template loading warning: ${y(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Vp(this._coordinator):Ho}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Ie(`global/modules/${e}`);if(t)return t;let n=In.join(xe,"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=Zn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=Ie(s);if(o){let i=In.basename(s,".md");t[i]=o}}}else{let s=In.join(xe,"templates","checklists");if(await M(s)){let o=(await Yp.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=In.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),fe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await ec.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
|
|
491
|
+
`);return Dn(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=In.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let C=await Lp();p=Hp(C,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
488
492
|
`),s.role&&d.push(`Role: ${s.role}
|
|
489
493
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
490
494
|
`),d.push(`
|
|
@@ -493,7 +497,7 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
493
497
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
494
498
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
495
499
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
496
|
-
`);let
|
|
500
|
+
`);let S=t.projectPath;if(S){let C=u?.project?.id?In.basename(S):In.basename(S),R=zp({projectName:C,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
497
501
|
${R}
|
|
498
502
|
`)}if(u){let C=u.sealedAnalysis;if(d.push(`
|
|
499
503
|
## PROJECT ANALYSIS (Sealed)
|
|
@@ -514,13 +518,13 @@ ${R}
|
|
|
514
518
|
### Anti-Patterns (Avoid These)
|
|
515
519
|
`);for(let R of C.antiPatterns)d.push(`- **${R.issue}** in \`${R.file}\` \u2014 ${R.suggestion}
|
|
516
520
|
`)}}d.push(`
|
|
517
|
-
`)}let
|
|
521
|
+
`)}let k=p.patterns,A=n?.codePatterns||"";if(k&&A&&A.trim()){let C=this.extractPatternSummary(A);C&&(d.push(`## CODE PATTERNS
|
|
518
522
|
`),d.push(C),d.push(`
|
|
519
523
|
Full patterns: Read analysis/patterns.md
|
|
520
|
-
`))}let
|
|
524
|
+
`))}let I=n?.analysis||"";if(k&&I&&I.trim()){let C=I.match(/Stack[:\s]+([^\n]+)/i)||I.match(/Technology[:\s]+([^\n]+)/i),R=C?C[1].trim():"detected";d.push(`
|
|
521
525
|
## STACK
|
|
522
526
|
Stack: ${R}
|
|
523
|
-
`),
|
|
527
|
+
`),A||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
524
528
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
525
529
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
526
530
|
|
|
@@ -528,14 +532,14 @@ Stack: ${R}
|
|
|
528
532
|
`),R.effort&&d.push(`Effort: ${R.effort}
|
|
529
533
|
`),R.model&&d.push(`Model: ${R.model}
|
|
530
534
|
`),R.skills.length>0&&d.push(`Skills: ${R.skills.join(", ")}
|
|
531
|
-
`);let be=
|
|
535
|
+
`);let be=Dn(R.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
532
536
|
${be}
|
|
533
537
|
\`\`\`
|
|
534
538
|
|
|
535
|
-
`)}}let C=
|
|
539
|
+
`)}}let C=qp(u.skills,u.detectedDomains);if(C.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
536
540
|
|
|
537
541
|
`);for(let R of C){d.push(`#### Skill: ${R.name}
|
|
538
|
-
`);let be=
|
|
542
|
+
`);let be=Dn(R.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
539
543
|
${be}
|
|
540
544
|
\`\`\`
|
|
541
545
|
|
|
@@ -547,8 +551,8 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
|
|
|
547
551
|
`)),c?.requiresApproval&&d.push(`
|
|
548
552
|
## APPROVAL REQUIRED
|
|
549
553
|
Show changes, list affected files, ask for confirmation.
|
|
550
|
-
`),
|
|
551
|
-
${
|
|
554
|
+
`),S){let C=u?.sealedAnalysis,R=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],be={projectPath:S,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:Lo(R),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Hn=>Hn.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
|
|
555
|
+
${jp(be)}
|
|
552
556
|
`)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
|
|
553
557
|
### CONTEXT DEGRADATION NOTICE
|
|
554
558
|
|
|
@@ -574,17 +578,17 @@ ${R.content}
|
|
|
574
578
|
`);d.push(`
|
|
575
579
|
`)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let R=C.recentFiles.slice(0,5).map(be=>`${be.path} (${be.lastChanged})`).join(", ");d.push(`${R}
|
|
576
580
|
|
|
577
|
-
`)}}let
|
|
578
|
-
## FILES: ${
|
|
581
|
+
`)}}let ge=t.files||[];if(ge.length>0){let C=ge.slice(0,5).join(", ");d.push(`
|
|
582
|
+
## FILES: ${ge.length} available. Top: ${C}
|
|
579
583
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
580
584
|
|
|
581
|
-
`)}else
|
|
582
|
-
## PROJECT: ${
|
|
585
|
+
`)}else S&&d.push(`
|
|
586
|
+
## PROJECT: ${S}
|
|
583
587
|
Read files before modifying.
|
|
584
588
|
|
|
585
|
-
`);let
|
|
589
|
+
`);let ke=this.filterRelevantState(n);if(ke&&(d.push(`
|
|
586
590
|
## PRJCT STATE (Project Management Data)
|
|
587
|
-
`),d.push(
|
|
591
|
+
`),d.push(ke),d.push(`
|
|
588
592
|
`)),u?.velocityContext&&(d.push(`
|
|
589
593
|
### VELOCITY (Historical Estimation Data)
|
|
590
594
|
|
|
@@ -630,7 +634,7 @@ Read files before modifying.
|
|
|
630
634
|
**Context for this subtask:**
|
|
631
635
|
${R.outputForNextAgent}
|
|
632
636
|
`)}d.push(`
|
|
633
|
-
`)}let Ge=this.getSchemaTypeForCommand(m);if(Ge){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(
|
|
637
|
+
`)}let Ge=this.getSchemaTypeForCommand(m);if(Ge){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(Mr(),yu)),R=C(Ge);R&&d.push(`
|
|
634
638
|
${R}
|
|
635
639
|
`)}if(p.checklist){let C=await this.loadChecklistRouting(),R=await this.loadChecklists();C&&Object.keys(R).length>0&&(d.push(`
|
|
636
640
|
## QUALITY CHECKLISTS
|
|
@@ -638,7 +642,7 @@ ${R}
|
|
|
638
642
|
`),d.push(`Available: ${Object.keys(R).join(", ")}
|
|
639
643
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
640
644
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
641
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new
|
|
645
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Uo({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}
|
|
642
646
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
643
647
|
|
|
644
648
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -655,7 +659,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
655
659
|
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
656
660
|
Avoid:
|
|
657
661
|
${a}`)}let o=t.join(`
|
|
658
|
-
`);return
|
|
662
|
+
`);return Dn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
659
663
|
## RULES (CRITICAL)
|
|
660
664
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
661
665
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -672,7 +676,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
672
676
|
- Prefer structured output (JSON) over free text when applicable.
|
|
673
677
|
|
|
674
678
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
675
|
-
`}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}}}},
|
|
679
|
+
`}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}}}},ib=new Ec,Xp=ib});import Zp from"node:fs/promises";import yt from"node:path";var ab,cb,Ac,Dc,Go,Ic=w(()=>{"use strict";lt();le();F();ab=["task","done","ship","resume","bug","enrich"],cb=["init","sync","pause","next","dash","history","undo","redo"],Ac=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return yt.dirname(Ds.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(Qe(),ft(at)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=yt.join(u,"templates")}catch{c=yt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:yt.join(c,"agentic","orchestrator.md"),agentRouting:yt.join(c,"agentic","agent-routing.md"),taskFragmentation:yt.join(c,"agentic","task-fragmentation.md"),commandTemplate:yt.join(c,"commands",`${e}.md`),repoAnalysis:yt.join(o,"analysis","repo-analysis.json"),agentsDir:yt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:yt.join(o,"storage","state.json")}}}requiresOrchestration(e){return ab.includes(e)?!0:!cb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=yt.join(x.getGlobalProjectPath(t),"agents");return(await Zp.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=yt.join(x.getGlobalProjectPath(t),"agents");return(await Zp.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
676
680
|
## Agentic Execution Mode
|
|
677
681
|
|
|
678
682
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -755,13 +759,13 @@ When fragmenting tasks:
|
|
|
755
759
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
756
760
|
3. Each completed subtask generates a summary
|
|
757
761
|
4. Pass summary to next agent for context handoff
|
|
758
|
-
`,context:e,requiresOrchestration:t}}},
|
|
762
|
+
`,context:e,requiresOrchestration:t}}},Dc=new Ac,Go=Dc});import{exec as lb}from"node:child_process";import em from"node:fs/promises";import{promisify as ub}from"node:util";var db,Rn,Fe,Rc=w(()=>{"use strict";qr();db=ub(lb),Rn={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())}};Rn.register("Read",async r=>{try{return await Ws.execute(async()=>await em.readFile(r,"utf-8"),`read-${r}`)}catch(e){return Jr(e)||zs(e),null}});Rn.register("Write",async(r,e)=>{try{return await Ws.execute(async()=>await em.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return Jr(t)||zs(t),!1}});Rn.register("Bash",async r=>{try{return await Ws.execute(async()=>await db(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Rn.register("GetTimestamp",async()=>new Date().toISOString());Rn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Rn.register("GetDateTime",async()=>new Date().toISOString());Fe=Rn});import jc from"node:fs/promises";import pb from"node:os";import tm from"node:path";async function mb(r){try{let e=tm.dirname(zo);await M(e)||await jc.mkdir(e,{recursive:!0}),await jc.writeFile(zo,`/p:${r}`)}catch{}}async function gb(){try{await M(zo)&&await jc.unlink(zo)}catch{}}var zo,$c,fb,Wo,Mc=w(()=>{"use strict";F();zd();_e();Vd();qd();ac();ap();cp();qn();bc();Rp();Qp();Ic();es();Rc();zo=tm.join(pb.homedir(),".prjct-cli",".running");l(mb,"signalStart");l(gb,"signalEnd");$c=class{static{l(this,"CommandExecutor")}async signalStart(e){await mb(e)}async signalEnd(){await gb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ls.shouldEscalate(e,s)){let o=ls.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await oa.load(e),i=await st.build(n,t),a=Te.requiresPlanning(e),c=Te.isDestructive(e),u=Te.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Te.startPlanning(i.projectId,e,t):u&&(d=Te.getActivePlan(i.projectId));let m=null;if($o.requiresVerification(e)){let C=await st.loadStateForCommand(i,e);m=await $o.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log($o.formatWarnings(m))}let p=null;if(jo.requiresReasoning(e)){let C=await st.loadStateForCommand(i,e);p=await jo.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(jo.formatPlan(p)))}let g=t.task||t.description||"",f=await Go.buildContext(e,g,n),S=Go.buildAgenticPrompt(f),k=null;if(Go.requiresOrchestration(e)&&g)try{k=await _o.execute(e,g,n),k.detectedDomains.length>0&&Ro.orchestrate(k.detectedDomains);for(let C of k.agents){let R=C.domain||C.name.replace(".md","");Ro.startAgent(C.name,R,`Loading ${R} specialist...`),Ro.endAgent(!0)}if(k.requiresFragmentation&&k.subtasks){let C=k.subtasks.map(R=>({id:R.id,domain:R.domain,description:R.description,status:R.status}));Bd(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let A={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},I=await st.loadState(i),V=null,ge=null;i.projectId&&(V={commit_footer:await ve.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ve.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ve.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ve.getSmartDecision(i.projectId,`preferred_agent_${e}`)},ge=await ve.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let ke={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Te.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ge=await Xp.build(o,A,I,null,V,null,ge,ke,k);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ls.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:A,state:I,prompt:Ge,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:A.agentsPath,agentRoutingPath:A.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:V,relevantMemories:ge,orchestratorContext:k,memory:{create:l(C=>ve.createMemory(i.projectId,C),"create"),autoRemember:l((C,R,be)=>ve.autoRemember(i.projectId,C,R,be),"autoRemember"),search:l(C=>ve.searchMemories(i.projectId,C),"search"),findByTags:l(C=>ve.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>ve.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Te.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Te.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Te.proposePlan(i.projectId,C),"propose"),approve:l(C=>Te.approvePlan(i.projectId,C),"approve"),reject:l(C=>Te.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Te.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Te.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Te.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Te.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Te.failStep(i.projectId,C),"failStep"),abort:l(C=>Te.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Te.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Te.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ls.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=ls.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Fe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Fe.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await oa.load(e)).frontmatter["allowed-tools"]||[],i=await st.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},fb=new $c,Wo=fb});import Bo from"node:fs/promises";import hb from"node:https";import yb from"node:os";import Oc from"node:path";import Rt from"chalk";var Fc,nm,sm=w(()=>{"use strict";F();_e();Fc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Oc.join(yb.homedir(),".prjct-cli","config"),this.cacheFile=Oc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Oc.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=hb.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 M(this.cacheFile))return JSON.parse(await Bo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await Bo.mkdir(this.cacheDir,{recursive:!0}),await Bo.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:`
|
|
759
763
|
`+Rt.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")+`
|
|
760
764
|
`+Rt.yellow("\u2502")+" "+Rt.bold("Update available!")+" "+Rt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Rt.yellow("\u2502")+`
|
|
761
765
|
`+Rt.yellow("\u2502")+" "+Rt.yellow("\u2502")+`
|
|
762
766
|
`+Rt.yellow("\u2502")+" Run: "+Rt.cyan("npm update -g prjct-cli")+" "+Rt.yellow("\u2502")+`
|
|
763
767
|
`+Rt.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")+`
|
|
764
|
-
`}},
|
|
768
|
+
`}},nm=Fc});var de,Je=w(()=>{"use strict";Mc();ac();Rc();lt();le();sm();ln();se();_e();Cn();de=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new nm,this.updateNotificationShown=!1,this.commandExecutor=Wo}get agent(){return ns.getAgent()}get agentInfo(){return ns.getInfo()}get currentAuthor(){return cn.getCurrentAuthor()}async initializeAgent(){return ns.initialize()}async ensureProjectInit(e){return cn.ensureInit(e)}async ensureAuthor(){return cn.ensureAuthor()}async getGlobalProjectPath(e){return cn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Ze.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return cn.isEmptyDirectory(e)}async _detectExistingCode(e){return cn.hasExistingCode(e)}_breakdownFeatureTasks(e){return no.breakdownFeature(e)}_detectBugSeverity(e){return no.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ns.assignForTask(e,t,n)}}});var rm={};Gn(rm,{PlanningCommands:()=>$n});import jn from"node:path";async function wb(){if(!_c){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Jo(),om));_c=new r}return _c}var _c,$n,Vo=w(()=>{"use strict";Yr();wn();vt();_t();F();is();as();rc();Je();_c=null;l(wb,"getAnalysisCommands");$n=class extends de{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await $.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new cs(t).runNonInteractive());else if(a=await new cs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ts(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m),g={"core/now.md":`# NOW
|
|
765
769
|
|
|
766
770
|
No current task. Use \`/p:now\` to set focus.
|
|
767
771
|
`,"core/next.md":`# NEXT
|
|
@@ -781,16 +785,16 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
781
785
|
`,"planning/roadmap.md":`# ROADMAP
|
|
782
786
|
|
|
783
787
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
784
|
-
`,"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[I
|
|
788
|
+
`,"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[A,I]of Object.entries(g))await Fe.get("Write")(jn.join(p,A),I);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let A=await wb();if((await A.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await A.sync(t,{aiTools:a.agents}):await A.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let k=n.idea;if(f&&!S){if(!k)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 A=jn.join(p,"planning","architect-session.md"),I=`# Architect Session
|
|
785
789
|
|
|
786
790
|
## Idea
|
|
787
|
-
${
|
|
791
|
+
${k}
|
|
788
792
|
|
|
789
793
|
## Status
|
|
790
794
|
Initialized - awaiting stack recommendation
|
|
791
795
|
|
|
792
796
|
Generated: ${new Date().toLocaleString()}
|
|
793
|
-
`;return await Fe.get("Write")(I
|
|
797
|
+
`;return await Fe.get("Write")(A,I),await We.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:k,wizard:a}}return await We.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await st.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ie(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await fe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:U.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await st.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await fe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:U.getTimestamp()}),n.md?console.log(q(je("Bug Reported",e),pt({Severity:a,Priority:m,Agent:u}),he([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),mt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
794
798
|
`);let s=await this.getGlobalProjectPath(t),o=jn.join(s,"planning","architect-session.md"),i;try{i=await re.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
795
799
|
|
|
796
800
|
Create a plan first:
|
|
@@ -812,7 +816,7 @@ The architect plan is ready. Claude will now:
|
|
|
812
816
|
4. Create starter files with boilerplate
|
|
813
817
|
`),console.log(`
|
|
814
818
|
\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.
|
|
815
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:U.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=
|
|
819
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:U.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=x.getGlobalProjectPath(o),u=jn.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
816
820
|
|
|
817
821
|
## Idea
|
|
818
822
|
${e}
|
|
@@ -827,14 +831,14 @@ Initialized - awaiting architecture design
|
|
|
827
831
|
4. Generate roadmap
|
|
828
832
|
|
|
829
833
|
Generated: ${new Date().toLocaleString()}
|
|
830
|
-
`;return await Fe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(
|
|
834
|
+
`;return await Fe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(q(je("Idea Captured",e),pt({Mode:"architecture"}),he([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
831
835
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
832
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Le.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(
|
|
836
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Le.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),n.md?console.log(q(je("Idea Captured",e),pt({Mode:"capture"}),he([{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)}`),mt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(y(s)),{success:!1,error:y(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=x.getGlobalProjectPath(s),m=jn.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(`
|
|
833
837
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
834
838
|
`),{success:!0,specs:[]}):(console.log(`
|
|
835
839
|
\u{1F4CB} SPECIFICATIONS
|
|
836
|
-
`),console.log("\u2550".repeat(50)),f.forEach((k
|
|
837
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=
|
|
840
|
+
`),console.log("\u2550".repeat(50)),f.forEach((S,k)=>{let A=S.replace(".md","").replace(/-/g," ");console.log(` ${k+1}. ${A}`)}),console.log(`${"\u2550".repeat(50)}
|
|
841
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=jn.join(o,"planning","specs");await re.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=jn.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
838
842
|
|
|
839
843
|
## Overview
|
|
840
844
|
[Brief description of the feature]
|
|
@@ -866,26 +870,26 @@ Created: ${new Date().toLocaleString()}
|
|
|
866
870
|
Status: Draft
|
|
867
871
|
`;return await Fe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:U.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
868
872
|
\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
|
|
869
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var
|
|
873
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var qo,cn,im=w(()=>{"use strict";Wt();Yr();lt();le();F();_e();Cn();qo=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Vo(),rm)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Nr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await x.ensureProjectStructure(t),x.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ts();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 Vn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Vn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},cn=new qo});var Sb,am,cm,Nc,lm,um=w(()=>{"use strict";ae();se();Sb=1800*1e3,am=50,cm=200,Nc=class{static{l(this,"SessionTracker")}async read(e){try{return D.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){D.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Sb}}}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>am&&(s.current.commands=s.current.commands.slice(-am)),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>cm&&(s.current.files=s.current.files.slice(-cm)),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:zt(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:zt(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}},lm=new Nc});import{exec as kb}from"node:child_process";import{promisify as bb}from"node:util";var Lc,Cb,Ko,lr,dm=w(()=>{"use strict";ae();F();um();Lc=bb(kb),Cb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ko=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Cb,...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=D.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 Lc("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([Lc(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Lc(`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(`
|
|
870
874
|
`).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${y(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
871
|
-
`)}async getSessionInfo(e){return
|
|
875
|
+
`)}async getSessionInfo(e){return lm.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
872
876
|
`);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(`
|
|
873
|
-
`)}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}},
|
|
874
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
875
|
-
`)}function
|
|
876
|
-
`)}function
|
|
877
|
+
`)}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}},lr=l((r,e)=>new Ko(r,e),"createStalenessChecker")});import pm from"node:fs/promises";import Yo from"node:path";function ur(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 Tb(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ur(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(...ur(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(...ur(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(...ur(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ur(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&&!vb.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function mm(r,e){let t=[],n=await pm.readdir(r,{withFileTypes:!0});for(let s of n){if(xb.has(s.name))continue;let o=Yo.join(r,s.name);if(s.isDirectory())t.push(...await mm(o,e));else if(s.isFile()){let i=Yo.extname(s.name).toLowerCase();Pb.has(i)&&t.push(Yo.relative(e,o))}}return t}async function Eb(r){let e=await mm(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 pm.readFile(Yo.join(r,d),"utf-8"),p=Tb(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 Db(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]))};G.setDoc(r,Ab,t)}async function gm(r,e){let t=await Eb(r);return Db(e,t),t}var Pb,vb,xb,Ab,fm=w(()=>{"use strict";ae();Pb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),vb=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"]),xb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ur,"splitIdentifier");l(Tb,"tokenizeFile");l(mm,"listFiles");l(Eb,"buildIndex");Ab="bm25-index";l(Db,"saveIndex");l(gm,"indexProject")});import Uc from"node:fs/promises";import Bt from"node:path";function Mb(r){let e=[],t,n=new RegExp($b.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Ob(r,e,t){let n;if(r.startsWith("@/"))n=Bt.join(t,"src",r.slice(2));else{let s=Bt.dirname(Bt.join(t,e));n=Bt.resolve(s,r)}for(let s of jb){let o=n+s;try{if((await Uc.stat(o)).isFile())return Bt.relative(t,o)}catch{}}return null}async function hm(r,e){let t=[],n=await Uc.readdir(r,{withFileTypes:!0});for(let s of n){if(Rb.has(s.name))continue;let o=Bt.join(r,s.name);if(s.isDirectory())t.push(...await hm(o,e));else if(s.isFile()){let i=Bt.extname(s.name).toLowerCase();Ib.has(i)&&t.push(Bt.relative(e,o))}}return t}async function Fb(r){let e=await hm(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 Uc.readFile(Bt.join(r,u),"utf-8"),m=Mb(d),p=[];for(let g of m){let f=await Ob(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 _b(r,e){G.setDoc(r,ym,e)}function wm(r){return G.getDoc(r,ym)}async function Sm(r,e){let t=await Fb(r);return _b(e,t),t}var Ib,Rb,jb,$b,ym,Hc=w(()=>{"use strict";ae();Ib=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Rb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),jb=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],$b=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Mb,"extractImportSources");l(Ob,"resolveImport");l(hm,"listFiles");l(Fb,"buildGraph");ym="import-graph";l(_b,"saveGraph");l(wm,"loadGraph");l(Sm,"indexImports")});function km(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=wm(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 bm(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 Cm=w(()=>{"use strict";Hc();l(km,"propagateChanges");l(bm,"affectedDomains")});import Gc from"node:fs/promises";import Xo from"node:path";async function Pm(r,e){let t=[],n=await Gc.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Lb.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Xo.join(r,o);if(s.isDirectory())t.push(...await Pm(i,e));else if(s.isFile()){let a=Xo.extname(o).toLowerCase();Nb.has(a)&&t.push(Xo.relative(e,i))}}return t}function Ub(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 Hb(r){let e=await Pm(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=Xo.join(r,a),[u,d]=await Promise.all([Gc.readFile(c,"utf-8"),Gc.stat(c)]);return{path:a,hash:Ub(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 Gb(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 zc(r,e){let t=G.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)})(),G.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function zb(r){let e=new Map;try{let t=G.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 Wc(r,e){let[t,n]=await Promise.all([Hb(r),Promise.resolve(zb(e))]);return{diff:Gb(t,n),currentHashes:t}}function vm(r){return G.hasDoc(r,"file-hashes-meta")}var Nb,Lb,xm=w(()=>{"use strict";ae();Nb=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Lb=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Pm,"listProjectFiles");l(Ub,"hashContent");l(Hb,"computeHashes");l(Gb,"diffHashes");l(zc,"saveHashes");l(zb,"loadHashes");l(Wc,"detectChanges");l(vm,"hasHashRegistry")});import{exec as Wb}from"node:child_process";import{promisify as Bb}from"node:util";async function qb(r,e=100){try{let{stdout:t}=await Vb(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
878
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Em&&n.push(s),s=new Set):i&&s&&Kb(i)&&s.add(i)}return s&&s.size>0&&s.size<=Em&&n.push(s),n}catch{return[]}}function Kb(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 Yb(r,e=100){let t=await qb(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=Xb(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<Tm||m<Tm)continue;let p=d+m-a,g=p>0?a/p:0;g<Jb||(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 Xb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Zb(r,e){G.setDoc(r,Qb,e)}async function Am(r,e,t=100){let n=await Yb(r,t);return Zb(e,n),n}var Vb,Jb,Tm,Em,Qb,Dm=w(()=>{"use strict";ae();Vb=Bb(Wb),Jb=.1,Tm=2,Em=30;l(qb,"parseGitLog");l(Kb,"isSourceFile");l(Yb,"buildMatrix");l(Xb,"pairKey");Qb="cochange-index";l(Zb,"saveMatrix");l(Am,"indexCoChanges")});function wt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function Mn(){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 Bc=w(()=>{"use strict";l(wt,"cite");l(Mn,"defaultSources")});function dr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
|
|
879
|
+
`)}function pr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
|
|
880
|
+
`)}function Im(r){let e=[];return r.packageManager&&e.push(`- Package Manager: \`${r.packageManager}\``),r.sourceDir&&e.push(`- Source: \`${r.sourceDir}/\``),r.testDir&&e.push(`- Tests: \`${r.testDir}/\``),e.length>0?`
|
|
877
881
|
### Project Structure
|
|
878
882
|
|
|
879
883
|
${e.join(`
|
|
880
884
|
`)}
|
|
881
|
-
`:""}function
|
|
885
|
+
`:""}function eC(r){let e=[];return r.patterns?.length>0&&e.push(`
|
|
882
886
|
### Code Patterns (Follow These)
|
|
883
887
|
|
|
884
|
-
${
|
|
888
|
+
${dr(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
|
|
885
889
|
### Anti-Patterns (Avoid These)
|
|
886
890
|
|
|
887
|
-
${
|
|
888
|
-
`)}function
|
|
891
|
+
${pr(r.antiPatterns)}`),e.push(Im(r)),e.join(`
|
|
892
|
+
`)}function tC(r,e){let t=r.sources||Mn();return`# ${r.name} - Project Rules
|
|
889
893
|
<!-- projectId: ${r.projectId} -->
|
|
890
894
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
891
895
|
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
@@ -914,7 +918,7 @@ ${wt(t.languages)}
|
|
|
914
918
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
915
919
|
${wt(t.frameworks)}
|
|
916
920
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
917
|
-
${r.analysis?
|
|
921
|
+
${r.analysis?eC(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
|
|
918
922
|
---
|
|
919
923
|
|
|
920
924
|
## PRJCT RULES
|
|
@@ -958,13 +962,13 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
958
962
|
|
|
959
963
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
960
964
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
961
|
-
`}function
|
|
962
|
-
`)}function
|
|
963
|
-
`)}function
|
|
964
|
-
`)}function
|
|
965
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function
|
|
966
|
-
`)}function
|
|
967
|
-
`)}}
|
|
965
|
+
`}function nC(r,e){let t=r.sources||Mn(),n=[];if(n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(wt(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(wt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(dr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(pr(r.analysis.antiPatterns)),n.push(""));let s=Im(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
966
|
+
`)}function sC(r,e){let t=r.sources||Mn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(wt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(dr(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(pr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(wt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
967
|
+
`)}function rC(r,e){let t=r.sources||Mn(),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(wt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(wt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(dr(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(pr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
968
|
+
`)}function oC(r,e){let t=[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
|
|
969
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function iC(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(dr(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(pr(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
|
|
970
|
+
`)}function Rm(r){return{claude:tC,cursor:nC,copilot:sC,windsurf:rC,continue:oC,codex:iC}[r]||null}var Vc=w(()=>{"use strict";Bc();l(dr,"formatPatterns");l(pr,"formatAntiPatterns");l(Im,"formatStructure");l(eC,"formatAnalysisForClaude");l(tC,"formatForClaude");l(nC,"formatForCursor");l(sC,"formatForCopilot");l(rC,"formatForWindsurf");l(oC,"formatForContinue");l(iC,"formatForCodex");l(Rm,"getFormatter")});import{exec as aC}from"node:child_process";import cC from"node:os";import us from"node:path";import{promisify as lC}from"node:util";function jm(r){return Zo[r]||null}async function Qo(r){try{return await uC(`which ${r}`),!0}catch{return!1}}async function ei(r=process.cwd()){let e=[];return await Qo("claude")&&e.push("claude"),(await Qo("cursor")||await M(us.join(r,".cursor")))&&e.push("cursor"),await M(us.join(r,".github"))&&e.push("copilot"),(await Qo("windsurf")||await M(us.join(r,".windsurf")))&&e.push("windsurf"),(await M(us.join(r,".continue"))||await M(us.join(cC.homedir(),".continue")))&&e.push("continue"),(await Qo("codex")||await M(us.join(r,".agents")))&&e.push("codex"),e}async function $m(r,e=process.cwd()){if(r==="auto"){let t=await ei(e);return t.length>0?t:["claude"]}return r==="all"?dC:r.filter(t=>Zo[t])}var uC,Zo,mr,dC,Jc=w(()=>{"use strict";_e();uC=lC(aC),Zo={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},mr=["claude"],dC=Object.keys(Zo);l(jm,"getAIToolConfig");l(Qo,"commandExists");l(ei,"detectInstalledTools");l($m,"resolveToolIds")});import qc from"node:fs/promises";import Kc from"node:path";async function Mm(r,e,t,n=mr){let s=[];for(let o of n){let i=jm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await pC(r,i,e,t);s.push(a)}return s}async function pC(r,e,t,n){let s=Rm(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=Kc.join(n,e.outputFile):i=Kc.join(t,"context",e.outputFile),await qc.mkdir(Kc.dirname(i),{recursive:!0});try{let a=await qc.readFile(i,"utf-8"),c=ua(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=la(o,a)}catch{}return await qc.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:y(o)}}}var Om=w(()=>{"use strict";F();da();Vc();Jc();l(Mm,"generateAIToolContexts");l(pC,"generateForTool")});var Fm=w(()=>{"use strict";Vc();Om();Jc()});import gr from"node:fs/promises";import fr from"node:path";var Yc,_m,Xc,Nm,Lm=w(()=>{"use strict";F();Yc=".prjct/.prjct-state.md",_m=".prjct-state.md",Xc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=fr.join(e,Yc);await gr.mkdir(fr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await gr.writeFile(n,s,"utf-8");try{let o=fr.join(e,_m);await gr.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[Yc,_m])try{await gr.unlink(fr.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=fr.join(e,Yc);try{return await gr.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(`
|
|
971
|
+
`)}},Nm=new Xc});import Qc from"node:fs/promises";import mC from"node:os";import Um from"node:path";function Zc(){return Um.join(mC.homedir(),".prjct-cli","skills",gC)}function fC(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function hr(){try{let r=await Qc.readFile(Zc(),"utf-8");return JSON.parse(r)}catch{return fC()}}async function el(r){let e=Zc();await Qc.mkdir(Um.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Qc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function hC(r){let e=await hr();e.skills[r.name]=r,await el(e)}async function yC(r){let e=await hr();return r in e.skills?(delete e.skills[r],await el(e),!0):!1}async function wC(r){return(await hr()).skills[r]||null}async function SC(){return(await hr()).skills}function kC(){return Zc()}var gC,yr,Hm=w(()=>{"use strict";gC=".skill-lock.json";l(Zc,"getLockFilePath");l(fC,"createEmptyLockFile");l(hr,"read");l(el,"write");l(hC,"addEntry");l(yC,"removeEntry");l(wC,"getEntry");l(SC,"getAll");l(kC,"getPath");yr={read:hr,write:el,addEntry:hC,removeEntry:yC,getEntry:wC,getAll:SC,getPath:kC}});import{exec as bC}from"node:child_process";import Vt from"node:fs/promises";import nl from"node:os";import qe from"node:path";import{promisify as CC}from"node:util";import{glob as Gm}from"glob";function Wm(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?qe.join(nl.homedir(),r.slice(1)):qe.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 Bm(r){let e=[];try{let s=qe.join(r,"SKILL.md");await Vt.access(s);let o=qe.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Gm("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=qe.basename(qe.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Gm("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=qe.basename(qe.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function PC(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()}
|
|
968
972
|
${s.join(`
|
|
969
973
|
`)}`;return r.replace(o,`---
|
|
970
974
|
${c}
|
|
@@ -973,10 +977,10 @@ ${s.join(`
|
|
|
973
977
|
`)}
|
|
974
978
|
---
|
|
975
979
|
|
|
976
|
-
${r}`}function
|
|
980
|
+
${r}`}function sl(){return qe.join(nl.homedir(),".claude","skills")}async function tl(r,e,t,n){let s=sl(),o=qe.join(s,e),i=qe.join(o,"SKILL.md"),a=await Vt.readFile(r,"utf-8"),c=PC(a,t,n);return await Vt.mkdir(o,{recursive:!0}),await Vt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function vC(r){let e={installed:[],skipped:[],errors:[]};if(!go.isAvailable("git")){let n=go.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=qe.join(nl.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await zm(`git clone --depth 1 ${n} ${t}`,{timeout:co("GIT_CLONE")});let s;try{let{stdout:a}=await zm("git rev-parse HEAD",{cwd:t,timeout:co("TOOL_CHECK")});s=a.trim()}catch{}let o=await Bm(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 tl(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 yr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await Vt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function xC(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await Vt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await Vt.stat(t)).isFile()){let s=qe.basename(qe.dirname(t));try{let o=await tl(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await yr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Bm(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 tl(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await yr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function TC(r){let e=sl(),t=qe.join(e,r);try{await Vt.rm(t,{recursive:!0,force:!0})}catch{}let n=qe.join(e,`${r}.md`);try{await Vt.rm(n,{force:!0})}catch{}return yr.removeEntry(r)}async function EC(r){let e=Wm(r);switch(e.type){case"github":return vC(e);case"local":return xC(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var zm,Vm,Jm=w(()=>{"use strict";F();sn();Aa();Hm();zm=CC(bC);l(Wm,"parseSource");l(Bm,"discoverSkills");l(PC,"injectSourceMetadata");l(sl,"getInstallDir");l(tl,"installSkillFile");l(vC,"installFromGitHub");l(xC,"installFromLocal");l(TC,"remove");l(EC,"install");Vm={install:EC,remove:TC,parseSource:Wm,getInstallDir:sl}});import St from"node:fs/promises";import AC from"node:os";import gt from"node:path";async function qm(r,e,t,n){let s=[],o=gt.join(r,"agents");try{let c=await St.readdir(o);for(let u of c)u.endsWith(".md")&&await St.unlink(gt.join(o,u))}catch(c){B.debug("Failed to purge old agents",{path:o,error:Y(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>DC(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=>IC(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 Km(r){let e=gt.join(r,"agents"),t=[];try{let n=await St.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 Ym(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=Ie(`subagents/${o}.md`);if(!i){let a=gt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await St.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 DC(r,e){let t="";try{let n=gt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await St.readFile(n,"utf-8"),t=await Ym(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:Y(n)}),t=jC(r)}await St.writeFile(gt.join(e,`${r}.md`),t,"utf-8")}async function IC(r,e,t,n,s){let o="";try{let i=gt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await St.readFile(i,"utf-8"),o=await Ym(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){B.debug("Domain agent template not found, generating minimal",{name:r,error:Y(i)}),o=$C(r,t,n)}o=RC(o,r,s),await St.writeFile(gt.join(e,`${r}.md`),o,"utf-8")}function RC(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=[`
|
|
977
981
|
## Recent Learnings (from completed tasks)
|
|
978
982
|
`];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(`
|
|
979
|
-
`)}function
|
|
983
|
+
`)}function jC(r){return`---
|
|
980
984
|
name: ${r}
|
|
981
985
|
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"}
|
|
982
986
|
tools: Read, Write, Glob
|
|
@@ -992,7 +996,7 @@ When invoked:
|
|
|
992
996
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
993
997
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
994
998
|
3. Execute requested operation
|
|
995
|
-
`}function
|
|
999
|
+
`}function $C(r,e,t){return`---
|
|
996
1000
|
name: ${r}
|
|
997
1001
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
998
1002
|
tools: Read, Write, Glob, Grep
|
|
@@ -1012,17 +1016,17 @@ Domain specialist for ${r} tasks.
|
|
|
1012
1016
|
## Your Role
|
|
1013
1017
|
|
|
1014
1018
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1015
|
-
`}function
|
|
1019
|
+
`}function Xm(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return St.writeFile(gt.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{B.debug("Failed to write skills.json",{error:Y(o)})}),n}async function Qm(r){let e=[];try{let t=gt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await St.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=gt.join(AC.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=gt.join(a,d,"SKILL.md"),p=gt.join(a,`${d}.md`),g=!1;try{await St.access(m),g=!0}catch{try{await St.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 k=await Vm.install(S);k.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):k.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:k.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),B.debug(`Skill install error for ${d}`,{error:Y(f)})}}}catch(t){B.debug("Skill auto-installation failed (non-critical)",{error:Y(t)})}return e}var Zm=w(()=>{"use strict";es();Wt();se();os();Jm();l(qm,"generateAgents");l(Km,"loadExistingAgents");l(Ym,"resolveTemplateIncludes");l(DC,"generateWorkflowAgent");l(IC,"generateDomainAgent");l(RC,"injectFeedbackSection");l(jC,"generateMinimalWorkflowAgent");l($C,"generateMinimalDomainAgent");l(Xm,"configureSkills");l(Qm,"autoInstallSkills")});import eg from"node:fs/promises";import tg from"node:path";var ti,ng=w(()=>{"use strict";ti=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=tg.join(this.projectPath,"package.json"),t=await eg.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await eg.access(tg.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as MC}from"node:child_process";import sg from"node:fs/promises";import rl from"node:path";import{promisify as OC}from"node:util";async function rg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await On("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await On("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await On("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await On("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
1016
1020
|
`).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 On('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
1017
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await On('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:K(t)})}return e}async function Ht(r,e){try{return await Qm.access(tl.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function eg(r){let e={fileCount:0,version:"0.0.0",name:tl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await On('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:K(t)}),e.fileCount=0}try{let t=tl.join(r,"package.json"),n=JSON.parse(await Qm.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 Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:K(t)})}return await Ht(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Ht(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Ht(r,"requirements.txt")||await Ht(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 tg(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 Ht(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 Ht(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 Ht(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 Ht(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 Ht(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 ng(r,e){let t=Mn(),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 sg(r){return new ei(r).detect()}var On,rg=w(()=>{"use strict";Wt();Gc();os();Xm();On=DC(IC);l(Zm,"analyzeGit");l(Ht,"fileExists");l(eg,"gatherStats");l(tg,"detectCommands");l(ng,"buildSources");l(sg,"detectStack")});import{exec as RC}from"node:child_process";import nl from"node:fs/promises";import ti from"node:path";import{promisify as jC}from"node:util";var $C,sl,rl,og,ig=w(()=>{"use strict";_t();F();$C=jC(RC),sl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ti.join(r,s);try{await nl.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=ti.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ti.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 nl.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nl.readFile(ti.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},rl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[sl.contextFilesExist(t),sl.jsonFilesValid(t),sl.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await $C(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}}}},og=new rl});import ni from"node:fs/promises";import si from"node:path";var ri,yr,ag=w(()=>{"use strict";qn();um();ym();Sm();xm();Nc();Wt();wn();ct();le();So();rn();ae();Js();bo();Po();Ks();Ys();Qs();Rm();se();os();Za();ec();Mm();Ia();qm();rg();ig();ri=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 Zo(e)).filter(i=>!pr.includes(i));s=[...pr,...o]}else t.aiTools[0]==="auto"?(s=await Zo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Am("all",e):s=t.aiTools;try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=v.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await qs(this.projectId);try{let O=await Co(this.projectId);O>0&&B.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(O)})}let[i,a,c,u]=await Promise.all([Zm(this.projectPath),eg(this.projectPath),tg(this.projectPath),sg(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&km(this.projectId))try{let{diff:O,currentHashes:Zg}=await Hc(this.projectPath,this.projectId),El=O.added.length+O.modified.length+O.deleted.length;if(El===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Ci=fm(O,this.projectId);f=hm(Ci.allAffected);let ef=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Ci.allAffected.some(pn=>{let tf=pn.substring(pn.lastIndexOf("."));return ef.has(tf)}),g=Ci.directlyChanged.some(pn=>pn==="package.json"||pn==="tsconfig.json"||pn.includes("Dockerfile")||pn.includes("docker-compose")),m={isIncremental:!0,filesChanged:El,filesUnchanged:O.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Uc(this.projectId,Zg)}catch(O){B.debug("Incremental detection failed, falling back to full sync",{error:K(O)})}else try{let{currentHashes:O}=await Hc(this.projectPath,this.projectId);Uc(this.projectId,O)}catch(O){B.debug("Hash computation failed (non-critical)",{error:K(O)})}if(p)try{await Promise.all([lm(this.projectPath,this.projectId),gm(this.projectPath,this.projectId),Pm(this.projectPath,this.projectId)])}catch(O){B.debug("File ranking index build failed (non-critical)",{error:K(O)})}let k;if(g)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(k=O)}catch{}let S=g?await zm(this.globalPath,u,a,k):await Wm(this.globalPath),I=Vm(S,this.projectId,this.globalPath),D=g?await Jm(S):[],V=ng(a,c),me=[],Se;try{let O=await dt.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(Se={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let Ge={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:S.filter(O=>O.type==="workflow").map(O=>O.name),domain:S.filter(O=>O.type==="domain").map(O=>O.name)},sources:V,analysis:Se},C=await Im(Ge,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 R=Date.now()-n,be=await this.recordSyncMetrics(a,me,S,R);await this.archiveStaleData(),await this.autoLearnFromHistory(),await We.installGlobalConfig(),await We.syncCommands();let Hn;try{let O=await $.readConfig(this.projectPath);Hn=await og.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){B.debug("Verification failed (non-critical)",{error:K(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:S,skills:I,skillsInstalled:D,contextFiles:me,aiTools:C.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),syncMetrics:be,verification:Hn,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:K(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>ni.mkdir(si.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=A.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await $m.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){A.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=si.join(this.globalPath,m),g=await ni.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:K(p)})}for(let m of n)try{let p=si.join(this.globalPath,"agents",`${m.name}.md`),g=await ni.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:K(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Pn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:K(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 _.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 dt.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){B.debug("Failed to save draft analysis (non-critical)",{error:K(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Ze.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),ge.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),Qe.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=lt.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:K(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new fn,n=await Qa.learnFromTaskHistory(this.projectId,e,t);try{let s=await Fd.getFeatureOutcomes(this.projectId);s.length>0&&await Qa.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:K(e)})}}async getCliVersion(){try{let e=si.join(__dirname,"..","..","package.json");return JSON.parse(await ni.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:K(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:[]}}},yr=new ri});var ln=w(()=>{"use strict";Yu();od();id();ud();pd();ba();fd();Ia();hd();yd();tm();im();ag()});import Jt from"chalk";function cg(r){return Math.ceil(r.length/MC)}function lg(r){let e=r.split(`
|
|
1021
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await On('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:Y(t)})}return e}async function Ht(r,e){try{return await sg.access(rl.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:Y(t)}),!1}}async function og(r){let e={fileCount:0,version:"0.0.0",name:rl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await On('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:Y(t)}),e.fileCount=0}try{let t=rl.join(r,"package.json"),n=JSON.parse(await sg.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 Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:Y(t)})}return await Ht(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Ht(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Ht(r,"requirements.txt")||await Ht(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 ig(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 Ht(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 Ht(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 Ht(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 Ht(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 Ht(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 ag(r,e){let t=Mn(),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 cg(r){return new ti(r).detect()}var On,lg=w(()=>{"use strict";Wt();Bc();os();ng();On=OC(MC);l(rg,"analyzeGit");l(Ht,"fileExists");l(og,"gatherStats");l(ig,"detectCommands");l(ag,"buildSources");l(cg,"detectStack")});import{exec as FC}from"node:child_process";import ol from"node:fs/promises";import ni from"node:path";import{promisify as _C}from"node:util";var NC,il,al,ug,dg=w(()=>{"use strict";_t();F();NC=_C(FC),il={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ni.join(r,s);try{await ol.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=ni.basename(r);try{await _.read(n)}catch(s){P(s)||t.push(`state: ${y(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ni.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 ol.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ol.readFile(ni.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},al=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[il.contextFilesExist(t),il.jsonFilesValid(t),il.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 NC(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}}}},ug=new al});import si from"node:fs/promises";import ri from"node:path";var oi,wr,pg=w(()=>{"use strict";qn();fm();Cm();xm();Dm();Hc();Wt();wn();lt();le();bo();rn();ae();qs();Co();vo();Ys();Xs();Zs();Fm();se();os();nc();sc();Lm();Ia();Zm();lg();dg();oi=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 ei(e)).filter(i=>!mr.includes(i));s=[...mr,...o]}else t.aiTools[0]==="auto"?(s=await ei(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await $m("all",e):s=t.aiTools;try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Ks(this.projectId);try{let O=await Po(this.projectId);O>0&&B.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){B.debug("Legacy JSON sweep failed (non-critical)",{error:Y(O)})}let[i,a,c,u]=await Promise.all([rg(this.projectPath),og(this.projectPath),ig(this.projectPath),cg(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&vm(this.projectId))try{let{diff:O,currentHashes:rf}=await Wc(this.projectPath,this.projectId),Il=O.added.length+O.modified.length+O.deleted.length;if(Il===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Pi=km(O,this.projectId);f=bm(Pi.allAffected);let of=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Pi.allAffected.some(pn=>{let af=pn.substring(pn.lastIndexOf("."));return of.has(af)}),g=Pi.directlyChanged.some(pn=>pn==="package.json"||pn==="tsconfig.json"||pn.includes("Dockerfile")||pn.includes("docker-compose")),m={isIncremental:!0,filesChanged:Il,filesUnchanged:O.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}zc(this.projectId,rf)}catch(O){B.debug("Incremental detection failed, falling back to full sync",{error:Y(O)})}else try{let{currentHashes:O}=await Wc(this.projectPath,this.projectId);zc(this.projectId,O)}catch(O){B.debug("Hash computation failed (non-critical)",{error:Y(O)})}if(p)try{await Promise.all([gm(this.projectPath,this.projectId),Sm(this.projectPath,this.projectId),Am(this.projectPath,this.projectId)])}catch(O){B.debug("File ranking index build failed (non-critical)",{error:Y(O)})}let S;if(g)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(S=O)}catch{}let k=g?await qm(this.globalPath,u,a,S):await Km(this.globalPath),A=Xm(k,this.projectId,this.globalPath),I=g?await Qm(k):[],V=ag(a,c),ge=[],ke;try{let O=await Be.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(ke={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let Ge={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:k.filter(O=>O.type==="workflow").map(O=>O.name),domain:k.filter(O=>O.type==="domain").map(O=>O.name)},sources:V,analysis:ke},C=await Mm(Ge,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 R=Date.now()-n,be=await this.recordSyncMetrics(a,ge,k,R);await this.archiveStaleData(),await this.autoLearnFromHistory(),await We.installGlobalConfig(),await We.syncCommands();let Hn;try{let O=await $.readConfig(this.projectPath);Hn=await ug.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){B.debug("Verification failed (non-critical)",{error:Y(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:k,skills:A,skillsInstalled:I,contextFiles:ge,aiTools:C.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),syncMetrics:be,verification:Hn,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:Y(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>si.mkdir(ri.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=D.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};D.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await _.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,s);try{await Nm.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:Y(o)})}}async logToMemory(e,t){D.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=ri.join(this.globalPath,m),g=await si.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:Y(p)})}for(let m of n)try{let p=ri.join(this.globalPath,"agents",`${m.name}.md`),g=await si.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:Y(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Pn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:Y(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 _.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 Be.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){B.debug("Failed to save draft analysis (non-critical)",{error:Y(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([et.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),fe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ze.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=ut.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:Y(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new fn,n=await tc.learnFromTaskHistory(this.projectId,e,t);try{let s=await Hd.getFeatureOutcomes(this.projectId);s.length>0&&await tc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:Y(e)})}}async getCliVersion(){try{let e=ri.join(__dirname,"..","..","package.json");return JSON.parse(await si.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:Y(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},wr=new oi});var ln=w(()=>{"use strict";Zu();cd();ld();md();fd();Ca();wd();Ia();Sd();kd();im();dm();pg()});import Jt from"chalk";function mg(r){return Math.ceil(r.length/LC)}function gg(r){let e=r.split(`
|
|
1018
1022
|
`),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+=`
|
|
1019
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
1020
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
1023
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function cl(r){return r.includes("<!-- prjct:preserve")}function fg(r,e){let t=gg(r),n=gg(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:mg(r),tokensAfter:mg(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)cl(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
1024
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(cl(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1021
1025
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1022
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
1023
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
1026
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!cl(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
1027
|
+
`).length}),s.hasChanges=!0)}return s}function hg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Jt.green:p=>p,o=t?Jt.red:p=>p,i=t?Jt.yellow:p=>p,a=t?Jt.dim:p=>p,c=t?Jt.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1024
1028
|
`);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(`
|
|
1025
|
-
`)}function
|
|
1029
|
+
`)}function yg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Jt.green:c=>c,o=t?Jt.red:c=>c,i=t?Jt.cyan:c=>c,a=t?Jt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1026
1030
|
`))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(`
|
|
1027
1031
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1028
1032
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -1033,11 +1037,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ol(r){return r.incl
|
|
|
1033
1037
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1034
1038
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
1035
1039
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
1036
|
-
`)}var
|
|
1037
|
-
`));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
|
|
1038
|
-
`)}function
|
|
1040
|
+
`)}var LC,wg=w(()=>{"use strict";LC=4;l(mg,"estimateTokens");l(gg,"parseMarkdownSections");l(cl,"isPreservedSection");l(fg,"generateSyncDiff");l(hg,"formatDiffPreview");l(yg,"formatFullDiff")});import UC from"node:path";async function ll(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 We.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(`
|
|
1041
|
+
`));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 mt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Sg(r){try{let e=await Ze.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=U.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 Sr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function ul(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function kg(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 bg(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 | ${Sr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Wr(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 | ${ul(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: ${Sr(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(`
|
|
1042
|
+
`)}function Cg(r,e){let t=[];t.push(`# Repository Analysis
|
|
1039
1043
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1040
|
-
`);let n=
|
|
1044
|
+
`);let n=UC.basename(e);if(t.push(`## Project: ${n}
|
|
1041
1045
|
`),t.push(`## Stack Detected
|
|
1042
1046
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1043
1047
|
`),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
|
|
@@ -1053,26 +1057,26 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ol(r){return r.incl
|
|
|
1053
1057
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1054
1058
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1055
1059
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1056
|
-
`)}var
|
|
1057
|
-
`),Oe.init(t);let n=await
|
|
1060
|
+
`)}var Pg=w(()=>{"use strict";wn();Br();ln();as();Cn();Je();l(ll,"showSyncResult");l(Sg,"getSessionActivity");l(Sr,"formatTokens");l(ul,"formatDuration");l(kg,"generateSparkline");l(bg,"generateStatsMarkdown");l(Cg,"generateAnalysisSummary")});var om={};Gn(om,{AnalysisCommands:()=>_n});import dl from"node:fs/promises";import vg from"node:path";import*as Fn from"@clack/prompts";var _n,Jo=w(()=>{"use strict";qn();Hu();wn();Br();ln();Ma();wg();bo();ae();Co();F();is();as();Cn();Pg();Je();_n=class extends de{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1061
|
+
`),Oe.init(t);let n=await st.build(t,e),s={packageJson:await Oe.readPackageJson(),cargoToml:await Oe.readCargoToml(),goMod:await Oe.readGoMod(),requirements:await Oe.readRequirements(),directories:await Oe.listDirectories(),fileCount:await Oe.countFiles(),gitStats:await Oe.getGitStats(),gitLog:await Oe.getGitLog(20),hasDockerfile:await Oe.fileExists("Dockerfile"),hasDockerCompose:await Oe.fileExists("docker-compose.yml"),hasReadme:await Oe.fileExists("README.md"),hasTsconfig:await Oe.fileExists("tsconfig.json"),hasViteConfig:await Oe.fileExists("vite.config.ts")||await Oe.fileExists("vite.config.js"),hasNextConfig:await Oe.fileExists("next.config.js")||await Oe.fileExists("next.config.mjs")},o=Cg(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Fe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:U.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Qe(),ft(at)).getActiveProvider(),d=await We.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1058
1062
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1059
|
-
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=
|
|
1060
|
-
${pg(g)}`);let S=await Fn.confirm({message:"Apply these changes?",initialValue:!0});if(Fn.isCancel(S)||!S)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),il(m,i)}t.md||h.spin("Syncing project...");let d=await yr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(X("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(S=>S.success).length||0),g=d.agents.length,f=xo("sync"),k=X(Ye("Sync Complete"),ht({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),d.git.hasChanges?Dd("Uncommitted changes detected"):null,fe(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return il(d,i)}catch(n){return t.md?console.log(X("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(s),i=await Pn.getDailyStats(s,30),a=await gg(s),c=await xe.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Pn.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: ${wr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${zr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${al(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=fg(i);if(console.log(` ${p} ${wr(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=hg(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=cr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await dt.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=kg.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=X(`## \u26A1 Status: ${u}`,ht({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?je("Analysis",et(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await dt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await dt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(s,"project")?.repoPath||e}catch{}let i=await dt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as XC}from"node:child_process";import{promisify as QC}from"node:util";async function pi(r){if(process.platform!=="darwin")return jg(r);try{let{stdout:e}=await ZC(`security find-generic-password -s "${eP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return jg(r)}}function jg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var ZC,eP,Sl=w(()=>{"use strict";F();ZC=QC(XC),eP="prjct-cli";l(pi,"getCredential");l(jg,"getEnvFallback")});import bt from"node:fs";import{createServer as KP}from"node:net";xi();Vo();ln();_t();F();is();Be();import FC from"node:path";ct();le();F();se();var oi=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:v.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},H=new oi;var ds=class extends de{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=FC.basename(t),a=await _.getCurrentTask(o),c=await ge.getActiveTasks(o),u=await Ze.getRecent(o,5),d=await Le.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=U.getDaysAgo(m),g=[];try{let S=p.toISOString();g=A.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1063
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await wr.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(q(Ve(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=vg.join(o,"context","CLAUDE.md"),c=null;try{c=await dl.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 wr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(q("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await dl.readFile(a,"utf-8")}catch{p=""}let g=fg(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(q(Ve("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 dl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let k=[];for(let I of g.added)k.push(`Added: ${I.name} (${I.lineCount} lines)`);for(let I of g.modified)k.push(`Modified: ${I.name} (${I.lineCount} lines)`);for(let I of g.removed)k.push(`Removed: ${I.name} (${I.lineCount} lines)`);let A=q("## \u26A1 Sync Preview",k.length>0?je("Changes",tt(k)):"No section changes.",pt({"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(A),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let k={added:g.added.map(A=>({name:A.name,lineCount:A.lineCount})),modified:g.modified.map(A=>({name:A.name,lineCount:A.lineCount})),removed:g.removed.map(A=>({name:A.name,lineCount:A.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:k,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(hg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await Fn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Fn.isCancel(S)||S==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(S==="diff"){console.log(`
|
|
1064
|
+
${yg(g)}`);let k=await Fn.confirm({message:"Apply these changes?",initialValue:!0});if(Fn.isCancel(k)||!k)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),ll(m,i)}t.md||h.spin("Syncing project...");let d=await wr.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(q("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(A=>A.success).length||0),g=d.agents.length,f=null;try{let A=await Be.diff(s);A?.hasChanges&&(f=$a(A))}catch{}let S=xo("sync"),k=q(Ve("Sync Complete"),pt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Od("Uncommitted changes detected"):null,he(S.map(A=>({label:A.desc,command:A.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return ll(d,i)}catch(n){return t.md?console.log(q("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(s),i=await Pn.getDailyStats(s,30),a=await Sg(s),c=await ve.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=D.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Pn.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: ${Sr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Wr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${ul(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=kg(i);if(console.log(` ${p} ${Sr(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=bg(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=lr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Be.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=vg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=q(`## \u26A1 Status: ${u}`,pt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?je("Analysis",tt(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Be.diff(s);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(q("## Analysis Diff",`> ${i}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(q($a(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(vd(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(q("## \u274C Diff Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Be.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Be.rollback(s);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(q(Ve("Analysis Rolled Back"),pt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(q("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):t.md?console.log(q("## \u274C Rollback Failed",`> ${s}`)):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Be.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=y(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=D.getDoc(s,"project")?.repoPath||e}catch{}let i=await Be.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as nP}from"node:child_process";import{promisify as sP}from"node:util";async function mi(r){if(process.platform!=="darwin")return _g(r);try{let{stdout:e}=await rP(`security find-generic-password -s "${oP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return _g(r)}}function _g(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var rP,oP,Pl=w(()=>{"use strict";F();rP=sP(nP),oP="prjct-cli";l(mi,"getCredential");l(_g,"getEnvFallback")});import bt from"node:fs";import{createServer as ev}from"node:net";xi();Jo();ln();_t();F();is();Je();import HC from"node:path";lt();le();F();se();var ii=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},H=new ii;var ds=class extends de{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=HC.basename(t),a=await _.getCurrentTask(o),c=await fe.getActiveTasks(o),u=await et.getRecent(o,5),d=await Le.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=U.getDaysAgo(m),g=[];try{let k=p.toISOString();g=D.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",k).map(I=>({...JSON.parse(I.data),timestamp:I.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(k=>k.action==="task_completed").length,featuresShipped:g.filter(k=>k.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1061
1065
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1062
|
-
`),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
|
|
1063
|
-
Activity: ${
|
|
1064
|
-
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await
|
|
1066
|
+
`),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(`
|
|
1067
|
+
Activity: ${S}
|
|
1068
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await st.build(t),p=await Fe.get("Read")(m.paths.roadmap);if(console.log(`
|
|
1065
1069
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1066
1070
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1067
|
-
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,
|
|
1068
|
-
`)[0].trim();console.log(` ${
|
|
1069
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${U.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(
|
|
1071
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let k=f.split(`
|
|
1072
|
+
`)[0].trim();console.log(` ${S+1}. ${k}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1073
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${U.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let k=S.priority?` [${S.priority}]`:"";return`${S.description}${k}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let k=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${k?` (${k})`:""}`}):["Nothing shipped yet"],f=q(`## \u26A1 Dashboard: ${i}`,je("Current Focus",m),je(`Queue (${c.length})`,tt(p,!0)),je("Recent Ships",tt(g)),je("Ideas",`${d.length} pending`),he([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1070
1074
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1071
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1075
|
+
`),console.log("\u2550".repeat(50));let m=lr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1072
1076
|
${g}`),console.log(`
|
|
1073
1077
|
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=U.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1074
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,
|
|
1075
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let
|
|
1078
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let k=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${k}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1079
|
+
\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(`
|
|
1076
1080
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1077
1081
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1078
1082
|
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:U.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
@@ -1090,7 +1094,7 @@ ${"\u2550".repeat(50)}
|
|
|
1090
1094
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1091
1095
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1092
1096
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1093
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};
|
|
1097
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};bc();lt();le();_t();F();import GC from"node:fs/promises";import zC from"node:path";var Nn=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await _o.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=zC.join(e,"analysis","repo-analysis.json"),n=await GC.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return P(t),null}}},jL=new Nn;Je();ln();_t();ae();F();Je();async function ai(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(ai,"cleanupMemory");async function ci(r){let e=await $.getProjectId(r);if(!e)return;let n=G.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;G.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(ci,"cleanupMemoryInternal");async function pl(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ai(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await $.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=G.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;G.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 Le.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${y(a)}`)}try{let c=(await fe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await ci(e),await Ze.log(e,"cleanup_performed",{items:s.length,timestamp:U.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(pl,"cleanup");ln();F();Je();import xg from"node:path";async function ml(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await $.getProjectId(t),a=xg.join(x.getGlobalProjectPath(i),"planning","designs");await re.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1094
1098
|
|
|
1095
1099
|
*Use templates/design/architecture.md for full design*
|
|
1096
1100
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1105,12 +1109,12 @@ ${"\u2550".repeat(50)}
|
|
|
1105
1109
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1106
1110
|
|
|
1107
1111
|
*Use templates/design/flow.md for full design*
|
|
1108
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1112
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=xg.join(a,u);return await re.writeFile(d,c),await Ze.log(t,"design_created",{type:n,target:o,timestamp:U.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(ml,"design");ln();F();Je();import ps from"node:path";async function gl(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=x.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await re.readFile(t);n=JSON.parse(s)}catch(s){if(P(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1109
1113
|
Found abandoned session:
|
|
1110
1114
|
`),console.log(` Task: ${n.task}`),n.startedAt){let s=U.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1111
1115
|
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
|
|
1112
|
-
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1113
|
-
`).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 re.writeFile(n,JSON.stringify(s,null,2)),await
|
|
1116
|
+
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(gl,"recover");async function fl(r=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(x.getGlobalProjectPath(e),"snapshots");await re.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=ps.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await re.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await re.writeFile(a,JSON.stringify(c,null,2)),await Ze.log(r,"undo_performed",{snapshotId:i,timestamp:U.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(fl,"undo");async function hl(r=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(x.getGlobalProjectPath(e),"snapshots"),n=ps.join(t,"history.json"),s;try{let i=await re.readFile(n);s=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1117
|
+
`).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 re.writeFile(n,JSON.stringify(s,null,2)),await Ze.log(r,"redo_performed",{timestamp:U.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(hl,"redo");async function yl(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=ps.join(x.getGlobalProjectPath(e),"snapshots"),n=ps.join(t,"history.json"),s;try{let o=await re.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
|
|
1114
1118
|
SNAPSHOT HISTORY
|
|
1115
1119
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1116
1120
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1118,27 +1122,27 @@ ${"\u2550".repeat(50)}
|
|
|
1118
1122
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1119
1123
|
`)):(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
|
|
1120
1124
|
`)),console.log(`${"=".repeat(50)}
|
|
1121
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1122
|
-
${
|
|
1125
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(yl,"history");var ms=class extends de{static{l(this,"MaintenanceCommands")}_cleanupMemory=ai;_cleanupMemoryInternal=ci;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?pl(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?ml(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?gl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?fl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?hl(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?yl(e):t}};import we from"chalk";ae();var wl=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){G.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)G.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){G.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){G.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 G.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,k)=>S+k,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,k)=>S+k,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,k)=>S+k,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},WC=new wl,Tg=WC;F();Je();var un={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function li(r,e,t){return t==="below"?r<=e?we.green("\u2713"):we.yellow("\u26A0"):r>=e?we.green("\u2713"):we.yellow("\u26A0")}l(li,"statusIcon");var gs=class extends de{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Tg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1126
|
+
${we.dim("No performance data yet.")}`),console.log(`${we.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1123
1127
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1124
|
-
${
|
|
1125
|
-
${
|
|
1128
|
+
${we.cyan("Performance Report")} ${we.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=li(i.startup.avg,un.startup.max,"below");console.log(` Startup: avg ${we.bold(`${i.startup.avg}ms`)} ${we.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${we.dim(`target: <${un.startup.max}ms`)}`)}if(i.memory){let c=li(i.memory.peakHeapMB,un.heapMB.max,"below");console.log(` Memory: avg ${we.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${we.dim(`target: <${un.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=li(i.contextCorrectness.rate,un.contextRate.min,"above");console.log(` Context: ${we.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${we.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${we.dim(`target: ${un.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=li(i.subtaskHandoff.rate,un.handoffRate.min,"above");console.log(` Handoff: ${we.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${we.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${we.dim(`target: ${un.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1129
|
+
${we.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${we.bold(`${u.avg}ms`)} ${we.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};Vo();wn();le();F();_e();tn();Je();import Sl from"node:fs/promises";import BC from"node:path";import te from"chalk";var fs=class extends de{static{l(this,"SetupCommands")}async start(){let t=await(Qe(),ft(at)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1126
1130
|
`),!(await We.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1127
1131
|
|
|
1128
1132
|
Please install it first:
|
|
1129
1133
|
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await We.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1130
1134
|
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1131
|
-
${
|
|
1135
|
+
${x.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1132
1136
|
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1133
1137
|
\u{1F389} Setup complete!`),console.log(`
|
|
1134
1138
|
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...
|
|
1135
1139
|
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await We.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await We.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1136
1140
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1137
1141
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1138
|
-
\u{1F4DD} Installing global configuration...`);let n=await We.installGlobalConfig(),s=n.path?
|
|
1142
|
+
\u{1F4DD} Installing global configuration...`);let n=await We.installGlobalConfig(),s=n.path?x.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(Qe(),ft(at)).getActiveProvider()).name==="claude"){console.log(`
|
|
1139
1143
|
\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(`
|
|
1140
1144
|
\u{1F389} Setup complete!
|
|
1141
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=
|
|
1145
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=BC.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1142
1146
|
# prjct Status Line for Claude Code
|
|
1143
1147
|
# Shows version update notifications and current task
|
|
1144
1148
|
|
|
@@ -1194,23 +1198,23 @@ fi
|
|
|
1194
1198
|
|
|
1195
1199
|
# Default: show prjct branding
|
|
1196
1200
|
echo "\u26A1 prjct"
|
|
1197
|
-
`;await
|
|
1198
|
-
${
|
|
1201
|
+
`;await Sl.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await Sl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Sl.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(te.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(te.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(te.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(te.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(te.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(te.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(te.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(` ${te.bold.cyan("prjct")}${te.magenta("/")}${te.green("cli")} ${te.dim.white(`v${Xn} installed`)}`),console.log(""),console.log(` ${te.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${te.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${te.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(te.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(te.bold.cyan("\u{1F680} Quick Start")),console.log(te.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(` ${te.bold("1.")} Initialize your project:`),console.log(` ${te.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${te.bold("2.")} Start your first task:`),console.log(` ${te.green('prjct task "build auth"')}`),console.log(""),console.log(` ${te.bold("3.")} Ship & celebrate:`),console.log(` ${te.green('prjct ship "user login"')}`),console.log(""),console.log(te.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(` ${te.dim("Documentation:")} ${te.cyan("https://prjct.app")}`),console.log(` ${te.dim("Report issues:")} ${te.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(te.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};qn();_t();er();F();is();as();import $g from"node:path";_e();import rt from"node:path";async function VC(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 M(rt.join(r,"pnpm-lock.yaml"))?"pnpm":await M(rt.join(r,"yarn.lock"))?"yarn":await M(rt.join(r,"bun.lockb"))||await M(rt.join(r,"bun.lock"))?"bun":(await M(rt.join(r,"package-lock.json")),"npm")}l(VC,"detectPackageManager");function Eg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(Eg,"pmRun");function JC(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(JC,"pmTest");async function kl(r){let e=rt.join(r,"package.json"),t=await mn(e,null);if(t){let o=await VC(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:Eg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:Eg(o,"typecheck")}),i.test&&(a.test={tool:o,command:JC(o)}),a}if(await M(rt.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Bn(rt.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await M(rt.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await M(rt.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Vn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await M(rt.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await M(rt.join(r,"gradlew"))&&(await M(rt.join(r,"build.gradle"))||await M(rt.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(kl,"detectProjectCommands");er();F();import{exec as YC}from"node:child_process";import{promisify as XC}from"node:util";import Ke from"chalk";qn();F();sn();import{exec as qC}from"node:child_process";import{promisify as KC}from"node:util";import F1 from"chalk";var U1=KC(qC),Ag=new Map,Dg=new Map;function Ig(r,e){return`workflow:${r}_${e}`}l(Ig,"prefKey");async function Rg(r,e){let t={};for(let n of["before","after","skip"]){let s=Ig(n,e),o=Dg.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Ag.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await ve.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(Rg,"getWorkflowPreferences");async function jg(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Ig(o,s),a=Dg.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Ag.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await ve.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(jg,"listWorkflowPreferences");var ui=XC(YC);async function qt(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=ht.getRulesForCommand(r,e).filter(p=>p.position===t),a=await Rg(r,e);if(a.skip)return s;let c=a[t],u=i.filter(p=>p.type==="gate");for(let p of u){let g=p.description||p.action;console.log(`
|
|
1202
|
+
${Ke.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await ui(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let S=Date.now()-f,k=S>1e3?`${(S/1e3).toFixed(1)}s`:`${S}ms`;console.log(`${Ke.green("\u2713")} ${Ke.dim(`gate passed (${k})`)}`)}catch(f){return console.log(`${Ke.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
|
|
1199
1203
|
${y(f)}
|
|
1200
1204
|
`,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
|
|
1201
|
-
${
|
|
1205
|
+
${Ke.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await ui(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,S=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Ke.green("\u2713")} ${Ke.dim(`(${S})`)}`)}catch(g){console.log(`${Ke.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),s.hooksFailed.push(p.description||p.action),s.output+=`Hook failed: ${p.action}
|
|
1202
1206
|
${y(g)}
|
|
1203
1207
|
`}}if(c){console.log(`
|
|
1204
|
-
${
|
|
1208
|
+
${Ke.dim(`[legacy] ${t}-${e}: ${c}`)}`);try{let p=Date.now();await ui(c,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Ke.green("\u2713")} ${Ke.dim(`(${f})`)}`)}catch(p){console.log(`${Ke.yellow("\u26A0")} legacy hook failed: ${c}`),s.hooksFailed.push(c),s.output+=`Legacy hook failed: ${c}
|
|
1205
1209
|
${y(p)}
|
|
1206
1210
|
`}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
|
|
1207
|
-
${
|
|
1211
|
+
${Ke.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await ui(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,S=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Ke.green("\u2713")} ${Ke.dim(`step passed (${S})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${Ke.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
|
|
1208
1212
|
${y(g)}
|
|
1209
|
-
`,s}}return s}l(qt,"executeWorkflowRules");
|
|
1213
|
+
`,s}}return s}l(qt,"executeWorkflowRules");Je();var hs=class extends de{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Fe.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
|
|
1210
1214
|
${o.stderr}`.trim(),a=i.split(`
|
|
1211
1215
|
`),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(`
|
|
1212
1216
|
`).filter(m=>!m.startsWith("__EXIT:")).join(`
|
|
1213
|
-
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await qt(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Hook failed: ${c.hooksFailed.join(", ")}`};n.md||h.step(1,5,`Linting ${i}...`);let u=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let d=await this._runTests(t),m=
|
|
1217
|
+
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await qt(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Hook failed: ${c.hooksFailed.join(", ")}`};n.md||h.step(1,5,`Linting ${i}...`);let u=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let d=await this._runTests(t),m=ht.getRulesForCommand(o,"ship").filter(k=>k.type==="step"&&k.enabled);for(let k of m){n.md||h.step(2,5,`Running step: ${k.action}...`);let{exitCode:A}=await this._runWithExitCode(k.action);if(A!==0){let I=`Custom step failed: ${k.action}`;return n.md?console.log(`> ${I}`):h.fail(I),{success:!1,error:I}}}n.md||h.step(3,5,"Updating version...");let p=await this._bumpVersion(t);await this._updateChangelog(i,p,t),n.md||h.step(4,5,"Committing...");let g=await this._createShipCommit(i,t),f="skipped";if(g.success){n.md||h.step(5,5,"Pushing...");let k=await this._gitPush(t);f=k.success?"pushed":k.message}if(await et.addShipped(o,{name:i,version:p}),await this.logToMemory(t,"feature_shipped",{feature:i,version:p,timestamp:U.getTimestamp()}),await ve.learnDecision(o,"commit_footer","prjct","ship"),d.success&&await ve.recordDecision(o,"test_before_ship","true","ship"),(!u.success||!d.success)&&await ve.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await qt(o,"ship","after",{projectPath:t,skipRules:n.skipHooks}),n.md){let k=xo("ship"),A=q(Ve(`Shipped: ${i}`,`Version: ${p}`),je("Results",tt([`Lint: ${u.message}`,`Tests: ${d.message}`,`Commit: ${g.success?"created":g.message}`,`Push: ${f}`])),he(k.map(I=>({label:I.desc,command:I.cmd}))));console.log(A)}else h.done(`v${p} shipped`),mt("ship");return{success:!0,feature:i,version:p}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _runLint(e){try{let t=await kl(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 P(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await kl(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 P(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=$g.join(e,"package.json"),n=await re.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 re.writeJson(t,n)),c}catch(t){if(P(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=$g.join(n,"CHANGELOG.md"),o=await re.readFile(s,`# Changelog
|
|
1214
1218
|
|
|
1215
1219
|
`),i=`## [${t}] - ${U.formatDate(new Date)}
|
|
1216
1220
|
|
|
@@ -1223,32 +1227,32 @@ ${o.stderr}`.trim(),a=i.split(`
|
|
|
1223
1227
|
|
|
1224
1228
|
${i}`);await re.writeFile(s,a)}catch(s){P(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Fe.get("Bash")("git add .");let n=`feat: ${e}
|
|
1225
1229
|
|
|
1226
|
-
Generated with [p/](https://www.prjct.app/)`;return await Fe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Fe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};
|
|
1227
|
-
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${ys.dim("would update")} ${m}`);continue}try{let p=await
|
|
1228
|
-
${
|
|
1229
|
-
`),{success:!0,message:"No data"};let a
|
|
1230
|
-
${
|
|
1231
|
-
${
|
|
1232
|
-
${we.dim("Projection:")}`),console.log(` Backlog: ${we.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${we.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...en,...n.velocity}}catch{}return en}};Rc();Ec();import dP from"node:fs/promises";import pP from"node:path";En();var KC=[1,2,3,5,8,13,21],YC={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}},Dg=l(r=>KC.includes(r),"isValidPoint"),ui=l(r=>YC[r],"pointsToMinutes"),Ig=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"),Rg=l(r=>{let e=ui(r);return`${Ig(e.min)}\u2013${Ig(e.max)}`},"pointsToTimeRange");le();ko();var di=300*1e3,He=new It({ttl:di,maxSize:100}),jt=new It({ttl:di,maxSize:10}),Ss=new It({ttl:di,maxSize:5}),bs=new It({ttl:di,maxSize:5});function wl(){He.clear(),jt.clear(),Ss.clear(),bs.clear()}l(wl,"clearLinearCache");function kl(){return{issues:He.stats(),assignedIssues:jt.stats(),teams:Ss.stats(),projects:bs.stats()}}l(kl,"getLinearCacheStats");F();Sl();var tP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},nP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},$g={none:0,urgent:1,high:2,medium:3,low:4},mi=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 pi("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${y(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?$g[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=$g[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:tP[t?.type||"backlog"]||"backlog",priority:nP[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):[]}},rt=new mi;var gi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&rt.isConfigured()}async initialize(e){this.initialized||(await rt.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 rt.fetchAssignedIssues(e);jt.set(t,s);for(let o of s)He.set(`issue:${o.id}`,o),He.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 rt.fetchTeamIssues(e,t);jt.set(n,o);for(let i of o)He.set(`issue:${i.id}`,i),He.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=He.get(t);if(n)return n;let s=await rt.fetchIssue(e);return s&&(He.set(`issue:${s.id}`,s),He.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await rt.createIssue(e);return He.set(`issue:${t.id}`,t),He.set(`issue:${t.externalId}`,t),jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await rt.updateIssue(e,t);return He.set(`issue:${n.id}`,n),He.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await rt.markInProgress(e),He.delete(`issue:${e}`),jt.clear()}async markDone(e){this.ensureInitialized(),await rt.markDone(e),He.delete(`issue:${e}`),jt.clear()}async addComment(e,t){this.ensureInitialized(),await rt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Ss.get("teams");if(e)return e;let t=await rt.getTeams();return Ss.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=bs.get("projects");if(e)return e;let t=await rt.getProjects();return bs.set("projects",t),t}clearCache(){wl()}getCacheStats(){return kl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},St=new gi;Wi();ae();F();var Mg=1800*1e3,fi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await St.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Mg,issues:o};return A.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await St.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 St.markInProgress(t):n==="done"&&await St.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||Mg;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return A.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){A.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=lu("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}}},sP=new fi;xt();le();ae();se();import{exec as rP}from"node:child_process";import{promisify as oP}from"node:util";var Og=oP(rP),Cs="session-snapshot",iP=30,bl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return A.setDoc(e,Cs,u),u}getSnapshot(e){try{return A.getDoc(e,Cs)}catch{return null}}clearSnapshot(e){try{A.deleteDoc(e,Cs)}catch{}}async listAllSnapshots(){let e=await v.listProjects(),t=[];for(let n of e)try{if(!A.exists(n))continue;let s=A.getDoc(n,Cs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=iP){let t=await v.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!A.exists(o))continue;let i=A.getDoc(o,Cs);i&&new Date(i.timestamp).getTime()<n&&(A.deleteDoc(o,Cs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${zt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${zt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
|
|
1233
|
-
`)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${zt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await
|
|
1234
|
-
`).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},dn=new bl;_t();Zs();dc();F();is();as();F();_e();Sl();import aP from"node:fs/promises";import cP from"node:os";import lP from"node:path";function uP(r){return lP.join(cP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(uP,"getCredentialsPath");async function hi(r){let e=uP(r);if(!await M(e))return{};try{return JSON.parse(await aP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(hi,"getProjectCredentials");async function Cl(r){let e=await hi(r);return e.linear?.apiKey?e.linear.apiKey:pi("linear-api-key")}l(Cl,"getLinearApiKey");En();Be();var Ps=class extends de{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await qt(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await hi(o),k=await Cl(o);if(k&&f.linear?.teamId){await St.initializeFromApiKey(k,f.linear.teamId);let S=await St.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await St.markInProgress(e))}}catch{}if(n.md){let f=await _.getCurrentTask(o);if(f)return Nt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let k=v.getGlobalProjectPath(o),[S,I,D,V]=await Promise.all([mP(),dt.getActive(o).catch(()=>null),gP(k),Oo(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),me=null;try{let O=dn.getSnapshot(o);O&&(me=dn.formatContinuityContext(O),dn.clearSnapshot(o))}catch{}let Se=Ka({description:c,branch:S,linearId:a}),Ge=fP(I,D),C=Ad(V.files.map(O=>({path:O.path,description:O.reasons.join(", ")}))),R=hP(D),be=yP(I),Hn=fe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(X(me,Se,Ge,C,R,be,Hn)),await this.logToMemory(t,"task_started",{task:e,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await zo.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let m=await Tc.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),tr("working"),pt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Dg,pointsToMinutes:ui,pointsToTimeRange:Rg,storeEstimate:l(async f=>{let k=ui(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?U.calculateDuration(new Date(i.startedAt)):void 0,c=Ka({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?Ed(u,d):"",p=fe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(X(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Nt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await qt(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await tt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:d?Fg(d):"0m",actualDuration:c||"0m",variance:d?wP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Fg(d)}) \u2192 ${S}${k}%`}await _.completeTask(s,t.feedback);try{dn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await hi(s),k=await Cl(s);k&&f.linear?.teamId&&(await St.initializeFromApiKey(k,f.linear.teamId),await St.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(X(Ye("Completed",`${a}${f}`),ht({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),fe([{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}`),tr("completed"),pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:U.getTimestamp()}),await qt(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ge.getActiveTasks(s);if(o.length===0)return t.md?Nt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(X(je("Queue",`${o.length} task${o.length!==1?"s":""}`),et(i,!0),fe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=U.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await dn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(X(Ye("Task Paused",`**Paused:** ${i.description}`),ht({Reason:e||void 0,"Duration worked":a||void 0}),fe([{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})`:""}`),tr("paused"),pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:U.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?Nt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(X(Ye("Task Resumed",`**Resumed:** ${a.description}`),fe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),tr("working"),pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:U.getTimestamp()}),{success:!0,task:a.description}):(n.md?Nt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"",a=i.split(/\s+/)[0]?.toLowerCase();switch(a){case"add":return this._workflowAdd(i.slice(3).trim(),o,n);case"gate":return this._workflowGate(i.slice(4).trim(),o,n);case"rm":return this._workflowRm(i.slice(2).trim(),o,n);case"reset":return this._workflowReset(o,n);default:return this._workflowShow(a||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let d='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let d='Position must be "before" or "after"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}if(!c||!["task","done","ship","sync"].includes(c)){let d="Command must be one of: task, done, ship, sync";return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=ft.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(X(Ye("Rule Added",`#${u} [hook] ${a} ${c} \u2192 \`${s}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):h.done(`rule #${u} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:u}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase();if(!o||!["task","done","ship","sync"].includes(o)){let u='Usage: prjct workflow gate <task|done|ship|sync> "command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let i=e.slice(e.indexOf(o)+o.length).trim(),[a]=this._parseAction(i);if(!a){let u='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=ft.addRule(t,{type:"gate",command:o,position:"before",action:a,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(X(Ye("Gate Added",`#${c} [gate] before ${o} \u2192 \`${a}\``),fe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):h.done(`gate #${c} added: before ${o} \u2192 ${a}`),{success:!0,ruleId:c}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!ft.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(X(Ye("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=ft.resetRules(e);return t.md?console.log(X(Ye("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=ft.getRulesForCommand(t,e):o=ft.getAllRules(t);let i=await Eg(t);if(o.length===0&&i.length===0)return n.md?console.log(X(je("Workflow Rules","No rules configured"),fe([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=[];for(let u of o){let d=u.enabled?"":" (disabled)";a.push(`#${u.id} [${u.type}] ${u.position} ${u.command} \u2192 \`${u.action}\`${d}`)}for(let u of i)a.push(`[legacy] ${u.key} \u2192 \`${u.action}\` (${u.scope})`);let c=e?`Workflow Rules: ${e}`:"Workflow Rules";console.log(X(je(c,`${o.length} rule${o.length!==1?"s":""}`),et(a),fe([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await dn.cleanup();return t.md?console.log(Ye("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await dn.listAllSnapshots();if(n.length===0)return t.md?Nt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=U.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(X(je("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),et(s),fe([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=U.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Fg(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(Fg,"formatMinutesToDuration");async function mP(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(mP,"getGitBranch");async function gP(r){try{let e=pP.join(r,"analysis","repo-analysis.json"),t=await dP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(gP,"loadRepoAnalysis");function fP(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=ht(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
|
|
1235
|
-
${
|
|
1230
|
+
Generated with [p/](https://www.prjct.app/)`;return await Fe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Fe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};lt();le();vo();F();Cn();Je();import QC from"node:fs/promises";import ZC from"node:path";import ys from"chalk";var ws=class extends de{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(ys.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1231
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${ys.dim("would update")} ${m}`);continue}try{let p=await Ks(d),g=await Po(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${ys.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${ys.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${ys.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${ys.red("\u2717")} ${m}: ${y(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(y(o)),{success:!1,error:y(o)}}}async getCurrentProjectId(e){let t=await $.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=ZC.join(x.getGlobalBasePath(),"projects");try{return(await QC.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};mc();Jn();Ka();F();En();Je();import Se from"chalk";var Ss=class extends de{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await $.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await nt.getAll(s);if(i.length===0)return console.log(`
|
|
1232
|
+
${Se.dim("No velocity data yet.")}`),console.log(`${Se.dim("Complete tasks with estimates to build velocity history.")}
|
|
1233
|
+
`),{success:!0,message:"No data"};let a=Mo(i,o);await qa.saveMetrics(s,a),console.log(`
|
|
1234
|
+
${Se.cyan("Sprint Velocity")} ${Se.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?Se.green:m.estimationAccuracy>=60?Se.yellow:Se.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Se.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Se.green("\u2191"):a.velocityTrend==="declining"?Se.red("\u2193"):Se.dim("\u2192");if(console.log(` Average: ${Se.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Se.bold(`${a.estimationAccuracy}%`)} ${Se.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1235
|
+
${Se.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Se.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Se.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Se.green("\u2713")} ${m.category} tasks estimated within ${Se.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=up(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1236
|
+
${Se.dim("Projection:")}`),console.log(` Backlog: ${Se.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Se.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await $.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...en,...n.velocity}}catch{}return en}};Mc();Ic();import hP from"node:fs/promises";import yP from"node:path";En();var eP=[1,2,3,5,8,13,21],tP={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}},Og=l(r=>eP.includes(r),"isValidPoint"),di=l(r=>tP[r],"pointsToMinutes"),Mg=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"),Fg=l(r=>{let e=di(r);return`${Mg(e.min)}\u2013${Mg(e.max)}`},"pointsToTimeRange");le();ko();var pi=300*1e3,He=new Dt({ttl:pi,maxSize:100}),jt=new Dt({ttl:pi,maxSize:10}),ks=new Dt({ttl:pi,maxSize:5}),bs=new Dt({ttl:pi,maxSize:5});function bl(){He.clear(),jt.clear(),ks.clear(),bs.clear()}l(bl,"clearLinearCache");function Cl(){return{issues:He.stats(),assignedIssues:jt.stats(),teams:ks.stats(),projects:bs.stats()}}l(Cl,"getLinearCacheStats");F();Pl();var iP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},aP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Ng={none:0,urgent:1,high:2,medium:3,low:4},gi=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 mi("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${y(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Ng[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=Ng[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:iP[t?.type||"backlog"]||"backlog",priority:aP[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):[]}},ot=new gi;var fi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&ot.isConfigured()}async initialize(e){this.initialized||(await ot.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 ot.fetchAssignedIssues(e);jt.set(t,s);for(let o of s)He.set(`issue:${o.id}`,o),He.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 ot.fetchTeamIssues(e,t);jt.set(n,o);for(let i of o)He.set(`issue:${i.id}`,i),He.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=He.get(t);if(n)return n;let s=await ot.fetchIssue(e);return s&&(He.set(`issue:${s.id}`,s),He.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await ot.createIssue(e);return He.set(`issue:${t.id}`,t),He.set(`issue:${t.externalId}`,t),jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await ot.updateIssue(e,t);return He.set(`issue:${n.id}`,n),He.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await ot.markInProgress(e),He.delete(`issue:${e}`),jt.clear()}async markDone(e){this.ensureInitialized(),await ot.markDone(e),He.delete(`issue:${e}`),jt.clear()}async addComment(e,t){this.ensureInitialized(),await ot.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ks.get("teams");if(e)return e;let t=await ot.getTeams();return ks.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=bs.get("projects");if(e)return e;let t=await ot.getProjects();return bs.set("projects",t),t}clearCache(){bl()}getCacheStats(){return Cl()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},kt=new fi;Bi();ae();F();var Lg=1800*1e3,hi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await kt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Lg,issues:o};return D.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:y(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await kt.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 kt.markInProgress(t):n==="done"&&await kt.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||Lg;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 D.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){D.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=pu("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}}},cP=new hi;vt();le();ae();se();import{exec as lP}from"node:child_process";import{promisify as uP}from"node:util";var Ug=uP(lP),Cs="session-snapshot",dP=30,vl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,n){let s=await this.getGitBranch(t),o=await this.getModifiedFiles(t),i=n.startedAt?Math.round((Date.now()-new Date(n.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(n,i),u={sessionId:n.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:n.taskDescription,taskStatus:n.taskStatus,activeSubtaskIndex:n.activeSubtaskIndex,subtaskCount:n.subtaskCount,branch:s,linearId:n.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return D.setDoc(e,Cs,u),u}getSnapshot(e){try{return D.getDoc(e,Cs)}catch{return null}}clearSnapshot(e){try{D.deleteDoc(e,Cs)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!D.exists(n))continue;let s=D.getDoc(n,Cs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=dP){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!D.exists(o))continue;let i=D.getDoc(o,Cs);i&&new Date(i.timestamp).getTime()<n&&(D.deleteDoc(o,Cs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${zt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&n.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let s=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";n.push(`- Modified files: ${s}${o}`)}return e.durationWorkedSec&&n.push(`- Time worked: ${zt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
|
|
1237
|
+
`)}generateResumeHint(e,t){let n=[];return e.taskStatus==="paused"?n.push("Task was paused"):n.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&n.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&n.push(`after ${zt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await Ug("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await Ug("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
|
|
1238
|
+
`).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},dn=new vl;_t();er();gc();F();is();as();F();_e();Pl();import pP from"node:fs/promises";import mP from"node:os";import gP from"node:path";function fP(r){return gP.join(mP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(fP,"getCredentialsPath");async function yi(r){let e=fP(r);if(!await M(e))return{};try{return JSON.parse(await pP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(yi,"getProjectCredentials");async function xl(r){let e=await yi(r);return e.linear?.apiKey?e.linear.apiKey:mi("linear-api-key")}l(xl,"getLinearApiKey");En();Je();var Ps=class extends de{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await qt(o,"task","before",{projectPath:t,skipRules:n.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await yi(o),S=await xl(o);if(S&&f.linear?.teamId){await kt.initializeFromApiKey(S,f.linear.teamId);let k=await kt.fetchIssue(e);k&&(a=e,c=`${e}: ${k.title}`,await kt.markInProgress(e))}}catch{}if(n.md){let f=await _.getCurrentTask(o);if(f)return Nt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let S=x.getGlobalProjectPath(o),[k,A,I,V]=await Promise.all([wP(),Be.getActive(o).catch(()=>null),SP(S),Fo(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),ge=null;try{let O=dn.getSnapshot(o);O&&(ge=dn.formatContinuityContext(O),dn.clearSnapshot(o))}catch{}let ke=Qa({description:c,branch:k,linearId:a}),Ge=kP(A,I),C=$d(V.files.map(O=>({path:O.path,description:O.reasons.join(", ")}))),R=bP(I),be=CP(A),Hn=he([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(q(ge,ke,Ge,C,R,be,Hn)),await this.logToMemory(t,"task_started",{task:e,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Wo.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await _.startTask(o,{id:ie(),description:c,sessionId:ie(),linearId:a});let m=await Dc.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),nr("working"),mt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:U.getTimestamp()}),await qt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Og,pointsToMinutes:di,pointsToTimeRange:Fg,storeEstimate:l(async f=>{let S=di(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?U.calculateDuration(new Date(i.startedAt)):void 0,c=Qa({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?jd(u,d):"",p=he([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(q(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=y(s);return n.md?o.includes("Cannot run")||o.includes("working state")?Nt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(s);if(!o)return t.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await qt(s,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await nt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:d?Hg(d):"0m",actualDuration:c||"0m",variance:d?PP(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,k=f>=0?"+":"";p=` | est: ${m}pt (${Hg(d)}) \u2192 ${k}${S}%`}await _.completeTask(s,t.feedback);try{dn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await yi(s),S=await xl(s);S&&f.linear?.teamId&&(await kt.initializeFromApiKey(S,f.linear.teamId),await kt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(q(Ve("Completed",`${a}${f}`),pt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),he([{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}`),nr("completed"),mt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:U.getTimestamp()}),await qt(s,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await fe.getActiveTasks(s);if(o.length===0)return t.md?Nt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(q(je("Queue",`${o.length} task${o.length!==1?"s":""}`),tt(i,!0),he([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),mt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return n.md?Nt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=U.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await dn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(q(Ve("Task Paused",`**Paused:** ${i.description}`),pt({Reason:e||void 0,"Duration worked":a||void 0}),he([{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})`:""}`),nr("paused"),mt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:U.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return n.md?Nt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(n.md?console.log(q(Ve("Task Resumed",`**Resumed:** ${a.description}`),he([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),nr("working"),mt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:U.getTimestamp()}),{success:!0,task:a.description}):(n.md?Nt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"",a=i.split(/\s+/)[0]?.toLowerCase();switch(a){case"add":return this._workflowAdd(i.slice(3).trim(),o,n);case"gate":return this._workflowGate(i.slice(4).trim(),o,n);case"rm":return this._workflowRm(i.slice(2).trim(),o,n);case"reset":return this._workflowReset(o,n);default:return this._workflowShow(a||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let d='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let d='Position must be "before" or "after"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}if(!c||!["task","done","ship","sync"].includes(c)){let d="Command must be one of: task, done, ship, sync";return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=ht.addRule(t,{type:"hook",command:c,position:a,action:s,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(q(Ve("Rule Added",`#${u} [hook] ${a} ${c} \u2192 \`${s}\``),he([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):h.done(`rule #${u} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:u}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase();if(!o||!["task","done","ship","sync"].includes(o)){let u='Usage: prjct workflow gate <task|done|ship|sync> "command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let i=e.slice(e.indexOf(o)+o.length).trim(),[a]=this._parseAction(i);if(!a){let u='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=ht.addRule(t,{type:"gate",command:o,position:"before",action:a,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(q(Ve("Gate Added",`#${c} [gate] before ${o} \u2192 \`${a}\``),he([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):h.done(`gate #${c} added: before ${o} \u2192 ${a}`),{success:!0,ruleId:c}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!ht.removeRule(t,s)){let i=`Rule #${s} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(q(Ve("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=ht.resetRules(e);return t.md?console.log(q(Ve("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=ht.getRulesForCommand(t,e):o=ht.getAllRules(t);let i=await jg(t);if(o.length===0&&i.length===0)return n.md?console.log(q(je("Workflow Rules","No rules configured"),he([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=[];for(let u of o){let d=u.enabled?"":" (disabled)";a.push(`#${u.id} [${u.type}] ${u.position} ${u.command} \u2192 \`${u.action}\`${d}`)}for(let u of i)a.push(`[legacy] ${u.key} \u2192 \`${u.action}\` (${u.scope})`);let c=e?`Workflow Rules: ${e}`:"Workflow Rules";console.log(q(je(c,`${o.length} rule${o.length!==1?"s":""}`),tt(a),he([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await dn.cleanup();return t.md?console.log(Ve("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await dn.listAllSnapshots();if(n.length===0)return t.md?Nt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let s=n.map(o=>{let i=U.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(q(je("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),tt(s),he([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${n.length} recent session${n.length!==1?"s":""}`);for(let s of n){let o=U.formatDuration(Date.now()-new Date(s.timestamp).getTime()),i=s.projectName||s.projectId.slice(0,8);console.log(` [${s.taskStatus}] ${i} \u2014 ${s.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:n,count:n.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Hg(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(Hg,"formatMinutesToDuration");async function wP(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(wP,"getGitBranch");async function SP(r){try{let e=yP.join(r,"analysis","repo-analysis.json"),t=await hP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(SP,"loadRepoAnalysis");function kP(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=pt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,S])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${S}\``);m=`### Commands
|
|
1239
|
+
${tt(g)}`}return[u?`### Project
|
|
1236
1240
|
${u}`:null,m].filter(Boolean).join(`
|
|
1237
1241
|
|
|
1238
|
-
`)||null}l(
|
|
1242
|
+
`)||null}l(kP,"buildProjectContext");function bP(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Md(e)}l(bP,"buildRules");function CP(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"";return`- **${o.name}**: ${o.description}${i}`});e.push(`### Patterns (follow these)
|
|
1239
1243
|
${s.join(`
|
|
1240
1244
|
`)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s=n.map(o=>`- **${o.issue}** \u2014 \`${o.file}\` \u2192 ${o.suggestion}`);e.push(`### Anti-patterns (avoid these)
|
|
1241
1245
|
${s.join(`
|
|
1242
1246
|
`)}`)}return e.length>0?e.join(`
|
|
1243
1247
|
|
|
1244
|
-
`):null}l(yP,"buildPatterns");function wP(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}l(wP,"formatVariance");var Ln=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ps,this.planning=new $n,this.shipping=new hs,this.analytics=new ds,this.performanceCmds=new gs,this.maintenance=new ms,this.analysis=new _n,this.setupCmds=new fs,this.updateCmds=new ws,this.velocityCmds=new ks,this.contextCmds=new Nn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async 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)}},WH=new Ln;Vo();var _g={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}},Ng=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Bo();wn();le();F();_e();Be();import{execSync as yi}from"node:child_process";import ot from"node:fs/promises";import kP from"node:os";import Kt from"node:path";import SP from"node:readline";import pe from"chalk";var wi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",kr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Pl(r){let e=0;try{let t=await ot.readdir(r,{withFileTypes:!0});for(let n of t){let s=Kt.join(r,n.name);if(n.isDirectory())e+=await Pl(s);else try{let o=await ot.stat(s);e+=o.size}catch{}}}catch{}return e}l(Pl,"getDirectorySize");function Lg(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Lg,"formatSize");async function bP(r){try{return(await ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(bP,"countDirectoryItems");function CP(){let r={homebrew:!1,npm:!1};try{yi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{yi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(CP,"detectInstallation");async function PP(){let r=[],e=Gu(),t=v.getGlobalBasePath(),n=await M(t),s=n?await bP(Kt.join(t,"projects")):0,o=n?await Pl(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=Kt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let Se=await ot.readFile(i,"utf-8");c=Se.includes(wi)&&Se.includes(kr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await M(u),m=d?await Pl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await M(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Kt.join(e.claude.config,"prjct-statusline.sh"),k=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,I=await M(S);r.push({path:S,type:"file",description:"Gemini router",exists:I});let D=Kt.join(e.gemini.config,"GEMINI.md"),V=await M(D),me=!1;if(V)try{let Se=await ot.readFile(D,"utf-8");me=Se.includes(wi)&&Se.includes(kr)}catch{}return V&&me&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(PP,"gatherUninstallItems");async function xP(r){try{let e=await ot.readFile(r,"utf-8");if(!e.includes(wi)||!e.includes(kr))return!1;let t=e.indexOf(wi),n=e.indexOf(kr)+kr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1248
|
+
`):null}l(CP,"buildPatterns");function PP(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}l(PP,"formatVariance");var Ln=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ps,this.planning=new $n,this.shipping=new hs,this.analytics=new ds,this.performanceCmds=new gs,this.maintenance=new ms,this.analysis=new _n,this.setupCmds=new fs,this.updateCmds=new ws,this.velocityCmds=new Ss,this.contextCmds=new Nn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async 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)}},ZH=new Ln;Jo();var Gg={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}},zg=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];Vo();wn();le();F();_e();Je();import{execSync as wi}from"node:child_process";import it from"node:fs/promises";import vP from"node:os";import Kt from"node:path";import xP from"node:readline";import pe from"chalk";var Si="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",kr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Tl(r){let e=0;try{let t=await it.readdir(r,{withFileTypes:!0});for(let n of t){let s=Kt.join(r,n.name);if(n.isDirectory())e+=await Tl(s);else try{let o=await it.stat(s);e+=o.size}catch{}}}catch{}return e}l(Tl,"getDirectorySize");function Wg(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Wg,"formatSize");async function TP(r){try{return(await it.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(TP,"countDirectoryItems");function EP(){let r={homebrew:!1,npm:!1};try{wi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(EP,"detectInstallation");async function AP(){let r=[],e=Bu(),t=x.getGlobalBasePath(),n=await M(t),s=n?await TP(Kt.join(t,"projects")):0,o=n?await Tl(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=Kt.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let ke=await it.readFile(i,"utf-8");c=ke.includes(Si)&&ke.includes(kr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await M(u),m=d?await Tl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await M(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Kt.join(e.claude.config,"prjct-statusline.sh"),S=await M(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let k=e.gemini.router,A=await M(k);r.push({path:k,type:"file",description:"Gemini router",exists:A});let I=Kt.join(e.gemini.config,"GEMINI.md"),V=await M(I),ge=!1;if(V)try{let ke=await it.readFile(I,"utf-8");ge=ke.includes(Si)&&ke.includes(kr)}catch{}return V&&ge&&r.push({path:I,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(AP,"gatherUninstallItems");async function DP(r){try{let e=await it.readFile(r,"utf-8");if(!e.includes(Si)||!e.includes(kr))return!1;let t=e.indexOf(Si),n=e.indexOf(kr)+kr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1245
1249
|
|
|
1246
|
-
`).trim(),!s||s.trim().length===0?await
|
|
1247
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
1248
|
-
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(pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(pe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=
|
|
1249
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await
|
|
1250
|
-
${a.length} errors:`));for(let c of a)console.log(pe.red(` - ${c}`))}return console.log(""),console.log(pe.green("prjct has been uninstalled.")),console.log(pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(AP,"uninstall");var ki=class extends de{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return AP(e,t)}};var Un=new Ps,Si=new $n,IP=new hs,Hg=new ds,DP=new gs,xs=new ms,vs=new _n,Gg=new fs,RP=new Nn,jP=new ks,$P=new ki,MP=new ws;function OP(){for(let[r,e]of Object.entries(_g))H.registerCategory(r,e)}l(OP,"registerCategories");function zg(){if(H.has("work"))return;OP();let r=l(e=>Ng.find(t=>t.name===e),"getMeta");H.registerMethod("task",Un,"now",r("task")),H.registerMethod("done",Un,"done",r("done")),H.registerMethod("next",Un,"next",r("next")),H.registerMethod("pause",Un,"pause",r("pause")),H.registerMethod("resume",Un,"resume",r("resume")),H.registerMethod("workflow",Un,"workflow",r("workflow")),H.registerMethod("sessions",Un,"sessions",r("sessions")),H.registerMethod("init",Si,"init",r("init")),H.registerMethod("bug",Si,"bug",r("bug")),H.registerMethod("idea",Si,"idea",r("idea")),H.registerMethod("spec",Si,"spec",r("spec")),H.registerMethod("ship",IP,"ship",r("ship")),H.registerMethod("dash",Hg,"dash",r("dash")),H.registerMethod("help",Hg,"help",r("help")),H.registerMethod("perf",DP,"perf",r("perf")),H.registerMethod("velocity",jP,"velocity",r("velocity")),H.registerMethod("cleanup",xs,"cleanup",r("cleanup")),H.registerMethod("design",xs,"design",r("design")),H.registerMethod("recover",xs,"recover",r("recover")),H.registerMethod("undo",xs,"undo",r("undo")),H.registerMethod("redo",xs,"redo",r("redo")),H.registerMethod("history",xs,"history",r("history")),H.registerMethod("analyze",vs,"analyze",r("analyze")),H.registerMethod("sync",vs,"sync",r("sync")),H.registerMethod("stats",vs,"stats",r("stats")),H.registerMethod("status",vs,"status",r("status")),H.registerMethod("seal",vs,"seal",r("seal")),H.registerMethod("verify",vs,"verify",r("verify")),H.registerMethod("start",Gg,"start",r("start")),H.registerMethod("setup",Gg,"setup",r("setup")),H.registerMethod("uninstall",$P,"uninstall",r("uninstall")),H.registerMethod("update",MP,"update",r("update")),H.registerMethod("context",RP,"context",r("context"))}l(zg,"registerAllCommands");zg();ct();Oi();import{Hono as VP}from"hono";import{cors as JP}from"hono/cors";import{logger as qP}from"hono/logger";le();ae();Js();Ks();Ys();Qs();F();os();import FP from"node:fs/promises";import _P from"node:path";import{Hono as NP}from"hono";function LP(r){return v.getGlobalProjectPath(r)}l(LP,"getProjectDataPath");function Wg(r,e){let t=new NP,n=LP(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await ge.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Le.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=A.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Ze.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),ge.read(r),Le.read(r),Ze.read(r)]),u=A.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=_P.join(n,"context",`${o}.md`),c=await FP.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||B.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Wg,"createRoutes");le();ae();Js();Ks();Ys();Qs();import Ts from"node:fs/promises";import UP from"node:path";import{Hono as HP}from"hono";var GP=v.getGlobalBasePath(),Es=UP.join(GP,"projects");function bi(r){return A.getDoc(r,"project")}l(bi,"getProjectConfig");async function xl(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}l(xl,"calculateDuration");function Bg(){let r=new HP;return r.get("/projects",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=bi(o),a=await _.read(o),c=await ge.read(o),u=await Le.read(o),d=await Ze.read(o),m=a?.currentTask,p=await xl(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(bi(t)),_.read(t),ge.read(t),Le.read(t),Ze.read(t)]),c=A.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await xl(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),ge.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Le.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 Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await ge.read(c),m=await Le.read(c),p=await Ze.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 Ts.mkdir(Es,{recursive:!0});let s=(await Ts.readdir(Es,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=bi(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=bi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await xl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Bg,"createExtendedRoutes");Pi();import{streamSSE as zP}from"hono/streaming";var Vg=3600*1e3,WP=300*1e3,BP=3e4;function Jg(){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()>Vg&&t(i)},WP),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 zP(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)}},BP),p=setTimeout(()=>{t(a)},Vg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(Jg,"createSSEManager");function qg(r){let e=new VP,t=Jg();r.enableCors!==!1&&e.use("*",JP({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",qP()),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=Wg(r.projectId,r.projectPath);e.route("/api",n);let s=Bg();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(Ms())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: ${Ms()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(qg,"createServer");var Kg=3478;var Gt={runDir:l(()=>`${process.env.HOME||Is("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Gt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Gt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Gt.runDir()}/daemon.log`,"log")},Yg=1800*1e3;function vl(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1251
|
-
`)}l(
|
|
1252
|
-
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await
|
|
1250
|
+
`).trim(),!s||s.trim().length===0?await it.unlink(r):await it.writeFile(r,`${s}
|
|
1251
|
+
`,"utf-8"),!0}catch{return!1}}l(DP,"removePrjctSection");async function IP(){let r=vP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Kt.join(r,`.prjct-backup-${e}`);try{await it.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await M(n)&&await Bg(n,Kt.join(t,".prjct-cli")),t}catch{return null}}l(IP,"createBackup");async function Bg(r,e){await it.mkdir(e,{recursive:!0});let t=await it.readdir(r,{withFileTypes:!0});for(let n of t){let s=Kt.join(r,n.name),o=Kt.join(e,n.name);n.isDirectory()?await Bg(s,o):await it.copyFile(s,o)}}l(Bg,"copyDirectory");async function RP(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await DP(o.path)&&n.push(o.path):o.type==="directory"?(await it.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await it.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${y(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||wi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||wi("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${y(o)}`)}}return{deleted:n,errors:s}}l(RP,"performUninstall");async function jP(r){let e=xP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(jP,"promptConfirmation");async function $P(r={},e=process.cwd()){let t=await AP(),n=EP(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(pe.yellow(`
|
|
1252
|
+
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(pe.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(pe.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=x.getDisplayPath(c.path),d="";c.type==="section"?d=pe.dim("(section only)"):c.size&&(d=pe.dim(`(${Wg(c.size)})`)),console.log(` ${pe.cyan(u.padEnd(35))} ${d}`),console.log(` ${pe.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${pe.cyan("Homebrew".padEnd(35))} ${pe.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${pe.cyan("npm global".padEnd(35))} ${pe.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(pe.dim(` Total size: ${Wg(o)}`)),console.log("")),r.dryRun)return console.log(pe.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(pe.blue("Creating backup..."));let c=await IP();c?(console.log(pe.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(pe.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(pe.yellow('Type "uninstall" to confirm:')),!await jP("> ")))return console.log(pe.yellow(`
|
|
1253
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(pe.blue("Removing prjct..."));let{deleted:i,errors:a}=await RP(t,n,r);if(console.log(""),i.length>0&&console.log(pe.green(`Removed ${i.length} items`)),a.length>0){console.log(pe.yellow(`
|
|
1254
|
+
${a.length} errors:`));for(let c of a)console.log(pe.red(` - ${c}`))}return console.log(""),console.log(pe.green("prjct has been uninstalled.")),console.log(pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l($P,"uninstall");var ki=class extends de{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return $P(e,t)}};var Un=new Ps,bi=new $n,MP=new hs,Vg=new ds,OP=new gs,vs=new ms,xs=new _n,Jg=new fs,FP=new Nn,_P=new Ss,NP=new ki,LP=new ws;function UP(){for(let[r,e]of Object.entries(Gg))H.registerCategory(r,e)}l(UP,"registerCategories");function qg(){if(H.has("work"))return;UP();let r=l(e=>zg.find(t=>t.name===e),"getMeta");H.registerMethod("task",Un,"now",r("task")),H.registerMethod("done",Un,"done",r("done")),H.registerMethod("next",Un,"next",r("next")),H.registerMethod("pause",Un,"pause",r("pause")),H.registerMethod("resume",Un,"resume",r("resume")),H.registerMethod("workflow",Un,"workflow",r("workflow")),H.registerMethod("sessions",Un,"sessions",r("sessions")),H.registerMethod("init",bi,"init",r("init")),H.registerMethod("bug",bi,"bug",r("bug")),H.registerMethod("idea",bi,"idea",r("idea")),H.registerMethod("spec",bi,"spec",r("spec")),H.registerMethod("ship",MP,"ship",r("ship")),H.registerMethod("dash",Vg,"dash",r("dash")),H.registerMethod("help",Vg,"help",r("help")),H.registerMethod("perf",OP,"perf",r("perf")),H.registerMethod("velocity",_P,"velocity",r("velocity")),H.registerMethod("cleanup",vs,"cleanup",r("cleanup")),H.registerMethod("design",vs,"design",r("design")),H.registerMethod("recover",vs,"recover",r("recover")),H.registerMethod("undo",vs,"undo",r("undo")),H.registerMethod("redo",vs,"redo",r("redo")),H.registerMethod("history",vs,"history",r("history")),H.registerMethod("analyze",xs,"analyze",r("analyze")),H.registerMethod("sync",xs,"sync",r("sync")),H.registerMethod("stats",xs,"stats",r("stats")),H.registerMethod("status",xs,"status",r("status")),H.registerMethod("seal",xs,"seal",r("seal")),H.registerMethod("verify",xs,"verify",r("verify")),H.registerMethod("start",Jg,"start",r("start")),H.registerMethod("setup",Jg,"setup",r("setup")),H.registerMethod("uninstall",NP,"uninstall",r("uninstall")),H.registerMethod("update",LP,"update",r("update")),H.registerMethod("context",FP,"context",r("context"))}l(qg,"registerAllCommands");qg();lt();Fi();import{Hono as XP}from"hono";import{cors as QP}from"hono/cors";import{logger as ZP}from"hono/logger";le();ae();qs();Ys();Xs();Zs();F();os();import HP from"node:fs/promises";import GP from"node:path";import{Hono as zP}from"hono";function WP(r){return x.getGlobalProjectPath(r)}l(WP,"getProjectDataPath");function Kg(r,e){let t=new zP,n=WP(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await fe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Le.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=D.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await et.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),fe.read(r),Le.read(r),et.read(r)]),u=D.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await _.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=GP.join(n,"context",`${o}.md`),c=await HP.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||B.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Kg,"createRoutes");le();ae();qs();Ys();Xs();Zs();import Ts from"node:fs/promises";import BP from"node:path";import{Hono as VP}from"hono";var JP=x.getGlobalBasePath(),Es=BP.join(JP,"projects");function Ci(r){return D.getDoc(r,"project")}l(Ci,"getProjectConfig");async function El(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}l(El,"calculateDuration");function Yg(){let r=new VP;return r.get("/projects",async e=>{try{await Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Ci(o),a=await _.read(o),c=await fe.read(o),u=await Le.read(o),d=await et.read(o),m=a?.currentTask,p=await El(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(Ci(t)),_.read(t),fe.read(t),Le.read(t),et.read(t)]),c=D.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await El(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await _.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),fe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Le.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 Ts.mkdir(Es,{recursive:!0});let n=(await Ts.readdir(Es,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await _.read(c),d=await fe.read(c),m=await Le.read(c),p=await et.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 Ts.mkdir(Es,{recursive:!0});let s=(await Ts.readdir(Es,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=Ci(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await _.read(d),p=Ci(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await El(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Yg,"createExtendedRoutes");vi();import{streamSSE as qP}from"hono/streaming";var Xg=3600*1e3,KP=300*1e3,YP=3e4;function Qg(){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()>Xg&&t(i)},KP),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 qP(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)}},YP),p=setTimeout(()=>{t(a)},Xg);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}l(Qg,"createSSEManager");function Zg(r){let e=new XP,t=Qg();r.enableCors!==!1&&e.use("*",QP({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",ZP()),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=Kg(r.projectId,r.projectPath);e.route("/api",n);let s=Yg();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(Ms())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: ${Ms()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(Zg,"createServer");var ef=3478;var Gt={runDir:l(()=>`${process.env.HOME||Ds("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Gt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Gt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Gt.runDir()}/daemon.log`,"log")},tf=1800*1e3;function Al(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1255
|
+
`)}l(Al,"encodeMessage");var As=null,br=null,me=null,$e=null;async function nf(r){let e=Gt.socket(),t=Gt.pid(),n=Gt.runDir();if(bt.mkdirSync(n,{recursive:!0}),bt.existsSync(t)){let s=parseInt(bt.readFileSync(t,"utf-8").trim(),10);ov(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),bt.unlinkSync(t)}if(bt.existsSync(e)&&bt.unlinkSync(e),$e={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:tf,idleTimer:null},me=new Ln,As=ev(s=>tv(s)),As.listen(e,()=>{bt.chmodSync(e,384),bt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),sf()}),As.on("error",s=>{console.error("Daemon socket error:",s.message),Cr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||ef;br=Zg({port:i,projectId:o,projectPath:s,enableLogging:!1}),await br.start()}}catch{}if(process.on("SIGTERM",()=>Cr(0)),process.on("SIGINT",()=>Cr(0)),process.on("SIGHUP",()=>{me=new Ln,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(nf,"startDaemon");function tv(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1256
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await nv(o);r.write(Al(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Al(i))}}}),r.on("error",()=>{})}l(tv,"handleConnection");async function nv(r){if(!$e||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(sf(),$e.commandsServed++,$e.lastActivity=Date.now(),r.command==="daemon")return rv(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 sv(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1253
1257
|
`)||o.message||void 0,stderr:t.join(`
|
|
1254
|
-
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(
|
|
1258
|
+
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(nv,"handleRequest");async function sv(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return me.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return me.status(r.cwd,{json:t.json===!0,md:n});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:n});case"done":return me.done(r.cwd,{md:n});case"next":return me.next(r.cwd,{md:n});case"pause":return me.pause(e||"",r.cwd,{md:n});case"resume":return me.resume(e,r.cwd,{md:n});case"bug":return me.bug(e||"",r.cwd,{md:n});case"idea":return me.idea(e||"",r.cwd,{md:n});case"ship":return me.ship(e,r.cwd,{md:n});case"dash":return me.dash(e||"default",r.cwd,{md:n});case"workflow":return me.workflowPrefs(e,r.cwd,{md:n});case"sessions":return me.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t);case"analyze":return me.analyze(t);case"cleanup":return me.cleanup(t);default:return H.execute(r.command,e,r.cwd)}}l(sv,"executeCommand");function rv(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Gt.socket(),uptime:$e?Date.now()-$e.startedAt:0,commandsServed:$e?.commandsServed??0,lastActivity:$e?new Date($e.lastActivity).toISOString():null,registeredCommands:H.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Cr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(rv,"handleDaemonCommand");function sf(){$e&&($e.idleTimer&&clearTimeout($e.idleTimer),$e.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${$e.idleTimeoutMs/1e3/60} minutes, shutting down`),Cr(0)},$e.idleTimeoutMs),$e.idleTimer.unref&&$e.idleTimer.unref())}l(sf,"resetIdleTimer");function Cr(r){console.log("Daemon shutting down..."),$e?.idleTimer&&clearTimeout($e.idleTimer),br&&(br.stop(),br=null),As&&(As.close(),As=null);let e=Gt.socket(),t=Gt.pid();try{bt.existsSync(e)&&bt.unlinkSync(e)}catch{}try{bt.existsSync(t)&&bt.unlinkSync(t)}catch{}process.exit(r)}l(Cr,"shutdown");function ov(r){try{return process.kill(r,0),!0}catch{return!1}}l(ov,"isProcessRunning");var Dl=process.argv.slice(2),iv=parseInt(Dl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,av=Dl.includes("--no-http"),cv=Dl.includes("--foreground");nf({port:iv,noHttp:av,foreground:cv}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|