prjct-cli 1.35.0 → 1.36.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 +17 -1
- package/dist/bin/prjct-core.mjs +473 -356
- package/dist/cli/linear.mjs +34 -9
- package/dist/daemon/entry.mjs +374 -257
- package/dist/templates.json +1 -1
- 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 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=
|
|
8
|
+
var $r=Object.defineProperty;var jf=Object.getOwnPropertyDescriptor;var $f=Object.getOwnPropertyNames;var Mf=Object.prototype.hasOwnProperty;var l=(r,e)=>$r(r,"name",{value:e,configurable:!0}),Ls=(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 Yn=(r,e)=>{for(var t in e)$r(r,t,{get:e[t],enumerable:!0})},Of=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of $f(e))!Mf.call(r,s)&&s!==t&&$r(r,s,{get:()=>e[s],enumerable:!(n=jf(e,s))||n.enumerable});return r};var wt=r=>Of($r({},"__esModule",{value:!0}),r);var Kl=w(()=>{"use strict"});var Mr,Yl=w(()=>{"use strict";Mr={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 Us,Or=w(()=>{"use strict";Us={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 Xl(r){return r instanceof Error&&"code"in r}function P(r){return Xl(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var O=w(()=>{"use strict";l(Xl,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var Ql=w(()=>{"use strict"});var Zl=w(()=>{"use strict";Ql()});function Fr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,eu,Xn=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"},eu=["frontend","backend","devops","docs","testing","database","general"];l(Fr,"calculateConfidence")});var Fi=w(()=>{"use strict"});var _i=w(()=>{"use strict";Kl();Yl();Or();O();Zl();Xn();Fi()});var G={};Yn(G,{calculateDuration:()=>Jf,formatDate:()=>Qn,formatDuration:()=>Kt,formatMonth:()=>Uf,getDateKey:()=>Hf,getDateRange:()=>zf,getDaysAgo:()=>on,getDaysFromNow:()=>Wf,getEndOfDay:()=>Kf,getStartOfDay:()=>qf,getTimestamp:()=>b,getTodayKey:()=>tu,getYearMonthDay:()=>Ni,isToday:()=>Vf,isWithinLastDays:()=>Bf,parseDate:()=>Gf,toRelative:()=>Yf});import{formatDistanceToNowStrict as Lf}from"date-fns";function Qn(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 Uf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function tu(){return Qn(new Date)}function Hf(r){return Qn(r)}function Ni(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Gf(r){return new Date(r)}function b(){return new Date().toISOString()}function on(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Wf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function zf(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 Vf(r){return Qn(r)===tu()}function Bf(r,e){let t=on(e);return r>=t}function Kt(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 Jf(r,e=new Date){let t=e.getTime()-r.getTime();return Kt(t)}function qf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Kf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Yf(r){let e=typeof r=="string"?new Date(r):r;return Lf(e,{addSuffix:!0})}var ne=w(()=>{"use strict";l(Qn,"formatDate");l(Uf,"formatMonth");l(tu,"getTodayKey");l(Hf,"getDateKey");l(Ni,"getYearMonthDay");l(Gf,"parseDate");l(b,"getTimestamp");l(on,"getDaysAgo");l(Wf,"getDaysFromNow");l(zf,"getDateRange");l(Vf,"isToday");l(Bf,"isWithinLastDays");l(Kt,"formatDuration");l(Jf,"calculateDuration");l(qf,"getStartOfDay");l(Kf,"getEndOfDay");l(Yf,"toRelative")});import ru from"node:fs/promises";async function ou(r,e){let t;try{t=await ru.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await nu(r,t),su(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await nu(r,t),su(r,Xf(s.error)),null)}async function nu(r,e){let t=`${r}.backup`;try{await ru.writeFile(t,e,"utf-8")}catch{}}function su(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 Xf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var iu=w(()=>{"use strict";O();l(ou,"safeRead");l(nu,"createBackup");l(su,"logCorruption");l(Xf,"formatZodError")});var ue={};Yn(ue,{appendLine:()=>Li,appendToFile:()=>Zf,atomicWrite:()=>Qf,copyFile:()=>oh,deleteDir:()=>nh,deleteFile:()=>th,dirExists:()=>_r,ensureDir:()=>vt,fileExists:()=>M,getFileExtension:()=>lh,getFileModifiedTime:()=>rh,getFileNameWithoutExtension:()=>uh,getFileSize:()=>sh,listFiles:()=>Yt,moveFile:()=>ih,prependToFile:()=>eh,readFile:()=>Be,readJson:()=>_t,readLines:()=>ah,writeFile:()=>Nt,writeJson:()=>bn,writeLines:()=>ch});import le from"node:fs/promises";import Zn from"node:path";async function _t(r,e=null,t){if(t)return await ou(r,t)??e;try{let n=await le.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function bn(r,e,t=2){let n=JSON.stringify(e,null,t);await le.writeFile(r,n,"utf-8")}async function Be(r,e=""){try{return await le.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Nt(r,e){let t=Zn.dirname(r);await le.mkdir(t,{recursive:!0}),await le.writeFile(r,e,"utf-8")}async function Qf(r,e){let t=Zn.dirname(r);await le.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await le.writeFile(n,e,"utf-8"),await le.rename(n,r)}async function Zf(r,e){await le.appendFile(r,e,"utf-8")}async function Li(r,e){let t=Zn.dirname(r);await le.mkdir(t,{recursive:!0}),await le.appendFile(r,`${e}
|
|
9
|
+
`,"utf-8")}async function eh(r,e){try{let t=await le.readFile(r,"utf-8");await le.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await le.writeFile(r,e,"utf-8");else throw t}}async function M(r){try{return await le.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function _r(r){try{return(await le.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function vt(r){await le.mkdir(r,{recursive:!0})}async function th(r){try{return await le.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function nh(r){try{return await le.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function Yt(r,e={}){try{let n=await le.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 sh(r){return(await le.stat(r)).size}async function rh(r){return(await le.stat(r)).mtime}async function oh(r,e){await le.copyFile(r,e)}async function ih(r,e){await le.rename(r,e)}async function ah(r){return(await Be(r,"")).split(`
|
|
10
|
+
`)}async function ch(r,e){let t=e.join(`
|
|
11
|
+
`);await Nt(r,t)}function lh(r){return Zn.extname(r)}function uh(r){return Zn.basename(r,Zn.extname(r))}var De=w(()=>{"use strict";iu();O();l(_t,"readJson");l(bn,"writeJson");l(Be,"readFile");l(Nt,"writeFile");l(Qf,"atomicWrite");l(Zf,"appendToFile");l(Li,"appendLine");l(eh,"prependToFile");l(M,"fileExists");l(_r,"dirExists");l(vt,"ensureDir");l(th,"deleteFile");l(nh,"deleteDir");l(Yt,"listFiles");l(sh,"getFileSize");l(rh,"getFileModifiedTime");l(oh,"copyFile");l(ih,"moveFile");l(ah,"readLines");l(ch,"writeLines");l(lh,"getFileExtension");l(uh,"getFileNameWithoutExtension")});import{z as Lt}from"zod";function au(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 jx,$x,Mx,Hs,Ox,Gs=w(()=>{"use strict";jx=Lt.enum(["opus","sonnet","haiku"]),$x=Lt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Mx=Lt.string().min(1),Hs=Lt.object({provider:Lt.string(),model:Lt.string(),cliVersion:Lt.string().optional(),recordedAt:Lt.string()}),Ox=Lt.object({preferredModel:Lt.string().optional(),lastAnalysisModel:Hs.optional()});l(au,"compareSemver")});import Ui from"node:fs/promises";import dh from"node:os";import cu from"node:path";async function du(){try{let r=await Ui.readFile(uu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>ph?null:e.detection}catch{return null}}async function pu(r){let e={timestamp:new Date().toISOString(),detection:r};await Ui.mkdir(lu,{recursive:!0}),await Ui.writeFile(uu,JSON.stringify(e,null,2))}var lu,uu,ph,mu=w(()=>{"use strict";lu=cu.join(dh.homedir(),".prjct-cli","cache"),uu=cu.join(lu,"providers.json"),ph=600*1e3;l(du,"readProviderCache");l(pu,"writeProviderCache")});var ut={};Yn(ut,{AntigravityProvider:()=>Wi,ClaudeProvider:()=>Nr,CodexProvider:()=>zi,CursorProvider:()=>hu,GeminiProvider:()=>Gi,Providers:()=>xt,WindsurfProvider:()=>yu,detectAllProviders:()=>Vi,detectAntigravity:()=>Sh,detectCodex:()=>bh,detectCursorProject:()=>Su,detectProvider:()=>Hi,detectWindsurfProject:()=>bu,getActiveProvider:()=>hh,getCommandsDir:()=>xh,getGlobalContextPath:()=>Ch,getGlobalSettingsPath:()=>Ph,getProjectCommandsPath:()=>Th,getProviderBranding:()=>Lr,getSkillsPath:()=>vh,hasProviderConfig:()=>yh,needsCursorRouterRegeneration:()=>wh,needsWindsurfRouterRegeneration:()=>kh,selectProvider:()=>Eh,validateCliVersion:()=>ku});import{exec as mh}from"node:child_process";import an from"node:os";import Re from"node:path";import{promisify as gh}from"node:util";async function wu(r){try{let{stdout:e}=await gu(`which ${r}`,{timeout:fu});return e.trim()}catch{return null}}async function fh(r){try{let{stdout:e}=await gu(`${r} --version`,{timeout:fu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Hi(r){let e=xt[r];if(!e.cliCommand)return{installed:!1};let t=await wu(e.cliCommand);if(!t)return{installed:!1};let n=await fh(e.cliCommand),s=ku(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function ku(r,e){let t=xt[r];return!t.minCliVersion||!e?null:au(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 Vi(r=!1){if(!r){let s=await du();if(s)return s}let[e,t]=await Promise.all([Hi("claude"),Hi("gemini")]),n={claude:e,gemini:t};return await pu(n).catch(()=>{}),n}async function hh(r){if(r&&xt[r])return xt[r];let e=await Vi();return e.claude.installed&&!e.gemini.installed?Nr:e.gemini.installed&&!e.claude.installed?Gi:Nr}async function yh(r){let e=xt[r];return e.configDir?M(e.configDir):!1}function Lr(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=Re.join(r,".cursor"),t=Re.join(e,"rules"),n=Re.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 wh(r){let e=await Su(r);return e.detected&&!e.routerInstalled}async function bu(r){let e=Re.join(r,".windsurf"),t=Re.join(e,"rules"),n=Re.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 kh(r){let e=await bu(r);return e.detected&&!e.routerInstalled}async function Sh(){let r=Wi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Re.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 bh(){let r=zi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await wu("codex"),t=Re.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 Ch(r){let e=xt[r];return e.configDir?Re.join(e.configDir,e.contextFile):null}function Ph(r){let e=xt[r];return!e.configDir||!e.settingsFile?null:Re.join(e.configDir,e.settingsFile)}function vh(r){return xt[r].skillsDir}function xh(r){return xt[r].commandsDir}function Th(r,e){let t=xt[r];return Re.join(e,t.commandsDir)}async function Eh(){let r=await Vi(),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 gu,fu,Nr,Gi,Wi,hu,yu,zi,xt,st=w(()=>{"use strict";Gs();De();mu();gu=gh(mh),fu=2e3,Nr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Re.join(an.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Re.join(an.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"},Gi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Re.join(an.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Re.join(an.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"},Wi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Re.join(an.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Re.join(an.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},hu={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},yu={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},zi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Re.join(an.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Re.join(an.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},xt={claude:Nr,gemini:Gi,cursor:hu,antigravity:Wi,windsurf:yu,codex:zi};l(wu,"whichCommand");l(fh,"getCliVersion");l(Hi,"detectProvider");l(ku,"validateCliVersion");l(Vi,"detectAllProviders");l(hh,"getActiveProvider");l(yh,"hasProviderConfig");l(Lr,"getProviderBranding");l(Su,"detectCursorProject");l(wh,"needsCursorRouterRegeneration");l(bu,"detectWindsurfProject");l(kh,"needsWindsurfRouterRegeneration");l(Sh,"detectAntigravity");l(bh,"detectCodex");l(Ch,"getGlobalContextPath");l(Ph,"getGlobalSettingsPath");l(vh,"getSkillsPath");l(xh,"getCommandsDir");l(Th,"getProjectCommandsPath");l(Eh,"selectProvider")});import Ah from"node:crypto";import Ut from"node:fs/promises";import Bi from"node:os";import L from"node:path";import{globSync as Ih}from"glob";var Ji,Dh,x,de=w(()=>{"use strict";ne();De();Ji=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?L.resolve(e):L.join(Bi.homedir(),".prjct-cli"),this.globalProjectsDir=L.join(this.globalBaseDir,"projects"),this.globalConfigDir=L.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=L.resolve(e),this.globalProjectsDir=L.join(this.globalBaseDir,"projects"),this.globalConfigDir=L.join(this.globalBaseDir,"config")}generateProjectId(e){return Ah.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return L.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return L.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return L.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return L.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await _r(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await M(t)}async ensureGlobalStructure(){await vt(this.globalBaseDir),await vt(this.globalProjectsDir),await vt(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 vt(L.join(t,s));return await vt(L.join(t,"planning","tasks")),await vt(L.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Ni(t);return L.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 vt(n),n}async listSessions(e,t=null,n=null){let s=L.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Ut.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=L.join(s,a.name),u=await Ut.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=L.join(c,d.name),p=await Ut.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:L.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 L.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Ut.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 _r(t)}getDisplayPath(e){let t=Bi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return L.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return L.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return L.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return L.join(this.globalBaseDir,".running")}getDocsPath(){return L.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(st(),wt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(st(),wt(ut)).getActiveProvider();return(st(),wt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return L.join(Bi.homedir(),".claude")}getClaudeSettingsPath(){return L.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?L.join(this.getGlobalProjectPath(e),"agents"):L.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return L.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return L.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=L.join(e,s.file);if(await M(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=L.join(e,"package.json");if(await M(s))try{let o=await Ut.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 Ut.readFile(L.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=L.join(e,"package.json"),i=await Ut.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=L.join(e,"lerna.json");if(await M(c)){let u=await Ut.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=L.join(e,"package.json"),i=await Ut.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=Ih(o,{cwd:e,absolute:!1});for(let a of i){let c=L.join(e,a),u=L.join(c,"package.json");if(await M(u))try{let d=await Ut.readFile(u,"utf-8"),m=JSON.parse(d),p=L.join(c,"PRJCT.md");n.push({name:m.name||L.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=L.resolve(e);for(let s of t.packages){let o=L.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=L.resolve(e),n=L.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=L.dirname(t)}return null}},Dh=new Ji,x=Dh});function Rh(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ws(){return Rh()==="bun"}var qi=w(()=>{"use strict";l(Rh,"detectRuntime");l(Ws,"isBun")});import Ki from"node:fs";import Cu from"node:path";function jh(r){if(Ws()){let{Database:s}=Ls("bun:sqlite");return new s(r,{create:!0})}let e=Ls("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var $h,Ur,I,_,ie=w(()=>{"use strict";de();qi();l(jh,"openDatabase");$h=[{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,38 @@ var Pr=Object.defineProperty;var cf=Object.getOwnPropertyDescriptor;var lf=Objec
|
|
|
258
258
|
);
|
|
259
259
|
|
|
260
260
|
CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
|
|
261
|
-
`)},"up")}
|
|
261
|
+
`)},"up")},{version:4,name:"custom-workflows-table",up:l(r=>{r.run(`
|
|
262
|
+
-- =======================================================================
|
|
263
|
+
-- Custom Workflows: User-defined workflows with agentic auto-config
|
|
264
|
+
-- =======================================================================
|
|
265
|
+
CREATE TABLE custom_workflows (
|
|
266
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
267
|
+
name TEXT UNIQUE NOT NULL,
|
|
268
|
+
description TEXT,
|
|
269
|
+
created_at TEXT NOT NULL,
|
|
270
|
+
updated_at TEXT NOT NULL,
|
|
271
|
+
is_builtin INTEGER NOT NULL DEFAULT 0,
|
|
272
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
273
|
+
metadata TEXT
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
CREATE INDEX idx_custom_workflows_name ON custom_workflows(name);
|
|
277
|
+
CREATE INDEX idx_custom_workflows_enabled ON custom_workflows(enabled);
|
|
278
|
+
|
|
279
|
+
-- Seed built-in workflows (task, done, ship, sync)
|
|
280
|
+
INSERT INTO custom_workflows (name, description, is_builtin, enabled, created_at, updated_at)
|
|
281
|
+
VALUES
|
|
282
|
+
('task', 'Start working on a task', 1, 1, datetime('now'), datetime('now')),
|
|
283
|
+
('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
|
|
284
|
+
('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
|
|
285
|
+
('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
|
|
286
|
+
`)},"up")}],Ur=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Cu.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Cu.dirname(n);Ki.existsSync(s)||Ki.mkdirSync(s,{recursive:!0});let o=jh(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 Ki.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
287
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
263
288
|
version INTEGER PRIMARY KEY,
|
|
264
289
|
name TEXT NOT NULL,
|
|
265
290
|
applied_at TEXT NOT NULL
|
|
266
291
|
)
|
|
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
|
|
292
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of $h)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}},I=new Ur,_=I});function Xi(r){if(eu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(Hr))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 Yi,Hr,Cn,zs,Vs,Bs=w(()=>{"use strict";ie();Xn();ne();Yi={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)},Hr={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(Xi,"resolveCanonicalDomains");Cn=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=_.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();_.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}},zs=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()}},Vs=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};_.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return _.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 Js,Qi=w(()=>{"use strict";ie();Xn();ne();Bs();Js=class r extends Cn{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=Fr(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=Fr(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:Fr(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=_.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return _.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Pu=w(()=>{"use strict"});import qs from"node:fs/promises";import cn from"node:path";import{z as se}from"zod";async function Nh(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=cn.join(e,"package.json"),s=await qs.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 Lh(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 Wh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=_h[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 Uh(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=cn.join(e,a);try{await qs.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 Hh(r,e){let t=Date.now();try{let n=await zh(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 Gh(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=cn.join(e,o.file);try{await qs.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 vu(r,e){let t=Date.now(),n=await Promise.all([Nh(r,e),Lh(r,e),Uh(r,e),Hh(r,e),Gh(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 Wh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await qs.readdir(s,{withFileTypes:!0});for(let i of o){let a=cn.join(s,i.name),c=cn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=cn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function zh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await qs.readdir(s,{withFileTypes:!0});for(let i of o){let a=cn.join(s,i.name),c=cn.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 Mh,Oh,Fh,Zi,IT,_h,ea=w(()=>{"use strict";O();Gs();Mh=se.enum(["draft","verified","sealed"]),Oh=se.object({name:se.string(),description:se.string(),location:se.string().optional()}),Fh=se.object({issue:se.string(),file:se.string(),suggestion:se.string()}),Zi=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(Oh),antiPatterns:se.array(Fh),analyzedAt:se.string(),modelMetadata:Hs.optional(),status:Mh.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),IT={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},_h={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(Nh,"verifyFrameworks");l(Lh,"verifyLanguages");l(Uh,"verifyPatternLocations");l(Hh,"verifyFileCount");l(Gh,"verifyAntiPatternFiles");l(vu,"semanticVerify");l(Wh,"getProjectExtensions");l(zh,"countProjectFiles")});import{z as xe}from"zod";var Gr,ln,Vh,$T,ta,xu,Ks=w(()=>{"use strict";Gr=xe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),ln=xe.object({primaryDomain:Gr,secondaryDomains:xe.array(Gr),confidence:xe.number().min(0).max(1),filePatterns:xe.array(xe.string()),relevantAgents:xe.array(xe.string())}),Vh=xe.object({classification:ln,classifiedAt:xe.string(),source:xe.enum(["cache","history","llm","heuristic"]),descriptionHash:xe.string(),projectId:xe.string()}),$T=xe.object({entries:xe.record(xe.string(),Vh),confirmedPatterns:xe.array(xe.object({descriptionHash:xe.string(),classification:ln,confirmedAt:xe.string(),taskDescription:xe.string()}))}),ta={entries:{},confirmedPatterns:[]},xu={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as H}from"zod";var Bh,Jh,Tu,qh,Kh,Yh,Xh,Qh,Eu,FT,na=w(()=>{"use strict";Bh=H.enum(["low","medium","high"]),Jh=H.enum(["pending","converted","completed","archived","dormant"]),Tu=H.enum(["high","medium","low"]),qh=H.object({impact:Tu,effort:Tu}),Kh=H.object({frontend:H.string().optional(),backend:H.string().optional(),payments:H.string().optional(),ai:H.string().optional(),deploy:H.string().optional(),other:H.array(H.string()).optional()}),Yh=H.object({name:H.string(),description:H.string()}),Xh=H.object({name:H.string(),description:H.string().optional()}),Qh=H.object({id:H.string(),text:H.string(),details:H.string().optional(),priority:Bh,status:Jh,tags:H.array(H.string()),addedAt:H.string(),completedAt:H.string().optional(),convertedTo:H.string().optional(),source:H.string().optional(),sourceFiles:H.array(H.string()).optional(),painPoints:H.array(H.string()).optional(),solutions:H.array(H.string()).optional(),filesAffected:H.array(H.string()).optional(),impactEffort:qh.optional(),implementationNotes:H.string().optional(),stack:Kh.optional(),modules:H.array(Yh).optional(),roles:H.array(Xh).optional(),risks:H.array(H.string()).optional(),risksCount:H.number().optional()}),Eu=H.object({ideas:H.array(Qh),lastUpdated:H.string()}),FT={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z}from"zod";function Iu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Au,Zh,ey,ty,ny,UT,HT,sa=w(()=>{"use strict";Au=z.enum(["linear","jira","github","monday","asana","none"]),Zh=z.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),ey=z.enum(["none","urgent","high","medium","low"]),ty=z.enum(["feature","bug","improvement","task","chore","epic"]),ny=z.object({id:z.string(),identifier:z.string(),title:z.string(),description:z.string().optional(),status:Zh,priority:ey,type:ty.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()}),UT=z.object({provider:Au,lastSync:z.string(),staleAfter:z.number().default(18e5),issues:z.record(z.string(),ny)}),HT=z.object({provider:Au,fetched:z.number(),updated:z.number(),errors:z.array(z.object({issueId:z.string(),error:z.string()})),timestamp:z.string()});l(Iu,"createEmptyIssues")});var Mu={};Yn(Mu,{AgentAssignmentSchema:()=>Du,OUTPUT_SCHEMAS:()=>ju,SubtaskBreakdownSchema:()=>Ru,TaskClassificationSchema:()=>ln,renderSchemaForPrompt:()=>ra});import{z as _e}from"zod";function ra(r){let e=ju[r];return e?`## OUTPUT FORMAT
|
|
268
293
|
|
|
269
294
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
270
295
|
|
|
@@ -273,15 +298,15 @@ ${e.example}
|
|
|
273
298
|
\`\`\`
|
|
274
299
|
|
|
275
300
|
Fields:
|
|
276
|
-
${
|
|
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
|
|
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
|
|
301
|
+
${sy(e.schema)}`:null}function sy(r){if(r instanceof _e.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${$u(n)}`).join(`
|
|
302
|
+
`)}return"(see example above)"}function $u(r){return r instanceof _e.ZodString?"string":r instanceof _e.ZodNumber?"number":r instanceof _e.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof _e.ZodArray?`array of ${$u(r.element)}`:r instanceof _e.ZodObject?"object":"any"}var Du,Ru,ju,Wr=w(()=>{"use strict";Ks();Ks();Du=_e.object({agentName:_e.string(),reasoning:_e.string(),confidence:_e.number().min(0).max(1)}),Ru=_e.object({subtasks:_e.array(_e.object({description:_e.string(),domain:Gr,agent:_e.string(),dependsOn:_e.array(_e.number())})),effort:_e.enum(["low","medium","high"])}),ju={classification:{schema:ln,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Du,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Ru,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(ra,"renderSchemaForPrompt");l(sy,"describeSchema");l($u,"describeField")});import{z as T}from"zod";var Ou,ry,oy,Fu,iy,ay,cy,ly,uy,dy,py,_u,my,gy,KT,Nu,Lu,Uu,Hu,fy,zr,oa=w(()=>{"use strict";Ou=T.number().min(1).max(5),ry=T.enum(["exceeded","met","partial","failed"]),oy=T.enum(["definitely","probably","maybe","no"]),Fu=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),iy=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:Fu.optional(),explanation:T.string().optional()})}),ay=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),cy=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),ly=T.object({metrics:T.array(ay),acceptanceCriteria:T.array(cy),overallSuccess:ry,successScore:T.number().min(0).max(100)}),uy=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),dy=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(uy)}),py=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:oy,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),_u=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:Ou,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),my=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:iy,success:ly.optional(),learnings:dy,roi:py,rating:Ou,taskOutcomes:T.array(_u).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),gy=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:Fu,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),KT=T.object({outcomes:T.array(my),taskOutcomes:T.array(_u).optional(),aggregates:gy.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Nu={outcomes:[],taskOutcomes:[],lastUpdated:""},Lu=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"),Uu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Hu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),fy=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),zr=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=>fy(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 je}from"zod";function by(){let r={};for(let e of wy)r[e]="allow";for(let e of ky)r[e]="ask";for(let e of Sy)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Vr,ZT,hy,ia,yy,eE,wy,ky,Sy,tE,Gu=w(()=>{"use strict";Vr=je.enum(["allow","deny","ask"]),ZT=je.enum(["read","write","delete","create"]),hy=je.record(je.string(),Vr),ia=je.record(je.string(),Vr),yy=je.object({enabled:je.boolean().default(!0),allowedDomains:je.array(je.string()).optional(),blockedDomains:je.array(je.string()).optional()}),eE=je.object({bash:hy.optional(),files:je.object({read:ia.optional(),write:ia.optional(),delete:ia.optional()}).optional(),web:yy.optional(),skills:je.record(je.string(),Vr).optional(),doomLoop:je.object({enabled:je.boolean().default(!0),maxRetries:je.number().default(3)}).optional(),externalDirectories:Vr.default("ask")}),wy=["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*"],ky=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Sy=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(by,"buildDefaultPermissions");tE=by()});import{z as et}from"zod";var oE,iE,Wu=w(()=>{"use strict";oE=et.object({projectId:et.string(),name:et.string(),repoPath:et.string(),description:et.string().optional(),version:et.string().optional(),cliVersion:et.string().optional(),techStack:et.array(et.string()),fileCount:et.number(),commitCount:et.number(),createdAt:et.string(),lastSync:et.string(),lastSyncCommit:et.string().optional(),lastSyncBranch:et.string().optional()}),iE={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Cy,Py,vy,xy,Ty,Ey,Ay,Iy,Dy,Ry,jy,$y,My,Oy,Fy,_y,Ny,Ly,uE,dE,zu=w(()=>{"use strict";Cy=E.enum(["planned","active","completed","shipped"]),Py=E.enum(["low","medium","high"]),vy=E.enum(["feature","breaking_change","refactor","infrastructure"]),xy=E.enum(["completed","active","planned"]),Ty=E.enum(["planned","active","completed"]),Ey=E.enum(["git","git-branch","manual","prd"]),Ay=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),Iy=E.object({id:E.string(),name:E.string(),status:xy,completedAt:E.string().optional()}),Dy=E.object({goal:E.string(),phases:E.array(Iy),successMetrics:E.array(E.string()).optional()}),Ry=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),jy=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),$y=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),My=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),Oy=E.object({estimated:$y.nullable(),actual:My.nullable()}),Fy=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),_y=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:Fy.optional(),status:Ty,startDate:E.string().optional(),endDate:E.string().optional()}),Ny=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Cy,impact:Py,effort:E.string().optional(),progress:E.number(),type:vy.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(Ay),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Ry.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:Ey.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:Oy.optional(),valueScore:E.number().optional(),commits:E.array(jy).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),Ly=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()}),uE=E.object({strategy:Dy.nullable().optional(),features:E.array(Ny),backlog:E.array(E.union([E.string(),Ly])),lastUpdated:E.string(),quarters:E.array(_y).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),dE={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 Uy from"node:crypto";import{homedir as Hy}from"node:os";import{join as Gy}from"node:path";function ce(){return Uy.randomUUID()}var Wy,Vu=w(()=>{"use strict";l(ce,"generateUUID");Wy=Gy(Hy(),".prjct-cli","projects")});import{z as Je}from"zod";var SE,Bu=w(()=>{"use strict";SE=Je.object({sessionId:Je.string(),projectId:Je.string(),projectPath:Je.string(),projectName:Je.string().optional(),taskDescription:Je.string(),taskStatus:Je.enum(["active","paused"]),activeSubtaskIndex:Je.number().optional(),subtaskCount:Je.number().optional(),branch:Je.string().optional(),linearId:Je.string().optional(),filesModified:Je.array(Je.string()).optional(),durationWorkedSec:Je.number().optional(),timestamp:Je.string(),resumeHint:Je.string()})});import{z as q}from"zod";var zy,Ju,Vy,By,Jy,qy,Ky,Yy,Xy,qu,aa=w(()=>{"use strict";zy=q.enum(["feature","fix","improvement","refactor"]),Ju=q.enum(["pass","warning","fail","skipped"]),Vy=q.enum(["added","changed","fixed","removed"]),By=q.object({hours:q.number(),minutes:q.number(),totalMinutes:q.number()}),Jy=q.object({filesChanged:q.number().nullable().optional(),linesAdded:q.number().nullable().optional(),linesRemoved:q.number().nullable().optional(),commits:q.number().nullable().optional()}),qy=q.object({description:q.string(),type:Vy.optional()}),Ky=q.object({lintStatus:Ju.nullable().optional(),lintDetails:q.string().optional(),testStatus:Ju.nullable().optional(),testDetails:q.string().optional()}),Yy=q.object({hash:q.string().optional(),message:q.string().optional(),branch:q.string().optional()}),Xy=q.object({id:q.string(),name:q.string(),version:q.string().nullable().optional(),type:zy,agent:q.string().optional(),description:q.string().optional(),changes:q.array(qy).optional(),codeSnippets:q.array(q.string()).optional(),commit:Yy.optional(),codeMetrics:Jy.optional(),qualityMetrics:Ky.optional(),quantitativeImpact:q.string().optional(),duration:By.optional(),tasksCompleted:q.number().nullable().optional(),shippedAt:q.string(),featureId:q.string().optional()}),qu=q.object({shipped:q.array(Xy),lastUpdated:q.string()})});import{z as v}from"zod";var Qy,Yu,Zy,ew,tw,ca,Xu,nw,sw,Qu,Ku,rw,ow,Zu,ed,td,iw,aw,EE,Br=w(()=>{"use strict";Gs();Qy=v.enum(["low","medium","high","critical"]),Yu=v.enum(["feature","bug","improvement","chore"]),Zy=v.enum(["active","backlog","previously_active"]),ew=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),tw=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ca=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()}),Xu=v.object({output:v.string().min(1,"Subtask output is required"),summary:ca}),nw=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:ew,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:ca.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),sw=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Qu=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(nw).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:sw.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:Hs.optional()}),Ku=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),rw=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()}),ow=v.object({taskId:v.string(),title:v.string(),classification:Yu,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(ca),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:rw.optional()}),Zu=v.object({currentTask:Qu.nullable(),previousTask:Ku.nullable().optional(),pausedTasks:v.array(Ku).optional(),taskHistory:v.array(ow).optional(),lastUpdated:v.string()}),ed=v.object({id:v.string(),description:v.string(),priority:Qy,type:Yu,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:Zy,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),td=v.object({tasks:v.array(ed),lastUpdated:v.string()}),iw=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),aw=v.object({type:tw,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),EE=v.object({projectId:v.string(),currentTask:Qu.nullable(),queue:v.array(ed),stats:iw,recentActivity:v.array(aw),lastSync:v.string()})});import{z as ee}from"zod";var cw,lw,nd,RE,jE,$E,un,sd,es=w(()=>{"use strict";cw=ee.enum(["improving","stable","declining"]),lw=ee.object({sprintNumber:ee.number(),startDate:ee.string(),endDate:ee.string(),pointsCompleted:ee.number(),tasksCompleted:ee.number(),avgVariance:ee.number(),estimationAccuracy:ee.number()}),nd=ee.object({category:ee.string(),avgVariance:ee.number(),taskCount:ee.number()}),RE=ee.object({totalPoints:ee.number(),sprints:ee.number(),estimatedDate:ee.string()}),jE=ee.object({sprints:ee.array(lw),averageVelocity:ee.number(),velocityTrend:cw,estimationAccuracy:ee.number(),overEstimated:ee.array(nd),underEstimated:ee.array(nd),lastUpdated:ee.string()}),$E=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)}),un={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},sd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Tt=w(()=>{"use strict";Pu();ea();Ks();na();sa();Wr();Gs();oa();Gu();Wu();zu();Vu();Bu();aa();Br();es()});var Pn,la=w(()=>{"use strict";Tt();Xn();ne();Bs();Pn=class extends Cn{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:ce(),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),R=(p.tags||[]).filter(J=>A.includes(J));g.tagMatch=Math.min(20,R.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 A=this._extractKeywordsFromText(t.taskDescription),R=0;for(let J of A)p.content.toLowerCase().includes(J)&&(R+=2),p.title.toLowerCase().includes(J)&&(R+=3);g.keywords=Math.min(15,R)}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=Yi[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=Hr[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 Xi(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?`
|
|
303
|
+
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 ua,uw,$e,ts=w(()=>{"use strict";Bs();Qi();la();Bs();Qi();la();ua=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Pn,this._patternStore=new Js,this._historyStore=new Vs,this._sessionStore=new zs}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()}},uw=new ua,$e=uw});import{exec as dw}from"node:child_process";import dt from"node:fs/promises";import Et from"node:path";import{promisify as pw}from"node:util";var vn,da,mw,Ne,rd=w(()=>{"use strict";O();vn=pw(dw),da=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Et.join(this.projectPath,"package.json"),t=await dt.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=Et.join(this.projectPath,"Cargo.toml");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=Et.join(this.projectPath,"requirements.txt");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=Et.join(this.projectPath,"go.mod");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=Et.join(this.projectPath,"Gemfile");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=Et.join(this.projectPath,"mix.exs");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=Et.join(this.projectPath,"pom.xml");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=Et.join(this.projectPath,"composer.json"),t=await dt.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=Et.join(this.projectPath,"pyproject.toml");return await dt.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await vn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
|
|
304
|
+
`).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 dt.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 dt.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 vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await vn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await vn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await dt.access(Et.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=Et.join(this.projectPath,e);return await dt.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
305
|
+
`).filter(Boolean)}catch{return[]}}},mw=new da,Ne=mw});import{z as pe}from"zod";function gw(r){return r instanceof ns}function Y(r){return gw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var ss,EA,AA,IA,DA,RA,jA,ns,Jr,qr,Ys,Xt=w(()=>{"use strict";ss={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}},EA=ss.create("FileError",pe.object({path:pe.string(),operation:pe.enum(["read","write","delete","create","copy"]),reason:pe.string().optional()})),AA=ss.create("ValidationError",pe.object({field:pe.string(),expected:pe.string(),received:pe.string().optional(),message:pe.string().optional()})),IA=ss.create("PermissionError",pe.object({action:pe.string(),resource:pe.string(),reason:pe.string().optional()})),DA=ss.create("TaskError",pe.object({taskId:pe.string().optional(),operation:pe.enum(["create","update","complete","pause","resume","delete"]),reason:pe.string()})),RA=ss.create("SessionError",pe.object({sessionId:pe.string().optional(),reason:pe.string()})),jA=ss.create("SyncError",pe.object({projectId:pe.string().optional(),operation:pe.enum(["push","pull","auth","connect"]),reason:pe.string()})),ns=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)}},Jr=class r extends ns{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")}},qr=class r extends ns{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")}},Ys=class r extends ns{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(gw,"isPrjctError");l(Y,"getErrorMessage")});import pa from"node:fs";import Yr from"node:path";function od(){if(Xs)return Xs;let r=__dirname;for(let e=0;e<5;e++){let t=Yr.join(r,"package.json");if(pa.existsSync(t))try{if(JSON.parse(pa.readFileSync(t,"utf-8")).name==="prjct-cli")return Xs=r,r}catch{}r=Yr.dirname(r)}return Xs=Yr.join(__dirname,"..","..",".."),Xs}function ma(){if(Kr)return Kr;try{let r=Yr.join(od(),"package.json"),e=JSON.parse(pa.readFileSync(r,"utf-8"));return Kr=e.version,fw=e,Kr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var Kr,fw,Xs,rs,Ee,dn=w(()=>{"use strict";O();Kr=null,fw=null,Xs=null;l(od,"getPackageRoot");l(ma,"getVersion");rs=ma(),Ee=od()});import fa from"node:fs";import hw from"node:fs/promises";import Xr from"node:path";function ha(){if(id)return ga;id=!0;let r=Xr.join(Ee,"dist","templates.json");try{let e=fa.readFileSync(r,"utf-8");return ga=JSON.parse(e),ga}catch{return null}}function ww(r){let e=xn.indexOf(r);e>-1&&xn.splice(e,1),xn.push(r)}function kw(){for(;os.size>=yw&&xn.length>0;){let r=xn.shift();r&&os.delete(r)}}function Qr(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(`
|
|
306
|
+
`).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 ad(r){if(os.has(r))return ww(r),os.get(r);let e,t=ha();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=Xr.join(Ee,"templates","commands",`${r}.md`);try{e=await hw.readFile(s,"utf-8")}catch{throw qr.notFound(r)}}let n=Qr(e);return kw(),os.set(r,n),xn.push(r),n}async function Sw(r){return(await ad(r)).frontmatter["allowed-tools"]||[]}function bw(){os.clear(),xn.length=0}function Me(r){let e=ha();if(e?.[r])return e[r];let t=Xr.join(Ee,"templates",r);try{return fa.readFileSync(t,"utf-8")}catch{return null}}function is(r){let e=ha();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=Xr.join(Ee,"templates",r);try{return fa.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var yw,os,xn,ga,id,Cw,ya,as=w(()=>{"use strict";Xt();dn();yw=50,os=new Map,xn=[],ga=null,id=!1;l(ha,"loadBundle");l(ww,"updateLruOrder");l(kw,"evictLru");l(Qr,"parseFrontmatter");l(ad,"load");l(Sw,"getAllowedTools");l(bw,"clearCache");l(Me,"getTemplateContent");l(is,"listTemplates");Cw={load:ad,parseFrontmatter:Qr,getAllowedTools:Sw,clearCache:bw,getTemplateContent:Me,listTemplates:is},ya=Cw});import V from"node:fs/promises";import ka from"node:os";import K from"node:path";async function Pw(){try{let r=Me("global/modules/module-config.json");if(r)return JSON.parse(r);let e=K.join(Ee,"templates/global/modules/module-config.json"),t=await V.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function vw(r){let e=await Pw();if(!e){let i=Me("global/CLAUDE.md");if(i)return i;let a=K.join(Ee,"templates/global/CLAUDE.md");return V.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Me("global/CLAUDE.md");if(a)return a;let c=K.join(Ee,"templates/global/CLAUDE.md");return V.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=Me(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=K.join(Ee,"templates/global/modules",i),u=await V.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(`
|
|
307
|
+
`)}async function xw(){try{let r=K.join(ka.homedir(),".prjct-cli","docs");await V.mkdir(r,{recursive:!0});let e=is("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Me(s);if(o){let i=K.basename(s);await V.writeFile(K.join(r,i),o,"utf-8")}}return{success:!0}}let t=K.join(Ee,"templates/global/docs"),n=await V.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=K.join(t,s),i=K.join(r,s),a=await V.readFile(o,"utf-8");await V.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Tw(){let r=(st(),wt(ut)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await V.mkdir(e.configDir,{recursive:!0});let s=K.join(e.configDir,e.contextFile),o=K.join(Ee,"templates","global",e.contextFile),i="";try{let u=Me(`global/${e.contextFile}`);u?i=u:i=await V.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await vw()}catch{let d=Me("global/CLAUDE.md");if(d)i=d;else{let m=K.join(Ee,"templates/global/CLAUDE.md");i=await V.readFile(m,"utf-8")}}else{let d=Me("global/CLAUDE.md");if(d)i=d;else{let m=K.join(Ee,"templates/global/CLAUDE.md");i=await V.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await V.readFile(s,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await V.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
283
308
|
|
|
284
|
-
${i}`;return await
|
|
309
|
+
${i}`;return await V.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await V.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function cd(){let r=ka.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 wa,Ew,qe,Tn=w(()=>{"use strict";as();O();dn();l(Pw,"loadModuleConfig");l(vw,"composeGlobalTemplate");l(xw,"installDocs");l(Tw,"installGlobalConfig");wa=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ka.homedir(),this.templatesDir=K.join(Ee,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(st(),wt(ut)).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 V.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=is("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 V.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(st(),wt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await V.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=Me(`commands/${a}`);if(u)await V.writeFile(c,u,"utf-8");else{let d=K.join(this.templatesDir,a),m=await V.readFile(d,"utf-8");await V.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 V.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await V.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 V.access(this.claudeCommandsPath);let n=(await V.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(Me(`commands/${e}.md`))return!0;try{let n=K.join(this.templatesDir,`${e}.md`);return await V.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(st(),wt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=K.join(t.configDir,"commands",n);await V.mkdir(K.dirname(s),{recursive:!0});let o=Me(`commands/${n}`);if(o)return await V.writeFile(s,o,"utf-8"),!0;let i=K.join(this.templatesDir,n),a=await V.readFile(i,"utf-8");return await V.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(st(),wt(ut)).getActiveProvider(),n=K.join(t.configDir,"commands"),s=0;try{let i=(await V.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await V.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 V.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await V.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=Me(`commands/${o}`);if(c)await V.writeFile(i,c,"utf-8");else{let u=K.join(this.templatesDir,o),d=await V.readFile(u,"utf-8");await V.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 Tw()}async installDocs(){return xw()}};l(cd,"getProviderPaths");Ew=new wa,qe=Ew});import{z as Te}from"zod";function pd(r,e="default"){let t=ld[e]||ld.default;return r/1e3*t}function Zr(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Aw,Iw,ud,dd,ld,eo=w(()=>{"use strict";Aw=Te.object({date:Te.string(),tokensSaved:Te.number(),syncs:Te.number(),avgCompressionRate:Te.number(),totalDuration:Te.number()}),Iw=Te.object({agentName:Te.string(),usageCount:Te.number(),tokensSaved:Te.number()}),ud=Te.object({totalTokensSaved:Te.number(),avgCompressionRate:Te.number(),syncCount:Te.number(),watchTriggers:Te.number(),avgSyncDuration:Te.number(),totalSyncDuration:Te.number(),agentUsage:Te.array(Iw),dailyStats:Te.array(Aw),firstSync:Te.string(),lastUpdated:Te.string()}),dd={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},ld={"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(pd,"estimateCostSaved");l(Zr,"formatCost")});function Dw(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Rw(r){let e=[],t=Dw(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Sa,o+i.length);if(c===-1)continue;let u=c+Sa.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function ba(r,e){let t=Rw(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
285
310
|
|
|
286
311
|
---
|
|
287
312
|
|
|
@@ -292,11 +317,11 @@ ${i}`;return await W.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
|
|
|
292
317
|
`;for(let s of t)n+=s.content,n+=`
|
|
293
318
|
|
|
294
319
|
`;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=x.getGlobalProjectConfigPath(e),n=await
|
|
298
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:
|
|
299
|
-
`;await
|
|
320
|
+
`}function Ca(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(`
|
|
321
|
+
`);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(Sa)&&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 Sa,Pa=w(()=>{"use strict";Sa="<!-- /prjct:preserve -->";l(Dw,"createPreserveStartRegex");l(Rw,"extractPreservedSections");l(ba,"mergePreservedSections");l(Ca,"validatePreserveBlocks")});function Qs(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&jw.has(e.code))return!0;if(e.code&&gd.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 no(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&gd.has(e.code))}function md(r,e,t){let n=pn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(pn.delete(r),!1):!0:!1}function va(r,e){let t=pn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),pn.set(r,t)}function $w(r){pn.delete(r)}var jw,gd,pn,to,fd,Zs,so=w(()=>{"use strict";jw=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),gd=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Qs,"isTransientError");l(no,"isPermanentError");pn=new Map;l(md,"isCircuitOpen");l(va,"recordFailure");l($w,"recordSuccess");to=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(md(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 $w(t),o}catch(o){if(n=o,s++,no(o))throw va(t,this.options.circuitBreakerThreshold),o;if(!(Qs(o)&&s<this.options.maxAttempts))throw va(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 va(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Qs(e)}isCircuitOpen(e){return md(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return pn.get(e)}resetCircuit(e){pn.delete(e)}resetAllCircuits(){pn.clear()}},fd=new to({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Zs=new to({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var hd=w(()=>{"use strict";Pa();so()});import{exec as Mw}from"node:child_process";import{promisify as Ow}from"node:util";async function ro(r){try{let{stdout:e}=await Fw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function _w(){let r=await ro("gh api user --jq .login");return r.success&&r.output||(r=await ro("git config --global github.user"),r.success&&r.output)?r.output:null}async function Nw(){let r=await ro("git config user.name");return r.success&&r.output?r.output:null}async function Lw(){let r=await ro("git config user.email");return r.success&&r.output?r.output:null}async function cs(){let[r,e,t]=await Promise.all([_w(),Nw(),Lw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Fw,oo=w(()=>{"use strict";Fw=Ow(Mw);l(ro,"execCommand");l(_w,"detectGitHubUsername");l(Nw,"detectGitName");l(Lw,"detectGitEmail");l(cs,"detect")});import En from"node:fs/promises";import Uw from"node:path";import*as io from"jsonc-parser";function yd(r){let e=[],t=io.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}: ${io.printParseErrorCode(n.error)}`)}return t}var Ta,Hw,$,pt=w(()=>{"use strict";Xt();O();ne();dn();oo();de();l(yd,"parseJsonc");Ta=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await En.readFile(t,"utf-8");return yd(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 En.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await En.writeFile(n,`${o}
|
|
322
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await En.readFile(t,"utf-8");return yd(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 En.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await En.writeFile(n,`${o}
|
|
323
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:rs,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:rs,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 En.readdir(Uw.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 cs(),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))}}},Hw=new Ta,$=Hw});import ao from"node:fs/promises";import Ea from"node:path";var Aa,wd,kd=w(()=>{"use strict";pt();de();O();Aa=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await ao.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await ao.readFile(Ea.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=Ea.join(this.agentsPath,`${e}.md`),n=await ao.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Ea.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})}
|
|
324
|
+
`;await ao.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},wd=Aa});import Sd from"node:path";async function zw(){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 Vw(){return{...Gw}}function Bw(){return{...Ww}}async function bd(){return co||(co=await zw()?Vw():Bw(),co)}var co,Gw,Ww,Cd=w(()=>{"use strict";De();co=null,Gw={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}},Ww={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(zw,"isClaudeEnvironment");l(Vw,"getClaudeAgent");l(Bw,"getTerminalAgent");l(bd,"detect")});import er from"node:fs/promises";var Ia,Pd,vd=w(()=>{"use strict";O();Ia=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 er.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 er.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 er.readdir(e)}async fileExists(e){try{return await er.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await er.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
325
|
${e.map((t,n)=>`${n+1}. ${t}`).join(`
|
|
301
326
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
302
327
|
|
|
@@ -341,7 +366,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
341
366
|
|
|
342
367
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
343
368
|
|
|
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}}},
|
|
369
|
+
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}}},Pd=Ia});var qw,lo,ls,xd=w(()=>{"use strict";kd();Xt();Cd();vd();so();qw=["claude"],lo=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new wd}async initialize(){return this.agent?this.agent:await fd.execute(async()=>{if(this.agentInfo=await bd(),!this.agentInfo?.isSupported)throw Ys.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!qw.includes(e))throw Ys.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Pd,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
370
|
AGENTIC EXECUTION:
|
|
346
371
|
- Read: templates/agentic/orchestrator.md
|
|
347
372
|
- Analyze task: "${e}"
|
|
@@ -349,18 +374,35 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
|
|
|
349
374
|
- Claude decides which agent(s) to use
|
|
350
375
|
- Always prefer specialists over generalist
|
|
351
376
|
- 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 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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
`),
|
|
377
|
+
`}}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}},ls=new lo});var uo,po,Td=w(()=>{"use strict";uo=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"}},po=new uo});import Ed from"node:path";var Kw,Yw,tr,Ad=w(()=>{"use strict";ne();De();Kw=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],Yw=`# Changelog
|
|
378
|
+
|
|
379
|
+
All notable changes to this project will be documented in this file.
|
|
380
|
+
|
|
381
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
382
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
383
|
+
`,tr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of Kw){let s=Ed.join(this.projectPath,n);if(await M(s)){let o=await Be(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=Ed.join(this.projectPath,e);return await Nt(t,`${Yw}
|
|
384
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Be(t.filePath),s=e.date||Qn(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await Nt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,n){let s=this.formatKeepAChangelogEntry(t,n),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+s}
|
|
385
|
+
${a}`}return`${e.trimEnd()}
|
|
386
|
+
|
|
387
|
+
${s}`}insertMarkdownEntry(e,t,n){let s=this.formatMarkdownEntry(t,n),o=e.indexOf(`
|
|
388
|
+
`);if(o!==-1){let i=e.slice(0,o+1),a=e.slice(o+1);return`${i}
|
|
389
|
+
${s}
|
|
390
|
+
${a}`}return`${s}
|
|
391
|
+
|
|
392
|
+
${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push("### Added"),n.push(`- ${e.description}`),n.push(""));return n.join(`
|
|
393
|
+
`)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
|
|
394
|
+
`)}}});import Xw from"node:crypto";import mo from"node:fs/promises";import Id from"node:path";function Dd(){return{version:At,lastUpdated:"",checksums:{}}}var At,Da,He,nr=w(()=>{"use strict";de();O();ne();ie();At="1.0.0";l(Dd,"getDefaultChecksums");Da=class{static{l(this,"IndexStorage")}getIndexPath(e){return Id.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await mo.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==At?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 mo.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:At,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{I.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await mo.readdir(t);await Promise.all(n.map(s=>mo.unlink(Id.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!==At?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!==At?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=I.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=I.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)}},He=new Da});var Rd,Qw,go,Zw,jd=w(()=>{"use strict";nr();Rd=8e4,Qw={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"]},go=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||Rd,[c,u,d]=await Promise.all([He.readIndex(t),He.readDomains(t),He.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let R of m){let J=d.domainIndex[R]||[];for(let he of J)p.add(he)}if(i&&d.domainIndex.general){let R=d.domainIndex.general.slice(0,10);for(let J of R)p.add(J)}let g=c.relevantFiles.filter(R=>p.has(R.path)&&R.score>=o);g.sort((R,J)=>J.score-R.score);let f=0,k=[];for(let R of g){let J=Math.ceil(R.size/this.CHARS_PER_TOKEN);if(f+J>a||k.length>=s)break;k.push(R),f+=J}let S=Math.ceil(c.relevantFiles.reduce((R,J)=>R+J.size,0)/this.CHARS_PER_TOKEN),A=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:A,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Qw))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 He.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 He.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return He.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Rd,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)}},Zw=new go});import $d from"node:path";var Ra,fo,ek,Md=w(()=>{"use strict";nr();ne();Ra=[{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"}],fo=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 Ra)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=$d.dirname(i.path);n.get(u).add(`**/${$d.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=Ra.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 Ra)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:At,projectId:e,domains:t,discoveredAt:s};await He.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:At,lastUpdate:s,fileCategories:n,domainIndex:i};await He.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([He.readDomains(e),He.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 He.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 He.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:At,lastUpdate:b(),fileCategories:u,domainIndex:d};await He.writeCategories(e,m)}return o}},ek=new fo});import ja from"node:path";var $a,tk,nk,ho,Od,Ma=w(()=>{"use strict";$a=30,tk=[/^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$/],nk=[/^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],ho=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=$a){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=ja.basename(e.path);for(let n of tk)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=ja.basename(e.path);for(let s of nk)if(s.test(t))return 15;let n=ja.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}},Od=new ho});function wo(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 sk[r]}var X,Oa,Fa,yo,sk,It,Fd,mn=w(()=>{"use strict";X={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Oa=["feature","spec","design","refactor","migrate"],Fa=["ship","cleanup","git","migrate"],yo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],sk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(wo,"getTimeout");It={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},Fd={HISTORY_MAX:100}});function _a(r,e){return{...Us[r],...e}}function ko(r,e,t){return{message:r,hint:e,...t}}var So=w(()=>{"use strict";Or();Or();l(_a,"getError");l(ko,"createError")});import{execSync as Na}from"node:child_process";var bo,La,Co,Po,Ua=w(()=>{"use strict";So();bo={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"}},La=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=bo[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=bo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Co(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=bo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
395
|
+
`);throw new Co({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
396
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(bo),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=Na(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:ko(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Na(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Na(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:ko(`${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())}},Co=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}},Po=new La});import{exec as rk}from"node:child_process";import{promisify as ok}from"node:util";var DD,_d=w(()=>{"use strict";mn();Ua();DD=ok(rk)});var Ht,Ha,mt,gn=w(()=>{"use strict";Tt();ne();ie();Ht={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ha=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ce(),s=b();return I.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 I.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(ce(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=I.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=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(I.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);I.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},mt=new Ha});var vo,rt,Ga=w(()=>{"use strict";pt();gn();ie();vo=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await $.getProjectId(e);if(!o)return;_.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?_.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?_.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;_.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 _.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=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Ht.MEMORY_MAX_ENTRIES)return 0;let s=n-Ht.MEMORY_MAX_ENTRIES,o=_.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);mt.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&&_.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}}},rt=new vo});var Nd=w(()=>{"use strict";de();De()});import{exec as ak}from"node:child_process";import{promisify as ck}from"node:util";var XD,Ld=w(()=>{"use strict";nr();ne();Ma();XD=ck(ak)});import An from"chalk";var Ud,lk,uk,Dt,Hd=w(()=>{"use strict";st();Ud=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],lk=80,uk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Ud,speed:lk},cli:{header:l(()=>`${An.cyan.bold("\u26A1")} ${An.cyan("prjct")}`,"header"),footer:l(()=>An.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${An.cyan("\u26A1")} ${An.cyan("prjct")} ${An.cyan(Ud[r%10])} ${An.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")=>Lr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Lr(r).signature,"getSignature")},Dt=uk});import Q from"chalk";function mk(){return dk[pk]}var cR,Wa,dk,pk,In,us,za,gt,fn,gk,fk,h,Dn=w(()=>{"use strict";Hd();mn();So();So();cR=Dt.spinner.frames,Wa=Dt.spinner.speed,dk={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}},pk="compact";l(mk,"getTierConfig");In={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")},us=null,za=0,gt=!1,fn=l((r,e)=>{let t=e??(mk().maxCharsPerLine||It.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),gk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(It.CLEAR_WIDTH)}\r`):!0,"clear"),fk={start(){return gt||console.log(Dt.cli.header()),this},end(){return gt||console.log(Dt.cli.footer()),this},spin(r){return gt?this:(this.stop(),process.stdout.isTTY?(us=setInterval(()=>{process.stdout.write(`\r${Dt.cli.spin(za++,fn(r,It.SPINNER_MSG))}`)},Wa),this):(process.stdout.write(`${Dt.cli.spin(0,fn(r,It.SPINNER_MSG))}
|
|
397
|
+
`),this))},done(r,e){if(this.stop(),!gt){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(`${In.success} ${fn(r,It.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${In.fail} ${fn(r,It.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?_a(r):r;return console.error(),console.error(`${In.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(),gt||console.log(`${In.warn} ${fn(r,It.WARN_MSG)}`),this},info(r){return this.stop(),gt||console.log(`${In.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!gt&&e&&console.log(`${In.debug} ${Q.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),gt)return this;let t=e.bullet||In.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),gt||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(),gt)return this;let t=e.split(`
|
|
398
|
+
`),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(),gt?this:(console.log(`
|
|
399
|
+
${Q.bold(r)}`),console.log(Q.dim("\u2500".repeat(r.length))),this)},stop(){return us&&(clearInterval(us),us=null,gk()),this},step(r,e,t){if(gt)return this;this.stop();let n=Q.dim(`[${r}/${e}]`);return process.stdout.isTTY?(us=setInterval(()=>{process.stdout.write(`\r${Dt.cli.spin(za++,`${n} ${fn(t,It.STEP_MSG)}`)}`)},Wa),this):(process.stdout.write(`${Dt.cli.spin(0,`${n} ${fn(t,It.STEP_MSG)}`)}
|
|
400
|
+
`),this)},progress(r,e,t){if(gt)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?` ${fn(t,It.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(us=setInterval(()=>{process.stdout.write(`\r${Dt.cli.spin(za++,`[${i}] ${n}%${a}`)}`)},Wa),this):(process.stdout.write(`${Dt.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
401
|
+
`),this)}},h=fk});function Gd(r,e){let t=[];sr("Languages",r.languages,e.languages,t),sr("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)"}),sr("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);sr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);sr("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 Va(r){if(!r.hasChanges)return`## Analysis Diff
|
|
360
402
|
|
|
361
403
|
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
|
|
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(`
|
|
404
|
+
`)}function Wd(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(`
|
|
405
|
+
`)}function sr(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 Ba=w(()=>{"use strict";l(Gd,"generateAnalysisDiff");l(Va,"formatAnalysisDiffMd");l(Wd,"formatAnalysisDiffText");l(sr,"diffStringArray")});function yk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(hk.has(r)||r.includes("prjct"))return{level:ds.debug,name:"debug"};let e=ds[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function xo(r,e,t){return zd>=r?(...n)=>console[t](e,...n):kk}var ds,hk,zd,wk,kk,Sk,B,ps=w(()=>{"use strict";ds={error:0,warn:1,info:2,debug:3},hk=new Set(["1","true","*"]);l(yk,"getLogLevel");({level:zd,name:wk}=yk()),kk=l(()=>{},"noop");l(xo,"createLogMethod");Sk={error:xo(ds.error,"[prjct:error]","error"),warn:xo(ds.warn,"[prjct:warn]","warn"),info:xo(ds.info,"[prjct:info]","log"),debug:xo(ds.debug,"[prjct:debug]","log"),isEnabled:l(()=>zd>=0,"isEnabled"),level:l(()=>wk,"level")},B=Sk});var To,bk,Vd=w(()=>{"use strict";Xt();ie();_i();mn();ps();To=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Fd.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(Mr.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(Mr.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{I.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())}},bk=new To});var Eo,Ao,Bd=w(()=>{"use strict";de();ne();De();Eo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await _t(t,[])??[];n.push(e),await bn(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await _t(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await bn(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await bn(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await _t(t,null)}},Ao=new Eo});var Ja=w(()=>{"use strict";Vd();Bd()});var Rt,Io=w(()=>{"use strict";Rt=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 Oe,Gt=w(()=>{"use strict";Ja();Io();ne();ie();Oe=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Rt({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=I.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){I.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 Ao.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 I.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 Pk}from"node:crypto";var qa,Ke,Do=w(()=>{"use strict";ea();Ba();ne();Gt();qa=class extends Oe{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"};Zi.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 Zi.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:Gd(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 vu(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 Pk("sha256").update(JSON.stringify(t)).digest("hex")}},Ke=new qa});var Ka,Ge,rr=w(()=>{"use strict";Tt();na();ne();gn();Gt();Ka=class extends Oe{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Eu)}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:ce(),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=on(Ht.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;mt.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}},Ge=new Ka});var Ya,Rn,Ro=w(()=>{"use strict";eo();ne();Gt();Ya=class extends Oe{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",ud)}getDefault(){return{...dd}}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],k=m.filter(A=>A.date>=f),S=[...i.agentUsage];if(t.agents)for(let A of t.agents){let R=S.findIndex(J=>J.agentName===A);R>=0?S[R]={...S[R],usageCount:S[R].usageCount+1,tokensSaved:S[R].tokensSaved+Math.floor(n/t.agents.length)}:S.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: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:pd(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)}},Rn=new Ya});import tt from"node:fs/promises";import ae from"node:path";async function or(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(I.exists(r)&&I.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=x.getGlobalProjectPath(r),s=ae.join(n,"storage"),o=ae.join(n,"index"),i=ae.join(n,"memory");t.backupDir=await vk(s,o,i),I.getDb(r);for(let{filename:a,key:c}of Za){let u=ae.join(s,a),d=await jn(u);if(d===null){t.skippedFiles.push(a);continue}try{I.setDoc(r,c,d),Jd(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Qa){let u=ae.join(o,a),d=await jn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{I.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),qd(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await jk(r,o,t),await $k(r,o,t),await Mk(r,i,t),await Ok(r,i,t),t.errors.length===0&&await Fk(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 vk(r,e,t){let n=ae.join(r,"backup");return await tt.mkdir(n,{recursive:!0}),await tt.mkdir(ae.join(n,"index"),{recursive:!0}),await tt.mkdir(ae.join(n,"memory"),{recursive:!0}),await Xa(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Xa(e,ae.join(n,"index")),await Xa(t,ae.join(n,"memory")),n}async function Xa(r,e,t){try{let n=await tt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=ae.join(r,s.name),i=ae.join(e,s.name);await tt.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Jd(r,e,t){switch(e){case"state":xk(r,t);break;case"queue":Tk(r,t);break;case"ideas":Ek(r,t);break;case"shipped":Ak(r,t);break;case"metrics":Ik(r,t);break;case"analysis":Dk(r,t);break}}function xk(r,e){let t=I.getDb(r),n=t.prepare(`
|
|
364
406
|
INSERT OR REPLACE INTO tasks
|
|
365
407
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
366
408
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -371,80 +413,83 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
|
|
|
371
413
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
372
414
|
depends_on, started_at, completed_at, output, summary)
|
|
373
415
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
416
|
+
`),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 Tk(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
375
417
|
INSERT OR REPLACE INTO queue_tasks
|
|
376
418
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
377
419
|
feature_id, feature_name)
|
|
378
420
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
421
|
+
`);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 Ek(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
380
422
|
INSERT OR REPLACE INTO ideas
|
|
381
423
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
382
424
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
425
|
+
`);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 Ak(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
384
426
|
INSERT OR REPLACE INTO shipped_features
|
|
385
427
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
386
428
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
429
|
+
`);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 Ik(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
388
430
|
INSERT OR REPLACE INTO metrics_daily
|
|
389
431
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
390
432
|
VALUES (?, ?, ?, ?, ?)
|
|
391
|
-
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function
|
|
433
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Dk(r,e){let n=I.getDb(r).prepare(`
|
|
392
434
|
INSERT OR REPLACE INTO analysis
|
|
393
435
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
394
436
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
437
|
+
`),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 qd(r,e,t){e==="categories-cache"&&Rk(r,t)}function Rk(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
396
438
|
INSERT OR REPLACE INTO index_files
|
|
397
439
|
(path, categories, domain, score, size, mtime, language)
|
|
398
440
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
399
|
-
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function
|
|
441
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function jk(r,e,t){let n=ae.join(e,"checksums.json"),s=await jn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=I.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function $k(r,e,t){let n=ae.join(e,"file-scores.json"),s=await jn(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=I.getDb(r),a=i.prepare(`
|
|
400
442
|
INSERT OR REPLACE INTO index_files
|
|
401
443
|
(path, score, size, mtime, language, categories, domain)
|
|
402
444
|
VALUES (?, ?, ?, ?, NULL,
|
|
403
445
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
404
446
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
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
|
|
406
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=
|
|
407
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=
|
|
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:
|
|
447
|
+
`);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 Mk(r,e,t){let n=ae.join(e,"events.jsonl");try{let o=(await tt.readFile(n,"utf-8")).split(`
|
|
448
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=I.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Ok(r,e,t){let n=ae.join(e,"learnings.jsonl");try{let o=(await tt.readFile(n,"utf-8")).split(`
|
|
449
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=I.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){P(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Fk(r,e,t,n){let s=l(async(i,a)=>{try{await tt.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Za)await s(ae.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(ae.join(e,i),`cleanup:index/${i}`);await s(ae.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(ae.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function jn(r){try{let e=await tt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function jo(r){let e=x.getGlobalProjectPath(r),t=ae.join(e,"storage"),n=0;I.getDb(r);for(let{filename:u,key:d}of Za){let m=ae.join(t,u),p=await jn(m);if(p!==null){I.setDoc(r,d,p),Jd(r,d,p);try{await tt.unlink(m)}catch{}n++}}let s=ae.join(e,"project.json"),o=await jn(s);if(o!==null){I.setDoc(r,"project",o);try{await tt.unlink(s)}catch{}n++}let i=ae.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=ae.join(i,u);try{let p=(await tt.readFile(d,"utf-8")).split(`
|
|
450
|
+
`).filter(f=>f.trim());if(p.length===0){await tt.unlink(d),n++;continue}let g=I.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),A=`learning:${S.taskId??S.timestamp??Date.now()}`,R=S.tags;f.run(A,R?.[0]??null,k,1,S.timestamp??new Date().toISOString())}catch{}})()}await tt.unlink(d),n++}catch{}}let a=ae.join(e,"index"),c=[...Qa.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=ae.join(a,u),m=await jn(d);if(m===null)continue;let p=Qa.find(g=>g.filename===u);p&&(I.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),qd(r,p.key,m));try{await tt.unlink(d)}catch{}n++}return n}var Za,Qa,$o=w(()=>{"use strict";de();O();ie();Za=[{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"}],Qa=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(or,"migrateJsonToSqlite");l(vk,"createBackup");l(Xa,"copyFiles");l(Jd,"populateNormalized");l(xk,"populateTasksFromState");l(Tk,"populateQueueTasks");l(Ek,"populateIdeas");l(Ak,"populateShippedFeatures");l(Ik,"populateMetricsDaily");l(Dk,"populateAnalysis");l(qd,"populateIndexTables");l(Rk,"populateCategoriesIndex");l(jk,"migrateChecksums");l($k,"migrateFileScores");l(Mk,"migrateEventsJsonl");l(Ok,"migrateLearningsJsonl");l(Fk,"cleanupJsonFiles");l(jn,"readJsonSafe");l(jo,"sweepLegacyJson")});var ec,ye,ir=w(()=>{"use strict";Tt();Br();ne();gn();Gt();ec=class extends Oe{static{l(this,"QueueStorage")}constructor(){super("queue.json",td)}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:ce(),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:ce(),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=on(Ht.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;mt.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()})}},ye=new ec});var tc,ot,ar=w(()=>{"use strict";Tt();aa();ne();gn();Gt();tc=class extends Oe{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",qu)}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:ce(),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=on(Ht.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;mt.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}},ot=new tc});var cr,nc,$n,sc=w(()=>{"use strict";cr={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"}},nc=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=cr[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 cr[e]}getPrompt(e){return cr[e].prompt}getValidCommands(e){return cr[e].transitions}formatNextSteps(e){return cr[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}`}})}},$n=new nc});var rc,F,lr=w(()=>{"use strict";Tt();Br();ne();sc();gn();Gt();rc=class extends Oe{static{l(this,"StateStorage")}constructor(){super("state.json",Zu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=$n.getCurrentState(e),s=$n.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:ce()};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[];mt.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=Xu.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:
|
|
409
451
|
${f.join(`
|
|
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}},
|
|
411
|
-
VALUES (?, ?, ?, ?,
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
`)}function
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
${
|
|
452
|
+
`)}`)}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}},F=new rc});var Kd=w(()=>{"use strict";Ja();O()});var oc,ic,ac=w(()=>{"use strict";es();Gt();oc=class extends Oe{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:sd,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}},ic=new oc});var cc,nt,lc=w(()=>{"use strict";ie();cc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();_.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
453
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=_.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return s.id}getWorkflow(e,t){let n=_.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return n?this.rowToWorkflow(n):null}getAllWorkflows(e,t=!1){let n=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return _.query(e,n).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,n){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return n.description!==void 0&&(i.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(i.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),_.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let n=this.getWorkflow(e,t);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return _.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||n.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},nt=new cc});function uc(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 dc,we,ur=w(()=>{"use strict";lc();ie();l(uc,"rowToRule");dc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let n=I.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(n?.m??-1)+1;return I.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
454
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s),I.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(I.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,n){if(!I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(n)){let d=o[c];d&&(i.push(`${d.column} = ?`),a.push(d.transform?d.transform(u):u))}return i.length===0||(a.push(t),I.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let n=I.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return n?uc(n):null}getRulesForCommand(e,t){let n=nt.getWorkflow(e,t);return!n||!n.enabled?[]:I.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(uc)}getAllRules(e){return I.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(uc)}resetRules(e){let t=I.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return I.run(e,"DELETE FROM workflow_rules"),t?.c??0}},we=new dc});var Wt=w(()=>{"use strict";Do();gn();ie();rr();nr();Ro();$o();ir();ar();lr();Kd();Gt();ac();ur()});function _k(){return`\u26A1 prjct
|
|
455
|
+
|
|
456
|
+
---`}function Nk(){return`---
|
|
457
|
+
\u26A1 prjct \xB7 v${ma()}`}function U(...r){return Lk(_k(),...r.filter(Boolean),Nk())}function pc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
|
|
458
|
+
`)}function Yd(r,e=""){return`\`\`\`${e}
|
|
459
|
+
${r}
|
|
460
|
+
\`\`\``}function re(r,e,t=3){return`### ${r}
|
|
461
|
+
${e}`}function Le(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
462
|
+
`)}function mc(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?`
|
|
463
|
+
> ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function Xd(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
|
|
464
|
+
${pc(t,n)}`}function Qd(r){return r.length===0?"":`### Relevant Files
|
|
420
465
|
${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
|
|
421
|
-
`)}`}function
|
|
422
|
-
${
|
|
423
|
-
${
|
|
424
|
-
> ${e}`:`## \u2705 ${r}`}function
|
|
425
|
-
|
|
426
|
-
`)}function
|
|
427
|
-
Next:`));for(let o of s){let i=
|
|
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
|
|
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
|
-
`)}},
|
|
466
|
+
`)}`}function Zd(r){return`### Rules
|
|
467
|
+
${Le(r)}`}function oe(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
|
|
468
|
+
${pc(e,t)}`}function ft(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 pc(t,n)}function ke(r,e){return e?`## \u2705 ${r}
|
|
469
|
+
> ${e}`:`## \u2705 ${r}`}function ep(r){return`> \u26A0\uFE0F **${r}**`}function Lk(...r){return r.filter(Boolean).join(`
|
|
470
|
+
|
|
471
|
+
`)}function jt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var ms=w(()=>{"use strict";dn();l(_k,"mdHeader");l(Nk,"mdFooter");l(U,"mdOutput");l(pc,"mdTable");l(Yd,"mdCodeBlock");l(re,"mdSection");l(Le,"mdList");l(mc,"mdTaskHeader");l(Xd,"mdSubtasks");l(Qd,"mdRelevantFiles");l(Zd,"mdRules");l(oe,"mdNextSteps");l(ft,"mdStats");l(ke,"mdDone");l(ep,"mdWarn");l(Lk,"mdJoin");l(jt,"mdActionRequired")});import dr from"chalk";function ht(r,e={}){if(e.quiet)return;let t=np[r]||"idle",n=$n.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:tp[o]||o}));console.log(dr.dim(`
|
|
472
|
+
Next:`));for(let o of s){let i=dr.cyan(o.cmd.padEnd(12));console.log(dr.dim(` ${i} \u2192 ${o.desc}`))}}function Mo(r){let e=np[r]||"idle";return $n.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:tp[n]||n}))}function pr(r){let e=$n.getStateInfo(r);console.log(dr.dim(`\u{1F4CD} State: ${dr.white(r.toUpperCase())} - ${e.description}`))}var tp,np,gs=w(()=>{"use strict";sc();tp={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"},np={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(ht,"showNextSteps");l(Mo,"getNextSteps");l(pr,"showStateInfo")});import Ye from"node:path";async function Uk(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(Ye.join(r,"pnpm-lock.yaml"))?"pnpm":await M(Ye.join(r,"yarn.lock"))?"yarn":await M(Ye.join(r,"bun.lockb"))||await M(Ye.join(r,"bun.lock"))?"bun":(await M(Ye.join(r,"package-lock.json")),"npm")}function sp(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function Hk(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function fs(r,e){for(let s of Gk)if(await M(Ye.join(r,s)))return s;let n=(e??await Yt(r)).find(s=>s.endsWith(Wk));if(n)return n}async function Qt(r){for(let e of zk)if(await M(Ye.join(r,e)))return e}async function Oo(r){let e=Ye.join(r,"package.json"),t=await _t(e,null);if(t){let a=await Uk(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:sp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:sp(a,"typecheck")}),c.test&&(u.test={tool:a,command:Hk(a)}),u.versionFile=await fs(r),u.changelogFile=await Qt(r),u}if(await M(Ye.join(r,"pytest.ini"))){let a=await fs(r),c=await Qt(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Be(Ye.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await fs(r),c=await Qt(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await M(Ye.join(r,"Cargo.toml"))){let a=await Qt(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await M(Ye.join(r,"go.mod"))){let a=await fs(r),c=await Qt(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await Yt(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await fs(r,s),c=await Qt(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await M(Ye.join(r,"pom.xml"))){let a=await Qt(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await M(Ye.join(r,"gradlew"))&&(await M(Ye.join(r,"build.gradle"))||await M(Ye.join(r,"build.gradle.kts")))){let a=await Qt(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await fs(r),i=await Qt(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var Gk,Wk,zk,gc=w(()=>{"use strict";De();l(Uk,"detectPackageManager");l(sp,"pmRun");l(Hk,"pmTest");Gk=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Wk=".csproj",zk=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(fs,"detectVersionFile");l(Qt,"detectChangelogFile");l(Oo,"detectProjectCommands")});import*as Z from"@clack/prompts";import Mn from"chalk";var Fo,rp,hs,op=w(()=>{"use strict";Dn();Fo=[{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."}],rp=[{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"}],hs=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(Mn.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(Mn.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=Fo.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:Fo.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?Fo[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:rp.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=[`${Mn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Mn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Mn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Mn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Mn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
473
|
+
`);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 Fo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return rp.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 fc from"node:path";var Vk,Bk,_o,Jk,it,On=w(()=>{"use strict";de();Tt();De();Vk="outcomes",Bk="outcomes.jsonl",_o=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return fc.join(t,Vk)}getOutcomesPath(e){return fc.join(this.getOutcomesDir(e),Bk)}async record(e,t){let n={...t,id:ce()},s=this.getOutcomesPath(e);return await vt(fc.dirname(s)),await Li(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await M(t))return[];let n=await Be(t);return n.trim()?n.trim().split(`
|
|
474
|
+
`).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}},Jk=new _o,it=Jk});var No,qk,hc,ip=w(()=>{"use strict";On();No=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await it.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 it.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 it.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),A=this.parseDuration(k.estimatedDuration);return A===0?!1:Math.abs(S)/A<=.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 it.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 it.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}},qk=new No,hc=qk});var mr,Lo,yc,wc=w(()=>{"use strict";Xn();ne();mr=3,Lo=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>=mr){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}/${mr} 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>=mr){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}/${mr} 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>=mr&&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(`
|
|
475
|
+
`)}},yc=new Lo});var Uo,ap,kc=w(()=>{"use strict";oa();Gt();ne();Uo=class extends Oe{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Nu,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:zr([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?zr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:zr(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=Lu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Uu(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:Hu(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}},ap=new Uo});var Sc=w(()=>{"use strict";op();ip();wc();On();kc()});import zt from"chalk";function Kk(r){return cp[r.toLowerCase()]||cp.default}var cp,bc,Ho,lp=w(()=>{"use strict";cp={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(Kk,"getIcon");bc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(zt.cyan(`
|
|
431
476
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
432
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
433
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
434
|
-
`)}function
|
|
435
|
-
`)}var
|
|
477
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=Kk(t);console.log(zt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(zt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(zt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(zt.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?zt.green("\u2713"):zt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${zt.dim(`(${n})`)}
|
|
478
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${zt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(zt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Ho=new bc});import We from"chalk";function Yk(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%up.length;return up[t]}function Xk(r,e,t="\u25B6"){let n=We.dim(String(r+1).padStart(2)),o=Yk(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=We.green("\u2713 Complete");break;case"in_progress":a=We.yellow(`${t} Working...`);break;case"pending":a=We.gray("\u25CB Pending");break;case"failed":a=We.red("\u2717 Failed");break;case"blocked":a=We.gray("\u2298 Blocked");break;default:a=We.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function Qk(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${We.bold.white("SUBTASK PROGRESS")}`),e.push(` ${We.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Xk(t,r[t]));return e.push(""),e.join(`
|
|
479
|
+
`)}function dp(r){console.log(Qk(r))}var up,pp=w(()=>{"use strict";up=[We.cyan,We.magenta,We.yellow,We.blue,We.green,We.redBright,We.magentaBright,We.cyanBright];l(Yk,"getDomainColor");l(Xk,"formatSubtaskLine");l(Qk,"renderSubtaskProgress");l(dp,"printSubtaskProgress")});function Zk(r){return mp.includes(r)}async function eS(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 tS(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(`
|
|
480
|
+
`)}var mp,nS,Go,gp=w(()=>{"use strict";mp=["ship","feature","spec","cleanup","migrate"];l(Zk,"requiresReasoning");l(eS,"reason");l(tS,"formatPlan");nS={requiresReasoning:Zk,reason:eS,formatPlan:tS,REASONING_REQUIRED_COMMANDS:mp},Go=nS});import gr from"node:fs/promises";var Cc,sS,at,Pc=w(()=>{"use strict";pt();de();O();Io();Cc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Rt({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 gr.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([gr.readFile(d,"utf-8"),gr.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 gr.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 gr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},sS=new Cc,at=sS});import{exec as rS}from"node:child_process";import Se from"node:fs/promises";import fp from"node:os";import hn from"node:path";import{promisify as oS}from"node:util";function hp(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 vc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function aS(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
436
481
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
437
482
|
`}),r.recommendations.length>0&&(e+=`
|
|
438
483
|
Recommendations:
|
|
439
484
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
440
|
-
`})),e}async function
|
|
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
|
|
485
|
+
`})),e}async function yp(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Se.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=hp(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 Se.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 Se.access(hn.dirname(i),Se.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 wp(r){let e=[],t=[],n={};try{let{stdout:i}=await iS("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
486
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=hn.join(r.projectPath,"package.json");try{let i=await Se.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 Se.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}.*${vc(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 Se.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 kp(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Se.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 Se.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(vc(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 Se.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 Sp(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Se.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 Se.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 bp(r){let e=[],t=[],n={},s=hn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Se.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=hn.join(fp.homedir(),".prjct-cli");try{await Se.access(o,Se.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Se.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 Cp(r){let e=[],t=[],n={},s=hn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Se.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=hn.join(fp.homedir(),".prjct-cli/projects",o||"");try{await Se.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 Pp(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 Se.access(hn.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 Se.stat(hn.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 vp(r){let e=[],t=[],n={},s=r.paths.specs;try{await Se.access(s),n.specsExists=!0;let i=await Se.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=xp[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 cS(r,e,t){let n=await Tp(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function lS(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var iS,xp,uS,Wo,Ep=w(()=>{"use strict";O();iS=oS(rS);l(hp,"formatDuration");l(vc,"escapeRegex");l(aS,"formatWarnings");l(yp,"verifyDone");l(wp,"verifyShip");l(kp,"verifyFeature");l(Sp,"verifyNow");l(bp,"verifyInit");l(Cp,"verifySync");l(Pp,"verifyAnalyze");l(vp,"verifySpec");xp={done:yp,ship:wp,feature:kp,now:Sp,init:bp,sync:Cp,analyze:Pp,spec:vp};l(Tp,"verify");l(cS,"prepareCommand");l(lS,"requiresVerification");uS={verify:Tp,prepareCommand:cS,requiresVerification:lS,verifiers:xp,formatWarnings:aS,formatDuration:hp,escapeRegex:vc,verifyDone:yp,verifyShip:wp,verifyFeature:kp,verifyNow:Sp,verifyInit:bp,verifySync:Cp,verifyAnalyze:Pp,verifySpec:vp},Wo=uS});function pS(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 mS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of dS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:pS(t)};return{detected:!1}}function gS(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 fS(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 hS(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 yS(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 dS,xc,wS,ys,Ap=w(()=>{"use strict";dS=[{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(pS,"getHallucinationSuggestion");l(mS,"detectHallucination");l(gS,"isSimilarError");l(fS,"analyzeErrorPattern");l(hS,"generateEscalationMessage");l(yS,"generateSuggestion");xc=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=>gS(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=fS(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:hS(e,o,this.maxAttempts),suggestion:yS(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 mS(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}}},wS=new xc,ys=wS});function Tc(r,e){let t=fr(e),n=kS[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 SS(r,e){let t=fr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function bS(r,e,t){let n=fr(t),s=Tc(r,t),o=Tc(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function zo(r,e=un){let t=fr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=CS(r,e),s=PS(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=TS(o),a=vS(o),c=xS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=ES(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Dp(r,e,t=un){let n=fr(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 CS(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=bS(i,s,e);if(!t.has(a)){let c=Tc(i,e),u=SS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function PS(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+AS(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Ac(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 vS(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 xS(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Ac(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function TS(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 ES(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Ac(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 Ac(r){if(!r.variance)return 0;let e=Ec(r.estimatedDuration),t=Ec(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Ec(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 Rp(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(`
|
|
487
|
+
`)}function AS(r){if(!r.estimatedDuration)return 0;let e=Ec(r.estimatedDuration);if(e<=0)return 0;let t=Ip[0],n=Number.POSITIVE_INFINITY;for(let s of Ip){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function fr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var kS,Ip,Ic=w(()=>{"use strict";es();kS={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Tc,"getSprintStart");l(SS,"getSprintEnd");l(bS,"getSprintNumber");l(zo,"calculateVelocity");l(Dp,"projectCompletion");l(CS,"bucketBySprint");l(PS,"buildSprintVelocities");l(vS,"detectTrend");l(xS,"calculateOverallAccuracy");l(TS,"calculateAverageVelocity");l(ES,"detectEstimationPatterns");l(Ac,"parseVariancePercent");l(Ec,"parseDurationMinutes");l(Rp,"formatVelocityContext");Ip=[{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(AS,"derivePoints");l(fr,"resolveConfig")});import{exec as IS}from"node:child_process";import DS from"node:fs/promises";import Vo from"node:path";import{promisify as RS}from"node:util";async function Bo(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=FS(r),c=await _S(e),u=await NS(e),d=[];for(let p of c){if(!i&&US(p))continue;let g=LS(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 FS(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 _S(r){let e=[];async function t(n,s=""){try{let o=await DS.readdir(n,{withFileTypes:!0});for(let i of o){let a=Vo.join(n,i.name),c=Vo.join(s,i.name);if(i.isDirectory()){if(OS.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Vo.extname(i.name).toLowerCase();MS.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function NS(r){let e=new Map;try{let{stdout:t}=await jS(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
443
488
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
444
489
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
445
490
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
446
491
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
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
|
|
492
|
+
`).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 LS(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($S))for(let k of f)if(c.includes(k)&&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=Vo.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 US(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 jS,$S,MS,OS,Dc=w(()=>{"use strict";O();jS=RS(IS),$S={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"]},MS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),OS=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Bo,"findRelevantFiles");l(FS,"extractKeywords");l(_S,"getAllCodeFiles");l(NS,"getGitRecency");l(LS,"scoreFile");l(US,"isTestFile")});import{exec as HS}from"node:child_process";import{promisify as GS}from"node:util";async function jp(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 VS(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await zS(r,t);return o=o.filter(c=>!BS(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 zS(r,e){let{stdout:t}=await hr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
448
493
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
449
494
|
NF {
|
|
450
495
|
count[$0]++
|
|
@@ -454,8 +499,8 @@ Recommendations:
|
|
|
454
499
|
for (f in count) print count[f], lastmod[f], f
|
|
455
500
|
}
|
|
456
501
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
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),
|
|
458
|
-
`).filter(Boolean),{stdout:i}=await
|
|
502
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),S=u/i,A=k*.6+S*.4,R;f<1?R="just now":f<24?R=`${f}h ago`:g<7?R=`${g}d ago`:g<30?R=`${Math.floor(g/7)}w ago`:R=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(A*100)/100,lastChanged:R,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function VS(r){let{stdout:e}=await hr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await hr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await hr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
503
|
+
`).filter(Boolean),{stdout:i}=await hr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
459
504
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
460
505
|
NF {
|
|
461
506
|
count[$0]++
|
|
@@ -465,10 +510,10 @@ Recommendations:
|
|
|
465
510
|
for (f in count) print count[f], lastmod[f], f
|
|
466
511
|
}
|
|
467
512
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
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),
|
|
469
|
-
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:
|
|
513
|
+
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],S=u-f,A=Math.floor(S/86400),R=Math.floor(S/3600),J=Math.max(0,1-A/14),he=g/d,Pe=J*.5+he*.5,Ue;R<1?Ue="just now":R<24?Ue=`${R}h ago`:Ue=`${A}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Pe*100)/100,lastChanged:Ue,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function BS(r){let e=r.split("/").pop()||"";for(let t of WS)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var hr,WS,$p=w(()=>{"use strict";hr=GS(HS),WS=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(jp,"getRecentFiles");l(zS,"getHotFilesFromCommits");l(VS,"getBranchOnlyFiles");l(BS,"shouldIgnore")});function Rc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Mp(r,e){let t=JS[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function KS(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Fp(r,e){let t=Rc(r),n=Rc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Mp(s,qS),a=Op.map(c=>({model:c,...Mp(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:KS(i.total),byModel:a}}}function jc(r){let e=Rc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Op.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var JS,qS,Op,_p=w(()=>{"use strict";JS={"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}},qS="claude-sonnet-4.5";l(Rc,"countTokens");Op=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Mp,"calculateModelCost");l(KS,"formatCostSaved");l(Fp,"measureCompression");l(jc,"noCompression")});import YS from"node:fs/promises";import $c from"node:path";async function Up(r,e=process.cwd()){let t=$c.isAbsolute(r)?r:$c.join(e,r),n;try{n=await YS.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:jc("")};throw u}let s=$c.extname(r).toLowerCase(),o=XS[s]||"unknown",i=tb[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:jc(n)};let a=nb(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
514
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:Fp(n,c)}}function nb(r,e){let t=[],n=r.split(`
|
|
470
515
|
`),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(`
|
|
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:
|
|
516
|
+
`).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:sb(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function sb(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var XS,Np,QS,ZS,eb,Lp,tb,Hp=w(()=>{"use strict";O();_p();XS={".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"},Np=[{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}],QS=[{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}],ZS=[{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}],eb=[{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}],Lp=[{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}],tb={typescript:Np,javascript:Np,python:QS,go:ZS,rust:eb,java:Lp,csharp:Lp,php:[],ruby:[],unknown:[]};l(Up,"extractSignatures");l(nb,"extractFromContent");l(sb,"cleanSignature")});import{createHash as rb}from"node:crypto";import zp from"node:fs/promises";import Vp from"node:path";function Gp(r){return rb("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Wp(r){try{let e=Vp.join(r,"storage","classification-cache.json"),t=await zp.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?ta:(console.warn("[classifier] Failed to load cache:",y(e)),ta)}}async function Mc(r,e){try{let t=Vp.join(r,"storage","classification-cache.json");await zp.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function ib(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>ob?null:n.classification}function ab(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function cb(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Bp(e),s=ra("classification")||"",o=`Classify this software engineering task into a domain.
|
|
472
517
|
|
|
473
518
|
Task: "${r}"
|
|
474
519
|
|
|
@@ -476,19 +521,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
476
521
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
477
522
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
478
523
|
|
|
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=
|
|
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([
|
|
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
|
|
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`}},
|
|
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=
|
|
524
|
+
${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=ln.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 ub(r,e){let t=Bp(e),n=new Map;for(let[p,g]of Object.entries(lb)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return xu;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=db(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 Bp(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 db(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 ob,lb,Oc,pb,Jp,qp=w(()=>{"use strict";Ks();Wr();O();ob=3600*1e3;l(Gp,"hashDescription");l(Wp,"loadCache");l(Mc,"saveCache");l(ib,"lookupCache");l(ab,"lookupPatterns");l(cb,"classifyWithLLM");lb={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(ub,"classifyWithHeuristic");l(Bp,"buildAvailableDomains");l(db,"getFilePatterns");Oc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Gp(e),i=await Wp(n),a=ib(i,o,t);if(a)return{classification:a,source:"cache"};let c=ab(i,o);if(c)return{classification:c,source:"history"};let u=await cb(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Mc(n,i),{classification:u,source:"llm"};let d=ub(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Mc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=Gp(e),o=await Wp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Mc(n,o))}},pb=new Oc,Jp=pb});import{exec as mb}from"node:child_process";import yr from"node:fs/promises";import gb from"node:os";import Fn from"node:path";import{promisify as fb}from"node:util";var Kp,Yp,Fc,hb,Jo,_c=w(()=>{"use strict";Ic();pt();de();es();Wt();Dc();$p();Hp();O();On();qp();as();Kp=fb(mb),Yp=["database","backend","frontend","testing","devops"],Fc=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((Pe,Ue)=>{if(Pe.status==="fulfilled")return Pe.value;g.push(p[Ue]),console.warn(`Context tool "${p[Ue]}" failed: ${y(Pe.reason)}`)}),[k,S,A]=f,R={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},J=this.shouldFragment(a,t),he=null;return J&&e==="task"&&(he=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:J,subtasks:he,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:S??null,velocityContext:A??null,contextDegradation:R}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Bo(e,t,{maxFiles:10,minScore:.15}),jp(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Up(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(`
|
|
525
|
+
`);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([Kp("git branch --show-current",{cwd:e}),Kp("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
526
|
+
`).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 Ke.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 it.getAll(e);if(t.length===0)return null;let n=zo(t,un);return n.sprints.length===0?null:Rp(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Fn.join(e,"analysis","repo-analysis.json"),n=await yr.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 F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Jp.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=Fn.join(e,"agents");return(await yr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=Fn.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=Fn.join(s,u);try{let m=await yr.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=Qr(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=Fn.join(gb.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=Fn.join(t,`${i}.md`),c=Fn.join(t,i,"SKILL.md");try{let u=await yr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await yr.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=Yp.indexOf(a),d=Yp.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 F.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?"...":""}`}},hb=new Fc,Jo=hb});function yb(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 Nc,wb,Ae,Xp=w(()=>{"use strict";Tt();ne();mn();mn();l(yb,"generateApprovalPrompt");Nc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Oa.includes(e)}isDestructive(e){return Fa.includes(e)}isToolAllowedInPlanning(e){return yo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>yo.includes(n)):t}startPlanning(e,t,n){let s={id:ce(),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 yb(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(`
|
|
527
|
+
`)}_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`}},wb=new Nc,Ae=wb});function kb(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return qo[t]?qo[t]:qo[e]?qo[e]:e}function Ko(r){let e=new Set,t=[];for(let n of r){let s=kb(n);e.has(s)||(e.add(s),t.push(n))}return t}var qo,Lc=w(()=>{"use strict";qo={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(kb,"normalizeFrameworkName");l(Ko,"deduplicateTechStack")});import{z as Ie}from"zod";function Qp(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
528
|
+
`);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=Ko(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])=>Sb[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(`
|
|
484
529
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
485
|
-
`)}var
|
|
486
|
-
`,"utf-8"),
|
|
487
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
530
|
+
`)}var EM,Sb,Zp=w(()=>{"use strict";Lc();EM=Ie.object({projectPath:Ie.string(),language:Ie.string().optional(),framework:Ie.string().optional(),techStack:Ie.array(Ie.string()).default([]),domains:Ie.object({hasFrontend:Ie.boolean().default(!1),hasBackend:Ie.boolean().default(!1),hasDatabase:Ie.boolean().default(!1),hasTesting:Ie.boolean().default(!1),hasDocker:Ie.boolean().default(!1)}).optional(),fileCount:Ie.number().optional(),availableAgents:Ie.array(Ie.string()).default([]),analysisLanguages:Ie.array(Ie.string()).default([]),analysisFrameworks:Ie.array(Ie.string()).default([]),analysisPackageManager:Ie.string().optional()}),Sb={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Qp,"buildAntiHallucinationBlock")});import{z as $t}from"zod";var bb,em,tm=w(()=>{"use strict";bb=$t.object({agents:$t.boolean(),patterns:$t.boolean(),checklist:$t.boolean(),modules:$t.array($t.string())}),em=$t.object({version:$t.string(),description:$t.string().optional(),commands:$t.record($t.string(),bb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Uc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function nm(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Uc(o,Cb),a=Uc(o,Pb),c=Uc(o,vb);return s.some(d=>xb.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 Cb,Pb,vb,xb,sm=w(()=>{"use strict";Cb=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Pb=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],vb=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],xb=["Write","Edit","Bash"];l(Uc,"countMatches");l(nm,"classifyCommand")});import Hc from"node:fs/promises";import Tb from"node:path";async function om(){if(wr)return wr;let r=await Hc.readFile(Gc,"utf-8"),e=JSON.parse(r);return wr=em.parse(e),wr}function Eb(r){return im.get(r)}function Ab(r,e){im.set(r,e)}function Db(r,e){let t=r,n=rm.get(t);return n&&jb(n.entry,e)?(n.count++,n.count>=Ib):(rm.set(t,{entry:e,count:1}),!1)}async function Rb(r,e){let t=await Hc.readFile(Gc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Hc.writeFile(Gc,`${JSON.stringify(n,null,2)}
|
|
531
|
+
`,"utf-8"),wr=null}function jb(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 am(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Eb(e);if(n)return{entry:n,source:"cache"};if(t){let s=nm(e,t);return Ab(e,s),Db(e,s)&&Rb(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Gc,wr,im,rm,Ib,cm=w(()=>{"use strict";tm();dn();sm();Gc=Tb.join(Ee,"core/config/command-context.config.json"),wr=null;l(om,"loadCommandContextConfig");im=new Map;l(Eb,"getCachedClassification");l(Ab,"cacheClassification");rm=new Map,Ib=3;l(Db,"trackClassification");l(Rb,"persistClassification");l(jb,"isSameEntry");l(am,"resolveCommandContextFull")});import $b from"node:os";import{z as Vt}from"zod";function Mb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Ob(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function lm(r){let e=r.platform??$b.platform(),t=r.runtime??Mb(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
532
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Ob(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
488
533
|
`)}
|
|
489
|
-
</env>`}var
|
|
490
|
-
... (truncated to ~${e} tokens)`}function
|
|
491
|
-
`);return
|
|
534
|
+
</env>`}var WM,um=w(()=>{"use strict";WM=Vt.object({projectName:Vt.string(),projectPath:Vt.string(),isGitRepo:Vt.boolean().default(!0),gitBranch:Vt.string().optional(),platform:Vt.string().optional(),runtime:Vt.string().optional(),date:Vt.string().optional(),model:Vt.string().optional(),provider:Vt.string().optional()});l(Mb,"detectRuntime");l(Ob,"normalizePlatform");l(lm,"buildEnvironmentBlock")});function pm(r){let e=r.getAllocationFor("injection");return{...Xo,totalPrompt:e}}function _n(r,e){let t=e*mm;return r.length<=t?r:`${r.substring(0,t)}
|
|
535
|
+
... (truncated to ~${e} tokens)`}function dm(r){return Math.ceil(r.length/mm)}function gm(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Fb[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 Xo,mm,Fb,Yo,fm=w(()=>{"use strict";Xo={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(pm,"budgetsFromCoordinator");mm=4;l(_n,"truncateToTokenBudget");l(dm,"estimateTokens");Fb={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(gm,"filterSkillsByDomains");Yo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Xo,...e}}addSection(e,t){let n=_n(e,t),s=dm(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=_n(n,o);return this.used+=dm(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 hm from"node:fs/promises";import Nn from"node:path";var Wc,_b,ym,wm=w(()=>{"use strict";Wt();O();De();dn();Sc();Zp();cm();um();fm();Lc();as();Wc=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 hm.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?pm(this._coordinator):Xo}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Me(`global/modules/${e}`);if(t)return t;let n=Nn.join(Ee,"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=is("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=Me(s);if(o){let i=Nn.basename(s,".md");t[i]=o}}}else{let s=Nn.join(Ee,"templates","checklists");if(await M(s)){let o=(await hm.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Nn.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([F.read(e),ye.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 hc.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(`
|
|
536
|
+
`);return _n(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=Nn.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 om();p=am(C,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
492
537
|
`),s.role&&d.push(`Role: ${s.role}
|
|
493
538
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
494
539
|
`),d.push(`
|
|
@@ -497,8 +542,8 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
497
542
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
498
543
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
499
544
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
500
|
-
`);let
|
|
501
|
-
${
|
|
545
|
+
`);let k=t.projectPath;if(k){let C=u?.project?.id?Nn.basename(k):Nn.basename(k),D=lm({projectName:C,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
546
|
+
${D}
|
|
502
547
|
`)}if(u){let C=u.sealedAnalysis;if(d.push(`
|
|
503
548
|
## PROJECT ANALYSIS (Sealed)
|
|
504
549
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
@@ -513,46 +558,46 @@ ${R}
|
|
|
513
558
|
`),d.push(`**Analysis Status**: ${C.status}${C.commitHash?` (commit: ${C.commitHash.slice(0,8)})`:""}
|
|
514
559
|
`),C.patterns?.length>0){d.push(`
|
|
515
560
|
### Code Patterns (Follow These)
|
|
516
|
-
`);for(let
|
|
561
|
+
`);for(let D of C.patterns)d.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
|
|
517
562
|
`)}if(C.antiPatterns?.length>0){d.push(`
|
|
518
563
|
### Anti-Patterns (Avoid These)
|
|
519
|
-
`);for(let
|
|
564
|
+
`);for(let D of C.antiPatterns)d.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
|
|
520
565
|
`)}}d.push(`
|
|
521
|
-
`)}let
|
|
566
|
+
`)}let S=p.patterns,A=n?.codePatterns||"";if(S&&A&&A.trim()){let C=this.extractPatternSummary(A);C&&(d.push(`## CODE PATTERNS
|
|
522
567
|
`),d.push(C),d.push(`
|
|
523
568
|
Full patterns: Read analysis/patterns.md
|
|
524
|
-
`))}let
|
|
569
|
+
`))}let R=n?.analysis||"";if(S&&R&&R.trim()){let C=R.match(/Stack[:\s]+([^\n]+)/i)||R.match(/Technology[:\s]+([^\n]+)/i),D=C?C[1].trim():"detected";d.push(`
|
|
525
570
|
## STACK
|
|
526
|
-
Stack: ${
|
|
571
|
+
Stack: ${D}
|
|
527
572
|
`),A||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
528
573
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
529
574
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
530
575
|
|
|
531
|
-
`);for(let
|
|
532
|
-
`),
|
|
533
|
-
`),
|
|
534
|
-
`),
|
|
535
|
-
`);let
|
|
536
|
-
${
|
|
576
|
+
`);for(let D of u.agents){d.push(`#### Agent: ${D.name} (${D.domain})
|
|
577
|
+
`),D.effort&&d.push(`Effort: ${D.effort}
|
|
578
|
+
`),D.model&&d.push(`Model: ${D.model}
|
|
579
|
+
`),D.skills.length>0&&d.push(`Skills: ${D.skills.join(", ")}
|
|
580
|
+
`);let ve=_n(D.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
581
|
+
${ve}
|
|
537
582
|
\`\`\`
|
|
538
583
|
|
|
539
|
-
`)}}let C=
|
|
584
|
+
`)}}let C=gm(u.skills,u.detectedDomains);if(C.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
540
585
|
|
|
541
|
-
`);for(let
|
|
542
|
-
`);let
|
|
543
|
-
${
|
|
586
|
+
`);for(let D of C){d.push(`#### Skill: ${D.name}
|
|
587
|
+
`);let ve=_n(D.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
588
|
+
${ve}
|
|
544
589
|
\`\`\`
|
|
545
590
|
|
|
546
|
-
`)}}}let
|
|
547
|
-
`),d.push(
|
|
591
|
+
`)}}}let J=this.getModulesForCommand(m,p);if(J.length>0)for(let C of J){let D=await this.loadModule(C);D&&(d.push(`
|
|
592
|
+
`),d.push(D))}if(c?.isPlanning&&(d.push(`
|
|
548
593
|
## PLAN MODE
|
|
549
594
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
550
595
|
`),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
|
|
551
596
|
`)),c?.requiresApproval&&d.push(`
|
|
552
597
|
## APPROVAL REQUIRED
|
|
553
598
|
Show changes, list affected files, ask for confirmation.
|
|
554
|
-
`),
|
|
555
|
-
${
|
|
599
|
+
`),k){let C=u?.sealedAnalysis,D=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],ve={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:Ko(D),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Ns=>Ns.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
|
|
600
|
+
${Qp(ve)}
|
|
556
601
|
`)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
|
|
557
602
|
### CONTEXT DEGRADATION NOTICE
|
|
558
603
|
|
|
@@ -568,27 +613,27 @@ ${jp(be)}
|
|
|
568
613
|
`),C.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
569
614
|
`),d.push(`| Score | File | Why |
|
|
570
615
|
`),d.push(`|-------|------|-----|
|
|
571
|
-
`);for(let
|
|
616
|
+
`);for(let D of C.relevantFiles.slice(0,8))d.push(`| ${D.score} | ${D.path} | ${D.reason} |
|
|
572
617
|
`);d.push(`
|
|
573
618
|
`)}if(C.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
574
|
-
`);for(let
|
|
575
|
-
// ${
|
|
576
|
-
${
|
|
619
|
+
`);for(let D of C.signatures)d.push(`\`\`\`typescript
|
|
620
|
+
// ${D.path}
|
|
621
|
+
${D.content}
|
|
577
622
|
\`\`\`
|
|
578
623
|
`);d.push(`
|
|
579
|
-
`)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let
|
|
624
|
+
`)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let D=C.recentFiles.slice(0,5).map(ve=>`${ve.path} (${ve.lastChanged})`).join(", ");d.push(`${D}
|
|
580
625
|
|
|
581
|
-
`)}}let
|
|
582
|
-
## FILES: ${
|
|
626
|
+
`)}}let he=t.files||[];if(he.length>0){let C=he.slice(0,5).join(", ");d.push(`
|
|
627
|
+
## FILES: ${he.length} available. Top: ${C}
|
|
583
628
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
584
629
|
|
|
585
|
-
`)}else
|
|
586
|
-
## PROJECT: ${
|
|
630
|
+
`)}else k&&d.push(`
|
|
631
|
+
## PROJECT: ${k}
|
|
587
632
|
Read files before modifying.
|
|
588
633
|
|
|
589
|
-
`);let
|
|
634
|
+
`);let Pe=this.filterRelevantState(n);if(Pe&&(d.push(`
|
|
590
635
|
## PRJCT STATE (Project Management Data)
|
|
591
|
-
`),d.push(
|
|
636
|
+
`),d.push(Pe),d.push(`
|
|
592
637
|
`)),u?.velocityContext&&(d.push(`
|
|
593
638
|
### VELOCITY (Historical Estimation Data)
|
|
594
639
|
|
|
@@ -596,7 +641,7 @@ Read files before modifying.
|
|
|
596
641
|
|
|
597
642
|
`)),o&&Object.keys(o).some(C=>o[C])){d.push(`
|
|
598
643
|
## PROJECT DEFAULTS (apply automatically)
|
|
599
|
-
`);for(let[C,
|
|
644
|
+
`);for(let[C,D]of Object.entries(o))D&&d.push(`- ${C}: ${D}
|
|
600
645
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
601
646
|
## THINK FIRST (reasoning from analysis)
|
|
602
647
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
@@ -615,34 +660,34 @@ Read files before modifying.
|
|
|
615
660
|
|
|
616
661
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
617
662
|
`),d.push(`|---|--------|-------------|--------|
|
|
618
|
-
`);for(let
|
|
619
|
-
`)}let C=u.subtasks.find(
|
|
663
|
+
`);for(let D of u.subtasks){let ve=D.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":D.status==="completed"?"\u2705 Done":D.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${D.order} | ${D.domain} | ${D.description} | ${ve} |
|
|
664
|
+
`)}let C=u.subtasks.find(D=>D.status==="in_progress");if(C&&(d.push(`
|
|
620
665
|
**FOCUS ON SUBTASK #${C.order}**: ${C.description}
|
|
621
666
|
`),d.push(`Agent: ${C.agent} | Domain: ${C.domain}
|
|
622
667
|
`),C.dependsOn.length>0&&d.push(`Dependencies: ${C.dependsOn.join(", ")}
|
|
623
|
-
`),C.handoff)){let
|
|
668
|
+
`),C.handoff)){let D=C.handoff;d.push(`
|
|
624
669
|
### Previous Subtask Handoff
|
|
625
670
|
|
|
626
|
-
`),d.push(`**From:** ${
|
|
671
|
+
`),d.push(`**From:** ${D.fromSubtask}
|
|
627
672
|
|
|
628
673
|
`),d.push(`**What was done:**
|
|
629
|
-
`);for(let
|
|
630
|
-
`);if(
|
|
674
|
+
`);for(let ve of D.whatWasDone)d.push(`- ${ve}
|
|
675
|
+
`);if(D.filesChanged.length>0){d.push(`
|
|
631
676
|
**Files changed:**
|
|
632
|
-
`);for(let
|
|
677
|
+
`);for(let ve of D.filesChanged)d.push(`- \`${ve.path}\` (${ve.action})
|
|
633
678
|
`)}d.push(`
|
|
634
679
|
**Context for this subtask:**
|
|
635
|
-
${
|
|
680
|
+
${D.outputForNextAgent}
|
|
636
681
|
`)}d.push(`
|
|
637
|
-
`)}let
|
|
638
|
-
${
|
|
639
|
-
`)}if(p.checklist){let C=await this.loadChecklistRouting(),
|
|
682
|
+
`)}let Ue=this.getSchemaTypeForCommand(m);if(Ue){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(Wr(),Mu)),D=C(Ue);D&&d.push(`
|
|
683
|
+
${D}
|
|
684
|
+
`)}if(p.checklist){let C=await this.loadChecklistRouting(),D=await this.loadChecklists();C&&Object.keys(D).length>0&&(d.push(`
|
|
640
685
|
## QUALITY CHECKLISTS
|
|
641
686
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
642
|
-
`),d.push(`Available: ${Object.keys(
|
|
687
|
+
`),d.push(`Available: ${Object.keys(D).join(", ")}
|
|
643
688
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
644
689
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
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
|
|
690
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Yo({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}
|
|
646
691
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
647
692
|
|
|
648
693
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -659,7 +704,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
659
704
|
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
660
705
|
Avoid:
|
|
661
706
|
${a}`)}let o=t.join(`
|
|
662
|
-
`);return
|
|
707
|
+
`);return _n(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
663
708
|
## RULES (CRITICAL)
|
|
664
709
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
665
710
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -676,7 +721,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
676
721
|
- Prefer structured output (JSON) over free text when applicable.
|
|
677
722
|
|
|
678
723
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
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}}}},
|
|
724
|
+
`}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}}}},_b=new Wc,ym=_b});import km from"node:fs/promises";import kt from"node:path";var Nb,Lb,zc,Vc,Qo,Bc=w(()=>{"use strict";pt();de();O();Nb=["task","done","ship","resume","bug","enrich"],Lb=["init","sync","pause","next","dash","history","undo","redo"],zc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return kt.dirname(Ls.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(st(),wt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=kt.join(u,"templates")}catch{c=kt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:kt.join(c,"agentic","orchestrator.md"),agentRouting:kt.join(c,"agentic","agent-routing.md"),taskFragmentation:kt.join(c,"agentic","task-fragmentation.md"),commandTemplate:kt.join(c,"commands",`${e}.md`),repoAnalysis:kt.join(o,"analysis","repo-analysis.json"),agentsDir:kt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:kt.join(o,"storage","state.json")}}}requiresOrchestration(e){return Nb.includes(e)?!0:!Lb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=kt.join(x.getGlobalProjectPath(t),"agents");return(await km.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=kt.join(x.getGlobalProjectPath(t),"agents");return(await km.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
680
725
|
## Agentic Execution Mode
|
|
681
726
|
|
|
682
727
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -759,13 +804,13 @@ When fragmenting tasks:
|
|
|
759
804
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
760
805
|
3. Each completed subtask generates a summary
|
|
761
806
|
4. Pass summary to next agent for context handoff
|
|
762
|
-
`,context:e,requiresOrchestration:t}}},
|
|
763
|
-
`+
|
|
764
|
-
`+
|
|
765
|
-
`+
|
|
766
|
-
`+
|
|
767
|
-
`+
|
|
768
|
-
`}},
|
|
807
|
+
`,context:e,requiresOrchestration:t}}},Vc=new zc,Qo=Vc});import{exec as Ub}from"node:child_process";import Sm from"node:fs/promises";import{promisify as Hb}from"node:util";var Gb,Ln,ze,Jc=w(()=>{"use strict";so();Gb=Hb(Ub),Ln={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())}};Ln.register("Read",async r=>{try{return await Zs.execute(async()=>await Sm.readFile(r,"utf-8"),`read-${r}`)}catch(e){return no(e)||Qs(e),null}});Ln.register("Write",async(r,e)=>{try{return await Zs.execute(async()=>await Sm.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return no(t)||Qs(t),!1}});Ln.register("Bash",async r=>{try{return await Zs.execute(async()=>await Gb(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Ln.register("GetTimestamp",async()=>new Date().toISOString());Ln.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Ln.register("GetDateTime",async()=>new Date().toISOString());ze=Ln});import qc from"node:fs/promises";import Wb from"node:os";import bm from"node:path";async function zb(r){try{let e=bm.dirname(Zo);await M(e)||await qc.mkdir(e,{recursive:!0}),await qc.writeFile(Zo,`/p:${r}`)}catch{}}async function Vb(){try{await M(Zo)&&await qc.unlink(Zo)}catch{}}var Zo,Kc,Bb,ei,Yc=w(()=>{"use strict";O();lp();De();pp();gp();Pc();Ep();Ap();ts();_c();Xp();wm();Bc();as();Jc();Zo=bm.join(Wb.homedir(),".prjct-cli",".running");l(zb,"signalStart");l(Vb,"signalEnd");Kc=class{static{l(this,"CommandExecutor")}async signalStart(e){await zb(e)}async signalEnd(){await Vb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ys.shouldEscalate(e,s)){let o=ys.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await ya.load(e),i=await at.build(n,t),a=Ae.requiresPlanning(e),c=Ae.isDestructive(e),u=Ae.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ae.startPlanning(i.projectId,e,t):u&&(d=Ae.getActivePlan(i.projectId));let m=null;if(Wo.requiresVerification(e)){let C=await at.loadStateForCommand(i,e);m=await Wo.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(Wo.formatWarnings(m))}let p=null;if(Go.requiresReasoning(e)){let C=await at.loadStateForCommand(i,e);p=await Go.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Go.formatPlan(p)))}let g=t.task||t.description||"",f=await Qo.buildContext(e,g,n),k=Qo.buildAgenticPrompt(f),S=null;if(Qo.requiresOrchestration(e)&&g)try{S=await Jo.execute(e,g,n),S.detectedDomains.length>0&&Ho.orchestrate(S.detectedDomains);for(let C of S.agents){let D=C.domain||C.name.replace(".md","");Ho.startAgent(C.name,D,`Loading ${D} specialist...`),Ho.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(D=>({id:D.id,domain:D.domain,description:D.description,status:D.status}));dp(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},R=await at.loadState(i),J=null,he=null;i.projectId&&(J={commit_footer:await $e.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await $e.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await $e.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await $e.getSmartDecision(i.projectId,`preferred_agent_${e}`)},he=await $e.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Pe={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ae.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ue=await ym.build(o,A,R,null,J,null,he,Pe,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ys.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:A,state:R,prompt:Ue,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:A.agentsPath,agentRoutingPath:A.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:J,relevantMemories:he,orchestratorContext:S,memory:{create:l(C=>$e.createMemory(i.projectId,C),"create"),autoRemember:l((C,D,ve)=>$e.autoRemember(i.projectId,C,D,ve),"autoRemember"),search:l(C=>$e.searchMemories(i.projectId,C),"search"),findByTags:l(C=>$e.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>$e.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Ae.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Ae.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Ae.proposePlan(i.projectId,C),"propose"),approve:l(C=>Ae.approvePlan(i.projectId,C),"approve"),reject:l(C=>Ae.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Ae.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ae.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ae.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Ae.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Ae.failStep(i.projectId,C),"failStep"),abort:l(C=>Ae.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Ae.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ae.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ys.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=ys.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(!ze.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=ze.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await ya.load(e)).frontmatter["allowed-tools"]||[],i=await at.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)}}}},Bb=new Kc,ei=Bb});import ti from"node:fs/promises";import Jb from"node:https";import qb from"node:os";import Xc from"node:path";import Mt from"chalk";var Qc,Cm,Pm=w(()=>{"use strict";O();De();Qc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Xc.join(qb.homedir(),".prjct-cli","config"),this.cacheFile=Xc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Xc.join(__dirname,"..","..","package.json");return JSON.parse(await ti.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=Jb.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 ti.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await M(this.cacheDir)||await ti.mkdir(this.cacheDir,{recursive:!0}),await ti.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:`
|
|
808
|
+
`+Mt.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")+`
|
|
809
|
+
`+Mt.yellow("\u2502")+" "+Mt.bold("Update available!")+" "+Mt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Mt.yellow("\u2502")+`
|
|
810
|
+
`+Mt.yellow("\u2502")+" "+Mt.yellow("\u2502")+`
|
|
811
|
+
`+Mt.yellow("\u2502")+" Run: "+Mt.cyan("npm update -g prjct-cli")+" "+Mt.yellow("\u2502")+`
|
|
812
|
+
`+Mt.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")+`
|
|
813
|
+
`}},Cm=Qc});var me,Xe=w(()=>{"use strict";Yc();Pc();Jc();pt();de();Pm();Zt();ne();De();Dn();me=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Cm,this.updateNotificationShown=!1,this.commandExecutor=ei}get agent(){return ls.getAgent()}get agentInfo(){return ls.getInfo()}get currentAuthor(){return yn.getCurrentAuthor()}async initializeAgent(){return ls.initialize()}async ensureProjectInit(e){return yn.ensureInit(e)}async ensureAuthor(){return yn.ensureAuthor()}async getGlobalProjectPath(e){return yn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return rt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return yn.isEmptyDirectory(e)}async _detectExistingCode(e){return yn.hasExistingCode(e)}_breakdownFeatureTasks(e){return po.breakdownFeature(e)}_detectBugSeverity(e){return po.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ls.assignForTask(e,t,n)}}});var vm={};Yn(vm,{PlanningCommands:()=>Hn});import Un from"node:path";async function Kb(){if(!Zc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(si(),xm));Zc=new r}return Zc}var Zc,Hn,ni=w(()=>{"use strict";oo();Tn();Tt();Wt();ur();O();ms();gs();gc();Sc();Xe();Zc=null;l(Kb,"getAnalysisCommands");Hn=class extends me{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 hs(t).runNonInteractive());else if(a=await new hs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await cs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await x.ensureProjectStructure(m);let p=x.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
|
|
769
814
|
|
|
770
815
|
No current task. Use \`/p:now\` to set focus.
|
|
771
816
|
`,"core/next.md":`# NEXT
|
|
@@ -785,17 +830,17 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
785
830
|
`,"planning/roadmap.md":`# ROADMAP
|
|
786
831
|
|
|
787
832
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
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,
|
|
833
|
+
`,"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,R]of Object.entries(g))await ze.get("Write")(Un.join(p,A),R);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let A=await Kb();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 S=n.idea;if(f&&!k){if(!S)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=Un.join(p,"planning","architect-session.md"),R=`# Architect Session
|
|
789
834
|
|
|
790
835
|
## Idea
|
|
791
|
-
${
|
|
836
|
+
${S}
|
|
792
837
|
|
|
793
838
|
## Status
|
|
794
839
|
Initialized - awaiting stack recommendation
|
|
795
840
|
|
|
796
841
|
Generated: ${new Date().toLocaleString()}
|
|
797
|
-
`;return await
|
|
798
|
-
`);let s=await this.getGlobalProjectPath(t),o=
|
|
842
|
+
`;return await ze.get("Write")(A,R),await qe.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await qe.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 at.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ce(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await ye.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:G.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 at.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 ye.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:G.getTimestamp()}),n.md?console.log(U(re("Bug Reported",e),ft({Severity:a,Priority:m,Agent:u}),oe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),ht("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
|
|
843
|
+
`);let s=await this.getGlobalProjectPath(t),o=Un.join(s,"planning","architect-session.md"),i;try{i=await ue.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
799
844
|
|
|
800
845
|
Create a plan first:
|
|
801
846
|
1. Run /p:init in an empty directory
|
|
@@ -816,7 +861,7 @@ The architect plan is ready. Claude will now:
|
|
|
816
861
|
4. Create starter files with boilerplate
|
|
817
862
|
`),console.log(`
|
|
818
863
|
\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.
|
|
819
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
864
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:G.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=Un.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
820
865
|
|
|
821
866
|
## Idea
|
|
822
867
|
${e}
|
|
@@ -831,14 +876,14 @@ Initialized - awaiting architecture design
|
|
|
831
876
|
4. Generate roadmap
|
|
832
877
|
|
|
833
878
|
Generated: ${new Date().toLocaleString()}
|
|
834
|
-
`;return await
|
|
879
|
+
`;return await ze.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:G.getTimestamp()}),n.md?console.log(U(re("Idea Captured",e),ft({Mode:"architecture"}),oe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
835
880
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
836
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await
|
|
881
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ge.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:G.getTimestamp()}),n.md?console.log(U(re("Idea Captured",e),ft({Mode:"capture"}),oe([{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)}`),ht("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=Un.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
837
882
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
838
883
|
`),{success:!0,specs:[]}):(console.log(`
|
|
839
884
|
\u{1F4CB} SPECIFICATIONS
|
|
840
|
-
`),console.log("\u2550".repeat(50)),f.forEach((S
|
|
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=
|
|
885
|
+
`),console.log("\u2550".repeat(50)),f.forEach((k,S)=>{let A=k.replace(".md","").replace(/-/g," ");console.log(` ${S+1}. ${A}`)}),console.log(`${"\u2550".repeat(50)}
|
|
886
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=x.getGlobalProjectPath(s),i=Un.join(o,"planning","specs");await ue.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Un.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
842
887
|
|
|
843
888
|
## Overview
|
|
844
889
|
[Brief description of the feature]
|
|
@@ -868,41 +913,42 @@ Generated: ${new Date().toLocaleString()}
|
|
|
868
913
|
---
|
|
869
914
|
Created: ${new Date().toLocaleString()}
|
|
870
915
|
Status: Draft
|
|
871
|
-
`;return await
|
|
916
|
+
`;return await ze.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:G.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
872
917
|
\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
|
|
873
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var
|
|
918
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async _seedShipWorkflow(e,t){let n=await Oo(t),s=0;we.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&we.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&we.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var ri,yn,Tm=w(()=>{"use strict";Xt();oo();pt();de();O();De();Dn();ri=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(()=>(ni(),vm)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Jr.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 cs();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 Yt(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 Yt(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)}},yn=new ri});var Yb,Em,Am,el,Im,Dm=w(()=>{"use strict";ie();ne();Yb=1800*1e3,Em=50,Am=200,el=class{static{l(this,"SessionTracker")}async read(e){try{return I.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){I.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Yb}}}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>Em&&(s.current.commands=s.current.commands.slice(-Em)),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>Am&&(s.current.files=s.current.files.slice(-Am)),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:Kt(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Kt(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}},Im=new el});import{exec as Xb}from"node:child_process";import{promisify as Qb}from"node:util";var tl,Zb,oi,kr,Rm=w(()=>{"use strict";ie();O();Dm();tl=Qb(Xb),Zb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},oi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Zb,...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=I.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 tl("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([tl(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),tl(`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(`
|
|
874
919
|
`).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(`
|
|
875
|
-
`)}async getSessionInfo(e){return
|
|
920
|
+
`)}async getSessionInfo(e){return Im.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
876
921
|
`);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(`
|
|
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}},
|
|
878
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
879
|
-
`)}function
|
|
880
|
-
`)}function
|
|
922
|
+
`)}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}},kr=l((r,e)=>new oi(r,e),"createStalenessChecker")});import jm from"node:fs/promises";import ii from"node:path";function Sr(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 sC(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...Sr(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(...Sr(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(...Sr(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(...Sr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...Sr(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&&!tC.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function $m(r,e){let t=[],n=await jm.readdir(r,{withFileTypes:!0});for(let s of n){if(nC.has(s.name))continue;let o=ii.join(r,s.name);if(s.isDirectory())t.push(...await $m(o,e));else if(s.isFile()){let i=ii.extname(s.name).toLowerCase();eC.has(i)&&t.push(ii.relative(e,o))}}return t}async function rC(r){let e=await $m(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 jm.readFile(ii.join(r,d),"utf-8"),p=sC(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 iC(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]))};_.setDoc(r,oC,t)}async function Mm(r,e){let t=await rC(r);return iC(e,t),t}var eC,tC,nC,oC,Om=w(()=>{"use strict";ie();eC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),tC=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"]),nC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(Sr,"splitIdentifier");l(sC,"tokenizeFile");l($m,"listFiles");l(rC,"buildIndex");oC="bm25-index";l(iC,"saveIndex");l(Mm,"indexProject")});import nl from"node:fs/promises";import en from"node:path";function dC(r){let e=[],t,n=new RegExp(uC.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function pC(r,e,t){let n;if(r.startsWith("@/"))n=en.join(t,"src",r.slice(2));else{let s=en.dirname(en.join(t,e));n=en.resolve(s,r)}for(let s of lC){let o=n+s;try{if((await nl.stat(o)).isFile())return en.relative(t,o)}catch{}}return null}async function Fm(r,e){let t=[],n=await nl.readdir(r,{withFileTypes:!0});for(let s of n){if(cC.has(s.name))continue;let o=en.join(r,s.name);if(s.isDirectory())t.push(...await Fm(o,e));else if(s.isFile()){let i=en.extname(s.name).toLowerCase();aC.has(i)&&t.push(en.relative(e,o))}}return t}async function mC(r){let e=await Fm(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 nl.readFile(en.join(r,u),"utf-8"),m=dC(d),p=[];for(let g of m){let f=await pC(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 gC(r,e){_.setDoc(r,_m,e)}function Nm(r){return _.getDoc(r,_m)}async function Lm(r,e){let t=await mC(r);return gC(e,t),t}var aC,cC,lC,uC,_m,sl=w(()=>{"use strict";ie();aC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),cC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),lC=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],uC=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(dC,"extractImportSources");l(pC,"resolveImport");l(Fm,"listFiles");l(mC,"buildGraph");_m="import-graph";l(gC,"saveGraph");l(Nm,"loadGraph");l(Lm,"indexImports")});function Um(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Nm(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 Hm(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 Gm=w(()=>{"use strict";sl();l(Um,"propagateChanges");l(Hm,"affectedDomains")});import rl from"node:fs/promises";import ai from"node:path";async function Wm(r,e){let t=[],n=await rl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(hC.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=ai.join(r,o);if(s.isDirectory())t.push(...await Wm(i,e));else if(s.isFile()){let a=ai.extname(o).toLowerCase();fC.has(a)&&t.push(ai.relative(e,i))}}return t}function yC(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 wC(r){let e=await Wm(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=ai.join(r,a),[u,d]=await Promise.all([rl.readFile(c,"utf-8"),rl.stat(c)]);return{path:a,hash:yC(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 kC(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 ol(r,e){let t=_.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)})(),_.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function SC(r){let e=new Map;try{let t=_.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 il(r,e){let[t,n]=await Promise.all([wC(r),Promise.resolve(SC(e))]);return{diff:kC(t,n),currentHashes:t}}function zm(r){return _.hasDoc(r,"file-hashes-meta")}var fC,hC,Vm=w(()=>{"use strict";ie();fC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),hC=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Wm,"listProjectFiles");l(yC,"hashContent");l(wC,"computeHashes");l(kC,"diffHashes");l(ol,"saveHashes");l(SC,"loadHashes");l(il,"detectChanges");l(zm,"hasHashRegistry")});import{exec as bC}from"node:child_process";import{promisify as CC}from"node:util";async function xC(r,e=100){try{let{stdout:t}=await PC(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
923
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Jm&&n.push(s),s=new Set):i&&s&&TC(i)&&s.add(i)}return s&&s.size>0&&s.size<=Jm&&n.push(s),n}catch{return[]}}function TC(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 EC(r,e=100){let t=await xC(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=AC(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<Bm||m<Bm)continue;let p=d+m-a,g=p>0?a/p:0;g<vC||(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 AC(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function DC(r,e){_.setDoc(r,IC,e)}async function qm(r,e,t=100){let n=await EC(r,t);return DC(e,n),n}var PC,vC,Bm,Jm,IC,Km=w(()=>{"use strict";ie();PC=CC(bC),vC=.1,Bm=2,Jm=30;l(xC,"parseGitLog");l(TC,"isSourceFile");l(EC,"buildMatrix");l(AC,"pairKey");IC="cochange-index";l(DC,"saveMatrix");l(qm,"indexCoChanges")});function St(r){return`<!-- source: ${r.file}, ${r.type} -->`}function Gn(){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 al=w(()=>{"use strict";l(St,"cite");l(Gn,"defaultSources")});function br(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
|
|
924
|
+
`)}function Cr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
|
|
925
|
+
`)}function Ym(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?`
|
|
881
926
|
### Project Structure
|
|
882
927
|
|
|
883
928
|
${e.join(`
|
|
884
929
|
`)}
|
|
885
|
-
`:""}function
|
|
930
|
+
`:""}function RC(r){let e=[];return r.patterns?.length>0&&e.push(`
|
|
886
931
|
### Code Patterns (Follow These)
|
|
887
932
|
|
|
888
|
-
${
|
|
933
|
+
${br(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
|
|
889
934
|
### Anti-Patterns (Avoid These)
|
|
890
935
|
|
|
891
|
-
${
|
|
892
|
-
`)}function
|
|
936
|
+
${Cr(r.antiPatterns)}`),e.push(Ym(r)),e.join(`
|
|
937
|
+
`)}function jC(r,e){let t=r.sources||Gn();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
|
|
938
|
+
# ${r.name} - Project Rules
|
|
893
939
|
<!-- projectId: ${r.projectId} -->
|
|
894
940
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
895
941
|
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
896
942
|
|
|
897
943
|
## THIS PROJECT (${r.ecosystem})
|
|
898
944
|
|
|
899
|
-
${
|
|
945
|
+
${St(t.ecosystem)}
|
|
900
946
|
**Type:** ${r.projectType}
|
|
901
947
|
**Path:** ${r.repoPath}
|
|
902
948
|
|
|
903
949
|
### Commands (USE THESE, NOT OTHERS)
|
|
904
950
|
|
|
905
|
-
${
|
|
951
|
+
${St(t.commands)}
|
|
906
952
|
| Action | Command |
|
|
907
953
|
|--------|---------|
|
|
908
954
|
| Install dependencies | \`${r.commands.install}\` |
|
|
@@ -914,11 +960,11 @@ ${wt(t.commands)}
|
|
|
914
960
|
|
|
915
961
|
### Code Conventions
|
|
916
962
|
|
|
917
|
-
${
|
|
963
|
+
${St(t.languages)}
|
|
918
964
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
919
|
-
${
|
|
965
|
+
${St(t.frameworks)}
|
|
920
966
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
921
|
-
${r.analysis?
|
|
967
|
+
${r.analysis?RC(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
|
|
922
968
|
---
|
|
923
969
|
|
|
924
970
|
## PRJCT RULES
|
|
@@ -944,7 +990,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
944
990
|
|
|
945
991
|
## PROJECT STATE
|
|
946
992
|
|
|
947
|
-
${
|
|
993
|
+
${St(t.name)}
|
|
948
994
|
| Field | Value |
|
|
949
995
|
|-------|-------|
|
|
950
996
|
| Name | ${r.name} |
|
|
@@ -962,13 +1008,52 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
962
1008
|
|
|
963
1009
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
964
1010
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
1011
|
+
|
|
1012
|
+
---
|
|
1013
|
+
|
|
1014
|
+
## RECENT LEARNINGS
|
|
1015
|
+
|
|
1016
|
+
${r.learnings&&(r.learnings.completedTasks.length>0||r.learnings.resolvedBugs.length>0||r.learnings.shippedFeatures.length>0)?`
|
|
1017
|
+
### Completed Tasks
|
|
1018
|
+
${r.learnings.completedTasks.length>0?r.learnings.completedTasks.map(n=>`- ${n.description}${n.branch?` (${n.branch})`:""}`).join(`
|
|
1019
|
+
`):"_(No completed tasks yet)_"}
|
|
1020
|
+
|
|
1021
|
+
### Resolved Bugs
|
|
1022
|
+
${r.learnings.resolvedBugs.length>0?r.learnings.resolvedBugs.map(n=>`- ${n.description}`).join(`
|
|
1023
|
+
`):"_(No resolved bugs yet)_"}
|
|
1024
|
+
|
|
1025
|
+
### Shipped Features
|
|
1026
|
+
${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **${n.name}** (v${n.version})${n.description?`: ${n.description}`:""}`).join(`
|
|
1027
|
+
`):"_(No shipped features yet)_"}
|
|
1028
|
+
`:"> Run `p. sync` to populate learnings from task history"}
|
|
1029
|
+
<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
|
|
1030
|
+
`}function $C(r,e){let t=r.sources||Gn(),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(St(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(St(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(br(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Cr(r.analysis.antiPatterns)),n.push(""));let s=Ym(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
1031
|
+
`)}function MC(r,e){let t=r.sources||Gn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(St(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(br(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Cr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(St(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
1032
|
+
`)}function OC(r,e){let t=r.sources||Gn(),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(St(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(St(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(br(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Cr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
1033
|
+
`)}function FC(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(`
|
|
1034
|
+
`),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 _C(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(br(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(Cr(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(`
|
|
1035
|
+
`)}function Xm(r){return{claude:jC,cursor:$C,copilot:MC,windsurf:OC,continue:FC,codex:_C}[r]||null}var cl=w(()=>{"use strict";al();l(br,"formatPatterns");l(Cr,"formatAntiPatterns");l(Ym,"formatStructure");l(RC,"formatAnalysisForClaude");l(jC,"formatForClaude");l($C,"formatForCursor");l(MC,"formatForCopilot");l(OC,"formatForWindsurf");l(FC,"formatForContinue");l(_C,"formatForCodex");l(Xm,"getFormatter")});import{exec as NC}from"node:child_process";import Qm from"node:os";import Bt from"node:path";import{promisify as LC}from"node:util";function Zm(r){return li[r]||null}function eg(r){let e=Qm.homedir();switch(r){case"claude":return Bt.join(e,".claude","CLAUDE.md");case"gemini":return Bt.join(e,".gemini","GEMINI.md");case"codex":return Bt.join(e,".codex","CODEX.md");case"aider":return Bt.join(e,".aider","AIDER.md");default:return""}}async function ci(r){try{return await UC(`which ${r}`),!0}catch{return!1}}async function ui(r=process.cwd()){let e=[];return await ci("claude")&&e.push("claude"),(await ci("cursor")||await M(Bt.join(r,".cursor")))&&e.push("cursor"),await M(Bt.join(r,".github"))&&e.push("copilot"),(await ci("windsurf")||await M(Bt.join(r,".windsurf")))&&e.push("windsurf"),(await M(Bt.join(r,".continue"))||await M(Bt.join(Qm.homedir(),".continue")))&&e.push("continue"),(await ci("codex")||await M(Bt.join(r,".agents")))&&e.push("codex"),e}async function tg(r,e=process.cwd()){if(r==="auto"){let t=await ui(e);return t.length>0?t:["claude"]}return r==="all"?HC:r.filter(t=>li[t])}var UC,li,Pr,HC,ll=w(()=>{"use strict";De();UC=LC(NC),li={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"}},Pr=["claude"],HC=Object.keys(li);l(Zm,"getAIToolConfig");l(eg,"getGlobalConfigPath");l(ci,"commandExists");l(ui,"detectInstalledTools");l(tg,"resolveToolIds")});import ul from"node:fs/promises";import dl from"node:path";function GC(r,e,t){let n=t==="claude"?"<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->":"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",s=t==="claude"?"<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->":"<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(e.includes(n)&&e.includes(s)))return`${e.trimEnd()}
|
|
1036
|
+
|
|
1037
|
+
${r}`;let i=e.substring(0,e.indexOf(n)),a=e.substring(e.indexOf(s)+s.length),c=r;return r.includes(n)&&(c=r.substring(r.indexOf(n),r.indexOf(s)+s.length)),i+c+a}async function ng(r,e,t,n=Pr){let s=[];for(let o of n){let i=Zm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await WC(r,i,e,t);s.push(a)}return s}async function WC(r,e,t,n){let s=Xm(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;if(e.outputPath==="repo")i=dl.join(n,e.outputFile);else{let a=eg(e.id);a?i=a:i=dl.join(t,"context",e.outputFile)}await ul.mkdir(dl.dirname(i),{recursive:!0});try{let a=await ul.readFile(i,"utf-8");if(e.outputPath==="global")o=GC(o,a,e.id);else{let c=Ca(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=ba(o,a)}}catch{}return await ul.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 sg=w(()=>{"use strict";O();Pa();cl();ll();l(GC,"mergeWithMarkers");l(ng,"generateAIToolContexts");l(WC,"generateForTool")});var rg=w(()=>{"use strict";cl();sg();ll()});async function og(r){try{let e=I.getDb(r),t=e.prepare(`
|
|
1038
|
+
SELECT description, completed_at, branch
|
|
1039
|
+
FROM tasks
|
|
1040
|
+
WHERE status = 'done' OR status = 'shipped'
|
|
1041
|
+
ORDER BY completed_at DESC
|
|
1042
|
+
LIMIT 10
|
|
1043
|
+
`).all(),n=e.prepare(`
|
|
1044
|
+
SELECT description, completed_at as resolution
|
|
1045
|
+
FROM tasks
|
|
1046
|
+
WHERE (type = 'bug' OR description LIKE '%fix%' OR description LIKE '%bug%')
|
|
1047
|
+
AND (status = 'done' OR status = 'shipped')
|
|
1048
|
+
ORDER BY completed_at DESC
|
|
1049
|
+
LIMIT 5
|
|
1050
|
+
`).all(),s=e.prepare(`
|
|
1051
|
+
SELECT name, description, version
|
|
1052
|
+
FROM shipped_features
|
|
1053
|
+
ORDER BY shipped_at DESC
|
|
1054
|
+
LIMIT 5
|
|
1055
|
+
`).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:n.map(o=>({description:o.description,resolution:o.resolution||"completed"})),shippedFeatures:s.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var ig=w(()=>{"use strict";ie();l(og,"extractLearningsFromDB")});import vr from"node:fs/promises";import xr from"node:path";var pl,ag,ml,cg,lg=w(()=>{"use strict";O();pl=".prjct/.prjct-state.md",ag=".prjct-state.md",ml=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=xr.join(e,pl);await vr.mkdir(xr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await vr.writeFile(n,s,"utf-8");try{let o=xr.join(e,ag);await vr.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[pl,ag])try{await vr.unlink(xr.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=xr.join(e,pl);try{return await vr.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(`
|
|
1056
|
+
`)}},cg=new ml});import gl from"node:fs/promises";import zC from"node:os";import ug from"node:path";function fl(){return ug.join(zC.homedir(),".prjct-cli","skills",VC)}function BC(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Tr(){try{let r=await gl.readFile(fl(),"utf-8");return JSON.parse(r)}catch{return BC()}}async function hl(r){let e=fl();await gl.mkdir(ug.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await gl.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function JC(r){let e=await Tr();e.skills[r.name]=r,await hl(e)}async function qC(r){let e=await Tr();return r in e.skills?(delete e.skills[r],await hl(e),!0):!1}async function KC(r){return(await Tr()).skills[r]||null}async function YC(){return(await Tr()).skills}function XC(){return fl()}var VC,Er,dg=w(()=>{"use strict";VC=".skill-lock.json";l(fl,"getLockFilePath");l(BC,"createEmptyLockFile");l(Tr,"read");l(hl,"write");l(JC,"addEntry");l(qC,"removeEntry");l(KC,"getEntry");l(YC,"getAll");l(XC,"getPath");Er={read:Tr,write:hl,addEntry:JC,removeEntry:qC,getEntry:KC,getAll:YC,getPath:XC}});import{exec as QC}from"node:child_process";import tn from"node:fs/promises";import wl from"node:os";import Qe from"node:path";import{promisify as ZC}from"node:util";import{glob as pg}from"glob";function gg(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?Qe.join(wl.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 fg(r){let e=[];try{let s=Qe.join(r,"SKILL.md");await tn.access(s);let o=Qe.basename(r);e.push({name:o,filePath:s})}catch{}let t=await pg("*/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 pg("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 eP(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()}
|
|
972
1057
|
${s.join(`
|
|
973
1058
|
`)}`;return r.replace(o,`---
|
|
974
1059
|
${c}
|
|
@@ -977,10 +1062,10 @@ ${s.join(`
|
|
|
977
1062
|
`)}
|
|
978
1063
|
---
|
|
979
1064
|
|
|
980
|
-
${r}`}function
|
|
1065
|
+
${r}`}function kl(){return Qe.join(wl.homedir(),".claude","skills")}async function yl(r,e,t,n){let s=kl(),o=Qe.join(s,e),i=Qe.join(o,"SKILL.md"),a=await tn.readFile(r,"utf-8"),c=eP(a,t,n);return await tn.mkdir(o,{recursive:!0}),await tn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function tP(r){let e={installed:[],skipped:[],errors:[]};if(!Po.isAvailable("git")){let n=Po.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(wl.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await mg(`git clone --depth 1 ${n} ${t}`,{timeout:wo("GIT_CLONE")});let s;try{let{stdout:a}=await mg("git rev-parse HEAD",{cwd:t,timeout:wo("TOOL_CHECK")});s=a.trim()}catch{}let o=await fg(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 yl(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 Er.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await tn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function nP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await tn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await tn.stat(t)).isFile()){let s=Qe.basename(Qe.dirname(t));try{let o=await yl(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Er.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await fg(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 yl(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Er.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function sP(r){let e=kl(),t=Qe.join(e,r);try{await tn.rm(t,{recursive:!0,force:!0})}catch{}let n=Qe.join(e,`${r}.md`);try{await tn.rm(n,{force:!0})}catch{}return Er.removeEntry(r)}async function rP(r){let e=gg(r);switch(e.type){case"github":return tP(e);case"local":return nP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var mg,hg,yg=w(()=>{"use strict";O();mn();Ua();dg();mg=ZC(QC);l(gg,"parseSource");l(fg,"discoverSkills");l(eP,"injectSourceMetadata");l(kl,"getInstallDir");l(yl,"installSkillFile");l(tP,"installFromGitHub");l(nP,"installFromLocal");l(sP,"remove");l(rP,"install");hg={install:rP,remove:sP,parseSource:gg,getInstallDir:kl}});import bt from"node:fs/promises";import oP from"node:os";import yt from"node:path";async function wg(r,e,t,n){let s=[],o=yt.join(r,"agents");try{let c=await bt.readdir(o);for(let u of c)u.endsWith(".md")&&await bt.unlink(yt.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=>iP(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=>aP(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 kg(r){let e=yt.join(r,"agents"),t=[];try{let n=await bt.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 Sg(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=Me(`subagents/${o}.md`);if(!i){let a=yt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await bt.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 iP(r,e){let t="";try{let n=yt.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await bt.readFile(n,"utf-8"),t=await Sg(t)}catch(n){B.debug("Workflow agent template not found, generating minimal",{name:r,error:Y(n)}),t=lP(r)}await bt.writeFile(yt.join(e,`${r}.md`),t,"utf-8")}async function aP(r,e,t,n,s){let o="";try{let i=yt.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await bt.readFile(i,"utf-8"),o=await Sg(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=uP(r,t,n)}o=cP(o,r,s),await bt.writeFile(yt.join(e,`${r}.md`),o,"utf-8")}function cP(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=[`
|
|
981
1066
|
## Recent Learnings (from completed tasks)
|
|
982
1067
|
`];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(`
|
|
983
|
-
`)}function
|
|
1068
|
+
`)}function lP(r){return`---
|
|
984
1069
|
name: ${r}
|
|
985
1070
|
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"}
|
|
986
1071
|
tools: Read, Write, Glob
|
|
@@ -996,7 +1081,7 @@ When invoked:
|
|
|
996
1081
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
997
1082
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
998
1083
|
3. Execute requested operation
|
|
999
|
-
`}function
|
|
1084
|
+
`}function uP(r,e,t){return`---
|
|
1000
1085
|
name: ${r}
|
|
1001
1086
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
1002
1087
|
tools: Read, Write, Glob, Grep
|
|
@@ -1016,17 +1101,20 @@ Domain specialist for ${r} tasks.
|
|
|
1016
1101
|
## Your Role
|
|
1017
1102
|
|
|
1018
1103
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1019
|
-
`}function
|
|
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
|
|
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(`
|
|
1104
|
+
`}function bg(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 bt.writeFile(yt.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 Cg(r){let e=[];try{let t=yt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await bt.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=yt.join(oP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=yt.join(a,d,"SKILL.md"),p=yt.join(a,`${d}.md`),g=!1;try{await bt.access(m),g=!0}catch{try{await bt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let S=await hg.install(k);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:S.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),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 Pg=w(()=>{"use strict";as();Xt();ne();ps();yg();l(wg,"generateAgents");l(kg,"loadExistingAgents");l(Sg,"resolveTemplateIncludes");l(iP,"generateWorkflowAgent");l(aP,"generateDomainAgent");l(cP,"injectFeedbackSection");l(lP,"generateMinimalWorkflowAgent");l(uP,"generateMinimalDomainAgent");l(bg,"configureSkills");l(Cg,"autoInstallSkills")});import vg from"node:fs/promises";import xg from"node:path";var di,Tg=w(()=>{"use strict";di=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=xg.join(this.projectPath,"package.json"),t=await vg.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await vg.access(xg.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as dP}from"node:child_process";import Eg from"node:fs/promises";import Sl from"node:path";import{promisify as pP}from"node:util";async function Ag(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Wn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Wn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Wn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Wn("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
1105
|
+
`).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 Wn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
1106
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Wn('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 Jt(r,e){try{return await Eg.access(Sl.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:Y(t)}),!1}}async function Ig(r){let e={fileCount:0,version:"0.0.0",name:Sl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Wn('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=Sl.join(r,"package.json"),n=JSON.parse(await Eg.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 Jt(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 Jt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Jt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Jt(r,"requirements.txt")||await Jt(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 Dg(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 Jt(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 Jt(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 Jt(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 Jt(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 Jt(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 Rg(r,e){let t=Gn(),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 jg(r){return new di(r).detect()}var Wn,$g=w(()=>{"use strict";Xt();al();ps();Tg();Wn=pP(dP);l(Ag,"analyzeGit");l(Jt,"fileExists");l(Ig,"gatherStats");l(Dg,"detectCommands");l(Rg,"buildSources");l(jg,"detectStack")});import{exec as mP}from"node:child_process";import bl from"node:fs/promises";import pi from"node:path";import{promisify as gP}from"node:util";var fP,Cl,Pl,Mg,Og=w(()=>{"use strict";Wt();O();fP=gP(mP),Cl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=pi.join(r,s);try{await bl.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=pi.basename(r);try{await F.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=pi.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 bl.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bl.readFile(pi.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}}},Pl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cl.contextFilesExist(t),Cl.jsonFilesValid(t),Cl.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 fP(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}}}},Mg=new Pl});import mi from"node:fs/promises";import gi from"node:path";var fi,zn,vl=w(()=>{"use strict";ts();Om();Gm();Vm();Km();sl();Xt();Tn();pt();de();Do();gn();ie();rr();Ro();$o();ir();ar();lr();rg();ig();ne();ps();wc();kc();lg();Ga();Pg();$g();Og();fi=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 ui(e)).filter(i=>!Pr.includes(i));s=[...Pr,...o]}else t.aiTools[0]==="auto"?(s=await ui(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await tg("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 or(this.projectId);try{let N=await jo(this.projectId);N>0&&B.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){B.debug("Legacy JSON sweep failed (non-critical)",{error:Y(N)})}let[i,a,c,u]=await Promise.all([Ag(this.projectPath),Ig(this.projectPath),Dg(this.projectPath),jg(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&zm(this.projectId))try{let{diff:N,currentHashes:If}=await il(this.projectPath,this.projectId),ql=N.added.length+N.modified.length+N.deleted.length;if(ql===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Oi=Um(N,this.projectId);f=Hm(Oi.allAffected);let Df=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Oi.allAffected.some(Sn=>{let Rf=Sn.substring(Sn.lastIndexOf("."));return Df.has(Rf)}),g=Oi.directlyChanged.some(Sn=>Sn==="package.json"||Sn==="tsconfig.json"||Sn.includes("Dockerfile")||Sn.includes("docker-compose")),m={isIncremental:!0,filesChanged:ql,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ol(this.projectId,If)}catch(N){B.debug("Incremental detection failed, falling back to full sync",{error:Y(N)})}else try{let{currentHashes:N}=await il(this.projectPath,this.projectId);ol(this.projectId,N)}catch(N){B.debug("Hash computation failed (non-critical)",{error:Y(N)})}if(p)try{await Promise.all([Mm(this.projectPath,this.projectId),Lm(this.projectPath,this.projectId),qm(this.projectPath,this.projectId)])}catch(N){B.debug("File ranking index build failed (non-critical)",{error:Y(N)})}let k;if(g)try{let N=await F.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(k=N)}catch{}let S=g?await wg(this.globalPath,u,a,k):await kg(this.globalPath),A=bg(S,this.projectId,this.globalPath),R=g?await Cg(S):[],J=Rg(a,c),he=[],Pe;try{let N=await Ke.getActive(this.projectId);(N?.patterns?.length||N?.antiPatterns?.length)&&(Pe={patterns:N.patterns??[],antiPatterns:N.antiPatterns??[],packageManager:N.packageManager,sourceDir:N.sourceDir,testDir:N.testDir})}catch{}let Ue;try{Ue=await og(this.projectId)}catch{}let C={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(N=>N.type==="workflow").map(N=>N.name),domain:S.filter(N=>N.type==="domain").map(N=>N.name)},sources:J,analysis:Pe,learnings:Ue},D=await ng(C,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 ve=Date.now()-n,Ns=await this.recordSyncMetrics(a,he,S,ve);await this.archiveStaleData(),await this.autoLearnFromHistory(),await qe.installGlobalConfig(),await qe.syncCommands();let rn;try{let N=await $.readConfig(this.projectPath);rn=await Mg.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){B.debug("Verification failed (non-critical)",{error:Y(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:S,skills:A,skillsInstalled:R,contextFiles:he,aiTools:D.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:Ns,verification:rn,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=>mi.mkdir(gi.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=I.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};I.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await F.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 F.write(this.projectId,s);try{await cg.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:Y(o)})}}async logToMemory(e,t){I.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=gi.join(this.globalPath,m),g=await mi.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=gi.join(this.globalPath,"agents",`${m.name}.md`),g=await mi.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 Rn.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 F.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 Ke.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([ot.archiveOldShipped(this.projectId).catch(()=>0),Ge.markDormantIdeas(this.projectId).catch(()=>0),ye.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),rt.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=mt.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 F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Pn,n=await yc.learnFromTaskHistory(this.projectId,e,t);try{let s=await ap.getFeatureOutcomes(this.projectId);s.length>0&&await yc.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=gi.join(__dirname,"..","..","package.json");return JSON.parse(await mi.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:[]}}},zn=new fi});import{exec as hP}from"node:child_process";import ws from"node:path";import{promisify as yP}from"node:util";function _g(r){return/^\d+\.\d+\.\d+/.test(r)}function ks(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function wP(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function kP(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function SP(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Fg,Ar,Ng=w(()=>{"use strict";De();Fg=yP(hP),Ar=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=ws.join(this.projectPath,"package.json"),t=await _t(e,null);return t?.version?{current:t.version,next:ks(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=ws.join(this.projectPath,"Cargo.toml"),t=await Be(e,"");if(!t)return null;let n=wP(t);return n?{current:n,next:ks(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=ws.join(this.projectPath,"pyproject.toml"),t=await Be(e,"");if(!t)return null;let n=kP(t);return n?{current:n,next:ks(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await Yt(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=ws.join(this.projectPath,e[0]),n=await Be(t,"");if(!n)return null;let s=SP(n);return s?{current:s,next:ks(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=ws.join(this.projectPath,e),n=await Be(t,"");if(!n)return null;let s=n.trim();return _g(s)?{current:s,next:ks(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Fg("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1107
|
+
`);for(let n of t){let s=n.trim().replace(/^v/,"");if(_g(s))return{current:s,next:ks(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=ws.join(this.projectPath,"VERSION");return await Nt(e,`0.1.0
|
|
1108
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Fg(`git tag v${e.next}`,{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Nt(e.file,`${e.next}
|
|
1109
|
+
`);break}}async writeJsonVersion(e,t){let n=await _t(e,{});n&&(n.version=t,await bn(e,n))}async writeTomlVersion(e,t){let n=await Be(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Nt(e,s)}async writeXmlVersion(e,t){let n=await Be(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Nt(e,s)}};l(_g,"isSemver");l(ks,"bumpPatch");l(wP,"parseTomlVersion");l(kP,"parsePyprojectVersion");l(SP,"parseCsprojVersion")});var Zt=w(()=>{"use strict";hd();xd();Td();Ad();jd();Md();Ma();_d();Ga();Nd();Ld();Tm();Rm();vl();Ng()});import nn from"chalk";function Lg(r){return Math.ceil(r.length/bP)}function Ug(r){let e=r.split(`
|
|
1022
1110
|
`),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+=`
|
|
1023
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
1024
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
1111
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.includes("<!-- prjct:preserve")}function Hg(r,e){let t=Ug(r),n=Ug(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Lg(r),tokensAfter:Lg(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)xl(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
1112
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(xl(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1025
1113
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1026
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
1027
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
1114
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!xl(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
1115
|
+
`).length}),s.hasChanges=!0)}return s}function Gg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?nn.green:p=>p,o=t?nn.red:p=>p,i=t?nn.yellow:p=>p,a=t?nn.dim:p=>p,c=t?nn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1028
1116
|
`);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(`
|
|
1029
|
-
`)}function
|
|
1117
|
+
`)}function Wg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?nn.green:c=>c,o=t?nn.red:c=>c,i=t?nn.cyan:c=>c,a=t?nn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1030
1118
|
`))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(`
|
|
1031
1119
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1032
1120
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -1037,11 +1125,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function cl(r){return r.incl
|
|
|
1037
1125
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1038
1126
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
1039
1127
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
1040
|
-
`)}var
|
|
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
|
|
1042
|
-
`)}function
|
|
1128
|
+
`)}var bP,zg=w(()=>{"use strict";bP=4;l(Lg,"estimateTokens");l(Ug,"parseMarkdownSections");l(xl,"isPreservedSection");l(Hg,"generateSyncDiff");l(Gg,"formatDiffPreview");l(Wg,"formatFullDiff")});import CP from"node:path";async function Tl(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 qe.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(`
|
|
1129
|
+
`));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 ht("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Vg(r){try{let e=await rt.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=G.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 Ir(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function El(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Bg(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 Jg(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 | ${Ir(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${Zr(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 | ${El(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: ${Ir(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(`
|
|
1130
|
+
`)}function qg(r,e){let t=[];t.push(`# Repository Analysis
|
|
1043
1131
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1044
|
-
`);let n=
|
|
1132
|
+
`);let n=CP.basename(e);if(t.push(`## Project: ${n}
|
|
1045
1133
|
`),t.push(`## Stack Detected
|
|
1046
1134
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1047
1135
|
`),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
|
|
@@ -1057,34 +1145,34 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function cl(r){return r.incl
|
|
|
1057
1145
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1058
1146
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1059
1147
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1060
|
-
`)}var
|
|
1061
|
-
`),
|
|
1148
|
+
`)}var Kg=w(()=>{"use strict";Tn();eo();Zt();gs();Dn();Xe();l(Tl,"showSyncResult");l(Vg,"getSessionActivity");l(Ir,"formatTokens");l(El,"formatDuration");l(Bg,"generateSparkline");l(Jg,"generateStatsMarkdown");l(qg,"generateAnalysisSummary")});var xm={};Yn(xm,{AnalysisCommands:()=>Bn});import Al from"node:fs/promises";import Yg from"node:path";import*as Vn from"@clack/prompts";var Bn,si=w(()=>{"use strict";ts();rd();Tn();eo();Zt();Ba();zg();Do();ie();Ro();O();ms();gs();Dn();Kg();Xe();Bn=class extends me{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1149
|
+
`),Ne.init(t);let n=await at.build(t,e),s={packageJson:await Ne.readPackageJson(),cargoToml:await Ne.readCargoToml(),goMod:await Ne.readGoMod(),requirements:await Ne.readRequirements(),directories:await Ne.listDirectories(),fileCount:await Ne.countFiles(),gitStats:await Ne.getGitStats(),gitLog:await Ne.getGitLog(20),hasDockerfile:await Ne.fileExists("Dockerfile"),hasDockerCompose:await Ne.fileExists("docker-compose.yml"),hasReadme:await Ne.fileExists("README.md"),hasTsconfig:await Ne.fileExists("tsconfig.json"),hasViteConfig:await Ne.fileExists("vite.config.ts")||await Ne.fileExists("vite.config.js"),hasNextConfig:await Ne.fileExists("next.config.js")||await Ne.fileExists("next.config.mjs")},o=qg(s,t),i=await $.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await ze.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:G.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(st(),wt(ut)).getActiveProvider(),d=await qe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1062
1150
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
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(
|
|
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(`
|
|
1151
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=x.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await x.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await zn.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(U(ke(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=Yg.join(o,"context","CLAUDE.md"),c=null;try{c=await Al.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 zn.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(U("## \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 Al.readFile(a,"utf-8")}catch{p=""}let g=Hg(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(U(ke("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 Al.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let R of g.added)S.push(`Added: ${R.name} (${R.lineCount} lines)`);for(let R of g.modified)S.push(`Modified: ${R.name} (${R.lineCount} lines)`);for(let R of g.removed)S.push(`Removed: ${R.name} (${R.lineCount} lines)`);let A=U("## \u26A1 Sync Preview",S.length>0?re("Changes",Le(S)):"No section changes.",ft({"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 S={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:S,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Gg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await Vn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Vn.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
|
|
1152
|
+
${Wg(g)}`);let S=await Vn.confirm({message:"Apply these changes?",initialValue:!0});if(Vn.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"),Tl(m,i)}t.md||h.spin("Syncing project...");let d=await zn.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(U("## \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 Ke.diff(s);A?.hasChanges&&(f=Va(A))}catch{}let k=Mo("sync"),S=U(ke("Sync Complete"),ft({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?ep("Uncommitted changes detected"):null,oe(k.map(A=>({label:A.desc,command:A.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Tl(d,i)}catch(n){return t.md?console.log(U("## \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 Rn.getSummary(s),i=await Rn.getDailyStats(s,30),a=await Vg(s),c=await $e.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=I.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await Rn.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: ${Ir(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: ${El(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=Bg(i);if(console.log(` ${p} ${Ir(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=Jg(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=kr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Ke.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=Yg.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=U(`## \u26A1 Status: ${u}`,ft({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?re("Analysis",Le(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 Ke.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(U("## 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(U(Va(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(Wd(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(U("## \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 Ke.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 Ke.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(U(ke("Analysis Rolled Back"),ft({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(U("## \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(U("## \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 Ke.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=I.getDoc(s,"project")?.repoPath||e}catch{}let i=await Ke.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 _P}from"node:child_process";import{promisify as NP}from"node:util";async function xi(r){if(process.platform!=="darwin")return cf(r);try{let{stdout:e}=await LP(`security find-generic-password -s "${UP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return cf(r)}}function cf(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var LP,UP,Hl=w(()=>{"use strict";O();LP=NP(_P),UP="prjct-cli";l(xi,"getCredential");l(cf,"getEnvFallback")});import Pt from"node:fs";import{createServer as _v}from"node:net";_i();si();Zt();Wt();O();ms();Xe();import PP from"node:path";pt();de();O();ne();var hi=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:x.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},W=new hi;var Ss=class extends me{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=PP.basename(t),a=await F.getCurrentTask(o),c=await ye.getActiveTasks(o),u=await ot.getRecent(o,5),d=await Ge.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=G.getDaysAgo(m),g=[];try{let S=p.toISOString();g=I.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(R=>({...JSON.parse(R.data),timestamp:R.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(`
|
|
1065
1153
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
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
|
|
1067
|
-
Activity: ${
|
|
1068
|
-
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await
|
|
1154
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
|
|
1155
|
+
Activity: ${k}
|
|
1156
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await at.build(t),p=await ze.get("Read")(m.paths.roadmap);if(console.log(`
|
|
1069
1157
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1070
1158
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1071
|
-
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,
|
|
1072
|
-
`)[0].trim();console.log(` ${
|
|
1073
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
1159
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let S=f.split(`
|
|
1160
|
+
`)[0].trim();console.log(` ${k+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1161
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${G.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let S=k.priority?` [${k.priority}]`:"";return`${k.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let S=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=U(`## \u26A1 Dashboard: ${i}`,re("Current Focus",m),re(`Queue (${c.length})`,Le(p,!0)),re("Recent Ships",Le(g)),re("Ideas",`${d.length} pending`),oe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1074
1162
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1075
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1163
|
+
`),console.log("\u2550".repeat(50));let m=kr(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1076
1164
|
${g}`),console.log(`
|
|
1077
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=
|
|
1078
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,
|
|
1079
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let
|
|
1165
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=G.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1166
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let S=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${S}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1167
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
|
|
1080
1168
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1081
1169
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1082
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1170
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:G.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(`
|
|
1083
1171
|
PRJCT COMMANDS
|
|
1084
|
-
`),console.log("=".repeat(50));let i=
|
|
1172
|
+
`),console.log("=".repeat(50));let i=W.getAllCategories(),a=W.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
|
|
1085
1173
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1086
1174
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1087
|
-
`),{success:!0,topic:"overview"}}let n=
|
|
1175
|
+
`),{success:!0,topic:"overview"}}let n=W.getByName(e);if(n){if(console.log(`
|
|
1088
1176
|
\u{1F4DA} HELP: /p:${n.name}
|
|
1089
1177
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
|
|
1090
1178
|
Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
|
|
@@ -1094,7 +1182,7 @@ ${"\u2550".repeat(50)}
|
|
|
1094
1182
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1095
1183
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1096
1184
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
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("")}};
|
|
1185
|
+
`),{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("")}};_c();pt();de();Wt();O();import vP from"node:fs/promises";import xP from"node:path";var Jn=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 F.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 Jo.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=xP.join(e,"analysis","repo-analysis.json"),n=await vP.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}}},N1=new Jn;Xe();Zt();Wt();ie();O();Xe();async function yi(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;_.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(yi,"cleanupMemory");async function wi(r){let e=await $.getProjectId(r);if(!e)return;let n=_.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;_.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(wi,"cleanupMemoryInternal");async function Il(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await yi(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=_.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;_.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 Ge.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 ye.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 wi(e),await rt.log(e,"cleanup_performed",{items:s.length,timestamp:G.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Il,"cleanup");Zt();O();Xe();import Xg from"node:path";async function Dl(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 ue.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1098
1186
|
|
|
1099
1187
|
*Use templates/design/architecture.md for full design*
|
|
1100
1188
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1109,12 +1197,12 @@ ${"\u2550".repeat(50)}
|
|
|
1109
1197
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1110
1198
|
|
|
1111
1199
|
*Use templates/design/flow.md for full design*
|
|
1112
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1200
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Xg.join(a,u);return await ue.writeFile(d,c),await rt.log(t,"design_created",{type:n,target:o,timestamp:G.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(Dl,"design");Zt();O();Xe();import bs from"node:path";async function Rl(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 ue.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(`
|
|
1113
1201
|
Found abandoned session:
|
|
1114
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let s=
|
|
1202
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let s=G.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1115
1203
|
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
|
|
1116
|
-
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
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
|
|
1204
|
+
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Rl,"recover");async function jl(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=bs.join(x.getGlobalProjectPath(e),"snapshots");await ue.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=bs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ue.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 ue.writeFile(a,JSON.stringify(c,null,2)),await rt.log(r,"undo_performed",{snapshotId:i,timestamp:G.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(jl,"undo");async function $l(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=bs.join(x.getGlobalProjectPath(e),"snapshots"),n=bs.join(t,"history.json"),s;try{let i=await ue.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(`
|
|
1205
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ue.writeFile(n,JSON.stringify(s,null,2)),await rt.log(r,"redo_performed",{timestamp:G.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($l,"redo");async function Ml(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=bs.join(x.getGlobalProjectPath(e),"snapshots"),n=bs.join(t,"history.json"),s;try{let o=await ue.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
|
|
1118
1206
|
SNAPSHOT HISTORY
|
|
1119
1207
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1120
1208
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1122,32 +1210,32 @@ ${"\u2550".repeat(50)}
|
|
|
1122
1210
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1123
1211
|
`)):(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
|
|
1124
1212
|
`)),console.log(`${"=".repeat(50)}
|
|
1125
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1126
|
-
${
|
|
1213
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Ml,"history");var Cs=class extends me{static{l(this,"MaintenanceCommands")}_cleanupMemory=yi;_cleanupMemoryInternal=wi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Il(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Dl(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Rl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?jl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$l(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ml(e):t}};import be from"chalk";ie();var Ol=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){_.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)_.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){_.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){_.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 _.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},TP=new Ol,Qg=TP;O();Xe();var wn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function ki(r,e,t){return t==="below"?r<=e?be.green("\u2713"):be.yellow("\u26A0"):r>=e?be.green("\u2713"):be.yellow("\u26A0")}l(ki,"statusIcon");var Ps=class extends me{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 Qg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1214
|
+
${be.dim("No performance data yet.")}`),console.log(`${be.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1127
1215
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1128
|
-
${
|
|
1129
|
-
${
|
|
1130
|
-
`),!(await
|
|
1216
|
+
${be.cyan("Performance Report")} ${be.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ki(i.startup.avg,wn.startup.max,"below");console.log(` Startup: avg ${be.bold(`${i.startup.avg}ms`)} ${be.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${be.dim(`target: <${wn.startup.max}ms`)}`)}if(i.memory){let c=ki(i.memory.peakHeapMB,wn.heapMB.max,"below");console.log(` Memory: avg ${be.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${be.dim(`target: <${wn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ki(i.contextCorrectness.rate,wn.contextRate.min,"above");console.log(` Context: ${be.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${be.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${be.dim(`target: ${wn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ki(i.subtaskHandoff.rate,wn.handoffRate.min,"above");console.log(` Handoff: ${be.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${be.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${be.dim(`target: ${wn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1217
|
+
${be.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${be.bold(`${u.avg}ms`)} ${be.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)}}}};ni();Tn();de();O();De();dn();Xe();import Fl from"node:fs/promises";import EP from"node:path";import te from"chalk";var vs=class extends me{static{l(this,"SetupCommands")}async start(){let t=await(st(),wt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1218
|
+
`),!(await qe.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1131
1219
|
|
|
1132
1220
|
Please install it first:
|
|
1133
|
-
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await
|
|
1221
|
+
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await qe.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1134
1222
|
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1135
1223
|
${x.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1136
1224
|
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1137
1225
|
\u{1F389} Setup complete!`),console.log(`
|
|
1138
1226
|
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...
|
|
1139
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1227
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await qe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await qe.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1140
1228
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1141
1229
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1142
|
-
\u{1F4DD} Installing global configuration...`);let n=await
|
|
1230
|
+
\u{1F4DD} Installing global configuration...`);let n=await qe.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(st(),wt(ut)).getActiveProvider()).name==="claude"){console.log(`
|
|
1143
1231
|
\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(`
|
|
1144
1232
|
\u{1F389} Setup complete!
|
|
1145
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=
|
|
1233
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=EP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1146
1234
|
# prjct Status Line for Claude Code
|
|
1147
1235
|
# Shows version update notifications and current task
|
|
1148
1236
|
|
|
1149
1237
|
# Current CLI version (embedded at install time)
|
|
1150
|
-
CLI_VERSION="${
|
|
1238
|
+
CLI_VERSION="${rs}"
|
|
1151
1239
|
|
|
1152
1240
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1153
1241
|
read -r json
|
|
@@ -1198,61 +1286,90 @@ fi
|
|
|
1198
1286
|
|
|
1199
1287
|
# Default: show prjct branding
|
|
1200
1288
|
echo "\u26A1 prjct"
|
|
1201
|
-
`;await
|
|
1202
|
-
${
|
|
1289
|
+
`;await Fl.writeFile(n,s,{mode:493});let o={};if(await M(t))try{o=JSON.parse(await Fl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Fl.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${rs} 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("")}};ts();Zt();vl();Wt();O();ms();gs();ur();O();import{exec as DP}from"node:child_process";import{promisify as RP}from"node:util";import Ze from"chalk";ts();O();mn();import{exec as AP}from"node:child_process";import{promisify as IP}from"node:util";import LU from"chalk";var WU=IP(AP),Zg=new Map,ef=new Map;function tf(r,e){return`workflow:${r}_${e}`}l(tf,"prefKey");async function nf(r,e){let t={};for(let n of["before","after","skip"]){let s=tf(n,e),o=ef.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=Zg.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await $e.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(nf,"getWorkflowPreferences");async function sf(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=tf(o,s),a=ef.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=Zg.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await $e.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(sf,"listWorkflowPreferences");var Si=RP(DP);async function Ot(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=we.getRulesForCommand(r,e).filter(p=>p.position===t),a=await nf(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(`
|
|
1290
|
+
${Ze.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await Si(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let k=Date.now()-f,S=k>1e3?`${(k/1e3).toFixed(1)}s`:`${k}ms`;console.log(`${Ze.green("\u2713")} ${Ze.dim(`gate passed (${S})`)}`)}catch(f){return console.log(`${Ze.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
|
|
1203
1291
|
${y(f)}
|
|
1204
1292
|
`,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
|
|
1205
|
-
${
|
|
1293
|
+
${Ze.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await Si(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Ze.green("\u2713")} ${Ze.dim(`(${k})`)}`)}catch(g){console.log(`${Ze.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),s.hooksFailed.push(p.description||p.action),s.output+=`Hook failed: ${p.action}
|
|
1206
1294
|
${y(g)}
|
|
1207
1295
|
`}}if(c){console.log(`
|
|
1208
|
-
${
|
|
1296
|
+
${Ze.dim(`[legacy] ${t}-${e}: ${c}`)}`);try{let p=Date.now();await Si(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(`${Ze.green("\u2713")} ${Ze.dim(`(${f})`)}`)}catch(p){console.log(`${Ze.yellow("\u26A0")} legacy hook failed: ${c}`),s.hooksFailed.push(c),s.output+=`Legacy hook failed: ${c}
|
|
1209
1297
|
${y(p)}
|
|
1210
1298
|
`}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
|
|
1211
|
-
${
|
|
1299
|
+
${Ze.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await Si(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${Ze.green("\u2713")} ${Ze.dim(`step passed (${k})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${Ze.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
|
|
1212
1300
|
${y(g)}
|
|
1213
|
-
`,s}}return s}l(
|
|
1214
|
-
|
|
1215
|
-
`),
|
|
1216
|
-
`).
|
|
1217
|
-
|
|
1301
|
+
`,s}}return s}l(Ot,"executeWorkflowRules");Xe();var xs=class extends me{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let c=await Ot(o,"ship","before",{projectPath:t,skipRules:n.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};n.md||h.step(1,4,"Bumping version...");let d=await new Ar(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new tr(t).addFeature(d,i),n.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let f=await this._gitPush(t);g=f.success?"pushed":f.message}await ot.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:G.getTimestamp()}),await $e.learnDecision(o,"commit_footer","prjct","ship"),await $e.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d}),await Ot(o,"ship","after",{projectPath:t,skipRules:n.skipHooks});try{n.md||h.step(4,4,"Updating AI context..."),await zn.sync(t),n.md||h.done("\u2713 AI context updated")}catch(f){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(f))}if(n.md){let f=Mo("ship"),k=U(ke(`Shipped: ${i}`,`Version: ${d}`),re("Results",Le([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),oe(f.map(S=>({label:S.desc,command:S.cmd}))));console.log(k)}else h.done(`v${d} shipped`),ht("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _createShipCommit(e,t){try{await ze.get("Bash")("git add .");let n=`feat: ${e}
|
|
1302
|
+
|
|
1303
|
+
Generated with [p/](https://www.prjct.app/)`;return await ze.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 ze.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)"}}}};pt();de();$o();O();Dn();Xe();import jP from"node:fs/promises";import $P from"node:path";import Ts from"chalk";var Es=class extends me{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(Ts.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1304
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ts.dim("would update")} ${m}`);continue}try{let p=await or(d),g=await jo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ts.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ts.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Ts.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ts.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=$P.join(x.getGlobalBasePath(),"projects");try{return(await jP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};Ic();es();ac();O();On();Xe();import Ce from"chalk";var As=class extends me{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 it.getAll(s);if(i.length===0)return console.log(`
|
|
1305
|
+
${Ce.dim("No velocity data yet.")}`),console.log(`${Ce.dim("Complete tasks with estimates to build velocity history.")}
|
|
1306
|
+
`),{success:!0,message:"No data"};let a=zo(i,o);await ic.saveMetrics(s,a),console.log(`
|
|
1307
|
+
${Ce.cyan("Sprint Velocity")} ${Ce.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?Ce.green:m.estimationAccuracy>=60?Ce.yellow:Ce.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ce.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ce.green("\u2191"):a.velocityTrend==="declining"?Ce.red("\u2193"):Ce.dim("\u2192");if(console.log(` Average: ${Ce.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ce.bold(`${a.estimationAccuracy}%`)} ${Ce.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1308
|
+
${Ce.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ce.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ce.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ce.green("\u2713")} ${m.category} tasks estimated within ${Ce.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Dp(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1309
|
+
${Ce.dim("Projection:")}`),console.log(` Backlog: ${Ce.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ce.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{...un,...n.velocity}}catch{}return un}};Yc();Bc();import XP from"node:fs/promises";import QP from"node:path";On();var MP=[1,2,3,5,8,13,21],OP={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}},of=l(r=>MP.includes(r),"isValidPoint"),bi=l(r=>OP[r],"pointsToMinutes"),rf=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"),af=l(r=>{let e=bi(r);return`${rf(e.min)}\u2013${rf(e.max)}`},"pointsToTimeRange");de();O();import Ci from"node:fs/promises";import FP from"node:os";import Pi from"node:path";var _l=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Pi.join(FP.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Ci.mkdir(this.commandsPath,{recursive:!0});let n=Pi.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Ci.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Pi.join(this.commandsPath,`${e}.md`);return await Ci.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Pi.join(this.commandsPath,`${e}.md`);return await Ci.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
|
|
1310
|
+
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1311
|
+
---
|
|
1312
|
+
|
|
1313
|
+
# p. ${e} $ARGUMENTS
|
|
1314
|
+
|
|
1315
|
+
## Description
|
|
1316
|
+
${t}
|
|
1317
|
+
|
|
1318
|
+
## Step 1: Get workflow context
|
|
1218
1319
|
|
|
1219
|
-
|
|
1320
|
+
Execute the workflow to get current configuration:
|
|
1220
1321
|
|
|
1221
|
-
|
|
1222
|
-
|
|
1322
|
+
\`\`\`bash
|
|
1323
|
+
prjct workflow run ${e} --md
|
|
1324
|
+
\`\`\`
|
|
1325
|
+
|
|
1326
|
+
## Step 2: Execute workflow
|
|
1327
|
+
|
|
1328
|
+
The CLI will execute all configured rules for this workflow:
|
|
1223
1329
|
|
|
1224
|
-
|
|
1330
|
+
- **Gates** (before) - must pass to continue
|
|
1331
|
+
- **Hooks** (before/after) - run but don't block
|
|
1332
|
+
- **Steps** (before/after) - blocking execution
|
|
1225
1333
|
|
|
1226
|
-
|
|
1334
|
+
## Step 3: Review results
|
|
1227
1335
|
|
|
1228
|
-
|
|
1336
|
+
Present the workflow execution results to the user. If gates failed, explain which checks didn't pass and suggest next steps.
|
|
1337
|
+
|
|
1338
|
+
## Next Steps
|
|
1229
1339
|
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
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
|
-
${
|
|
1340
|
+
Suggest relevant actions based on the workflow results:
|
|
1341
|
+
|
|
1342
|
+
- View rules: \`prjct workflow ${e} --md\`
|
|
1343
|
+
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1344
|
+
- Run again: \`p. ${e}\`
|
|
1345
|
+
`}},Nl=new _l;Io();var vi=300*1e3,Ve=new Rt({ttl:vi,maxSize:100}),Ft=new Rt({ttl:vi,maxSize:10}),Is=new Rt({ttl:vi,maxSize:5}),Ds=new Rt({ttl:vi,maxSize:5});function Ll(){Ve.clear(),Ft.clear(),Is.clear(),Ds.clear()}l(Ll,"clearLinearCache");function Ul(){return{issues:Ve.stats(),assignedIssues:Ft.stats(),teams:Is.stats(),projects:Ds.stats()}}l(Ul,"getLinearCacheStats");O();Hl();var HP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},GP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},lf={none:0,urgent:1,high:2,medium:3,low:4},Ti=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 xi("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?lf[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=lf[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:HP[t?.type||"backlog"]||"backlog",priority:GP[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):[]}},ct=new Ti;var Ei=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&ct.isConfigured()}async initialize(e){this.initialized||(await ct.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=Ft.get(t);if(n)return n;let s=await ct.fetchAssignedIssues(e);Ft.set(t,s);for(let o of s)Ve.set(`issue:${o.id}`,o),Ve.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Ft.get(n);if(s)return s;let o=await ct.fetchTeamIssues(e,t);Ft.set(n,o);for(let i of o)Ve.set(`issue:${i.id}`,i),Ve.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Ve.get(t);if(n)return n;let s=await ct.fetchIssue(e);return s&&(Ve.set(`issue:${s.id}`,s),Ve.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await ct.createIssue(e);return Ve.set(`issue:${t.id}`,t),Ve.set(`issue:${t.externalId}`,t),Ft.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await ct.updateIssue(e,t);return Ve.set(`issue:${n.id}`,n),Ve.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await ct.markInProgress(e),Ve.delete(`issue:${e}`),Ft.clear()}async markDone(e){this.ensureInitialized(),await ct.markDone(e),Ve.delete(`issue:${e}`),Ft.clear()}async addComment(e,t){this.ensureInitialized(),await ct.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Is.get("teams");if(e)return e;let t=await ct.getTeams();return Is.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Ds.get("projects");if(e)return e;let t=await ct.getProjects();return Ds.set("projects",t),t}clearCache(){Ll()}getCacheStats(){return Ul()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ct=new Ei;sa();ie();O();var uf=1800*1e3,Ai=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ct.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:uf,issues:o};return I.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 Ct.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 Ct.markInProgress(t):n==="done"&&await Ct.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||uf;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 I.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){I.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Iu("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}}},WP=new Ai;Tt();de();ie();ne();import{exec as zP}from"node:child_process";import{promisify as VP}from"node:util";var df=VP(zP),Rs="session-snapshot",BP=30,Gl=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 I.setDoc(e,Rs,u),u}getSnapshot(e){try{return I.getDoc(e,Rs)}catch{return null}}clearSnapshot(e){try{I.deleteDoc(e,Rs)}catch{}}async listAllSnapshots(){let e=await x.listProjects(),t=[];for(let n of e)try{if(!I.exists(n))continue;let s=I.getDoc(n,Rs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=BP){let t=await x.listProjects(),n=Date.now()-e*24*60*60*1e3,s=0;for(let o of t)try{if(!I.exists(o))continue;let i=I.getDoc(o,Rs);i&&new Date(i.timestamp).getTime()<n&&(I.deleteDoc(o,Rs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${Kt(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: ${Kt(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
|
|
1346
|
+
`)}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 ${Kt(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await df("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await df("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
|
|
1347
|
+
`).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},kn=new Gl;Wt();lc();ur();Dc();O();ms();gs();gc();O();De();Hl();import JP from"node:fs/promises";import qP from"node:os";import KP from"node:path";function YP(r){return KP.join(qP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(YP,"getCredentialsPath");async function Ii(r){let e=YP(r);if(!await M(e))return{};try{return JSON.parse(await JP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(Ii,"getProjectCredentials");async function Wl(r){let e=await Ii(r);return e.linear?.apiKey?e.linear.apiKey:xi("linear-api-key")}l(Wl,"getLinearApiKey");On();Xe();var ZP=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],js=class extends me{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 Ot(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 Ii(o),k=await Wl(o);if(k&&f.linear?.teamId){await Ct.initializeFromApiKey(k,f.linear.teamId);let S=await Ct.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await Ct.markInProgress(e))}}catch{}if(n.md){let f=await F.getCurrentTask(o);if(f)return jt("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 F.startTask(o,{id:ce(),description:c,sessionId:ce(),linearId:a});let k=x.getGlobalProjectPath(o),[S,A,R,J]=await Promise.all([ev(),Ke.getActive(o).catch(()=>null),tv(k),Bo(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),he=null;try{let rn=kn.getSnapshot(o);rn&&(he=kn.formatContinuityContext(rn),kn.clearSnapshot(o))}catch{}let Pe=mc({description:c,branch:S,linearId:a}),Ue=nv(A,R),C=Qd(J.files.map(rn=>({path:rn.path,description:rn.reasons.join(", ")}))),D=sv(R),ve=rv(A),Ns=oe([{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(U(he,Pe,Ue,C,D,ve,Ns)),await this.logToMemory(t,"task_started",{task:e,timestamp:G.getTimestamp()}),await Ot(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await ei.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await F.startTask(o,{id:ce(),description:c,sessionId:ce(),linearId:a});let m=await Vc.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}),pr("working"),ht("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:G.getTimestamp()}),await Ot(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:of,pointsToMinutes:bi,pointsToTimeRange:af,storeEstimate:l(async f=>{let k=bi(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return n.md?jt("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?G.calculateDuration(new Date(i.startedAt)):void 0,c=mc({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?Xd(u,d):"",p=oe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(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")?jt("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 F.getCurrentTask(s);if(!o)return t.md?jt("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 Ot(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=G.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await it.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:G.getTimestamp(),estimatedDuration:d?pf(d):"0m",actualDuration:c||"0m",variance:d?iv(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 (${pf(d)}) \u2192 ${S}${k}%`}await F.completeTask(s,t.feedback);try{kn.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Ii(s),k=await Wl(s);k&&f.linear?.teamId&&(await Ct.initializeFromApiKey(k,f.linear.teamId),await Ct.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(U(ke("Completed",`${a}${f}`),ft({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),oe([{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}`),pr("completed"),ht("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:G.getTimestamp()}),await Ot(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 ye.getActiveTasks(s);if(o.length===0)return t.md?jt("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(U(re("Queue",`${o.length} task${o.length!==1?"s":""}`),Le(i,!0),oe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),ht("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 F.getCurrentTask(o);if(!i)return n.md?jt("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=G.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e);try{await kn.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(U(ke("Task Paused",`**Paused:** ${i.description}`),ft({Reason:e||void 0,"Duration worked":a||void 0}),oe([{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})`:""}`),pr("paused"),ht("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:G.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 F.getCurrentTask(o);if(i)return n.md?jt("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 F.resumeTask(o);return a?(n.md?console.log(U(ke("Task Resumed",`**Resumed:** ${a.description}`),oe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),pr("working"),ht("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:G.getTimestamp()}),{success:!0,task:a.description}):(n.md?jt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${y(s)}`):h.fail(y(s)),{success:!1,error:y(s)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:s}of ZP){let o=t.match(s);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(s=>s.action.toLowerCase().includes(n)||(s.description?.toLowerCase().includes(n)??!1)||s.command.toLowerCase().includes(n)||String(s.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let s=t.indexOf('"',1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}if(t.startsWith("'")){let s=t.indexOf("'",1);return s===-1?[t.slice(1),""]:[t.slice(1,s),t.slice(s+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[s,o]=this._parseAction(e);if(!s||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=nt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=nt.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=we.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(U(ke("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),oe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${s}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=nt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=nt.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=we.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(U(ke("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),oe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowRm(e,t,n){let s=parseInt(e.trim(),10);if(Number.isNaN(s)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!we.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(U(ke("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=we.resetRules(e);return t.md?console.log(U(ke("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let s=e.trim(),o=parseInt(s,10);if(!Number.isNaN(o)){let c=we.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return we.updateRule(t,o,{enabled:!1}),n.md?console.log(U(ke("Rule Disabled",`#${o} [${c.type}] ${c.action}`),oe([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=we.getAllRules(t),a=this._searchRules(i,s);if(a.length===0){let c=`No rules matching "${s}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return we.updateRule(t,c.id,{enabled:!1}),n.md?console.log(U(ke("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(U(re("Multiple matches",`${a.length} rules match "${s}"`),Le(c),oe(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${s}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(U(re("Workflow Help","Manage hooks, gates, and steps for your workflow"),re("Commands",Le(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),re("Natural Language (EN/ES)",Le(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,n){let s=["task","done","ship","sync"],o;e&&s.includes(e)?o=we.getRulesForCommand(t,e):o=we.getAllRules(t);let i=await sf(t);if(o.length===0&&i.length===0)return n.md?console.log(U(re("Workflow Rules","No rules configured"),oe([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[],legacy:i};if(n.md){let a=e?[e]:s,c=[];for(let p of a){let g=o.filter(f=>f.command===p);g.length!==0&&c.push(ov(p,g))}let u=null;if(i.length>0){let p=i.map(g=>`[legacy] ${g.key} \u2192 \`${g.action}\` (${g.scope})`);u=re("Legacy Preferences",Le(p))}let d=e?`Workflow: ${e}`:"Workflow Rules",m=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(re(d,m),c.length>0?Yd(c.join(`
|
|
1348
|
+
|
|
1349
|
+
`),""):null,u,oe([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let a=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(a),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let c of o){let u=c.enabled?"":" (disabled)";console.log(` #${c.id} [${c.type}] ${c.position.padEnd(6)} ${c.command.padEnd(5)} \u2192 ${c.action}${u}`)}if(i.length>0){console.log(""),console.log(" Legacy preferences:");for(let c of i)console.log(` [legacy] ${c.key.padEnd(15)} \u2192 ${c.action} (${c.scope})`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o,legacy:i}}async _workflowInit(e,t,n){let s=we.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(s.length>0){let u=`Ship workflow already has ${s.length} rule${s.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await Oo(t),i=0,a=[],c=we.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=we.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=we.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(n.md)console.log(U(ke("Workflow Initialized",`Added ${a.length} default ship rules`),Le(a),oe([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,n,s){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!nt.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(nt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(nt.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=nt.createWorkflow(t,{name:i,description:a}),d=await Nl.generateWorkflowTemplate(i,a);if(!d.success){nt.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return s.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return s.md?console.log(U(ke("Workflow Created",`Created workflow: ${i}`),re("Description",a),re("Template",`Installed at ${d.path}`),oe([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1350
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return s.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let n=nt.getAllWorkflows(e);if(n.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let s=n.filter(i=>i.isBuiltin),o=n.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(s.length>0){let a=s.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(re("Built-in Workflows",a.join(`
|
|
1351
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(re("Custom Workflows",a.join(`
|
|
1352
|
+
`)))}console.log(U(...i,oe([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${n.length} workflow${n.length!==1?"s":""}`),s.length>0){console.log(`
|
|
1353
|
+
Built-in:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1354
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:n}}async _workflowDelete(e,t,n){let s=e.trim();if(!s){let o="Usage: prjct workflow delete <name>";return n.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!nt.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await Nl.deleteWorkflowTemplate(s),n.md?console.log(U(ke("Workflow Deleted",`Deleted workflow: ${s}`))):h.done(`deleted workflow: ${s}`),{success:!0}}catch(o){let i=y(o);return n.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=nt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Ot(o,i,"before",{projectPath:t});if(!c.success){if(n.md)jt("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Ot(o,i,"after",{projectPath:t}),n.md?console.log(U(ke(`Workflow: ${i}`,a.description||""),oe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=y(s);return n.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let s=await kn.cleanup();return t.md?console.log(ke("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await kn.listAllSnapshots();if(n.length===0)return t.md?jt("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=G.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(U(re("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),Le(s),oe([{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=G.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 pf(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(pf,"formatMinutesToDuration");async function ev(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(ev,"getGitBranch");async function tv(r){try{let e=QP.join(r,"analysis","repo-analysis.json"),t=await XP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(tv,"loadRepoAnalysis");function nv(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=ft(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
|
|
1355
|
+
${Le(g)}`}return[u?`### Project
|
|
1240
1356
|
${u}`:null,m].filter(Boolean).join(`
|
|
1241
1357
|
|
|
1242
|
-
`)||null}l(
|
|
1358
|
+
`)||null}l(nv,"buildProjectContext");function sv(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 Zd(e)}l(sv,"buildRules");function rv(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)
|
|
1243
1359
|
${s.join(`
|
|
1244
1360
|
`)}`)}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)
|
|
1245
1361
|
${s.join(`
|
|
1246
1362
|
`)}`)}return e.length>0?e.join(`
|
|
1247
1363
|
|
|
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,`
|
|
1364
|
+
`):null}l(rv,"buildPatterns");function ov(r,e){let t=e.filter(d=>d.type==="gate"&&d.position==="before"),n=e.filter(d=>d.type==="hook"&&d.position==="before"),s=e.filter(d=>d.type==="step"&&d.position==="before"),o=e.filter(d=>d.type==="hook"&&d.position==="after"),i=e.filter(d=>d.type==="step"&&d.position==="after"),a=[],c=l((d,m,p)=>{let g=m.map(A=>` ${A.enabled?p:"o"} #${A.id} ${A.action}`),f=[d,...g],S=Math.max(...f.map(A=>A.length))+2;a.push(`+${"-".repeat(S)}+`);for(let A of f)a.push(`| ${A.padEnd(S-1)}|`);a.push(`+${"-".repeat(S)}+`)},"drawBox"),u=l(d=>{d.push(" |"),d.push(" v")},"arrow");return t.length>0&&(c("GATES (must pass)",t,"#"),u(a)),n.length>0&&(c("HOOKS (before)",n,">"),u(a)),s.length>0&&(c("STEPS (before)",s,">"),u(a)),a.push(` [ ${r.toUpperCase()} ]`),o.length>0&&(u(a),c("HOOKS (after)",o,">")),i.length>0&&(u(a),c("STEPS (after)",i,">")),a.join(`
|
|
1365
|
+
`)}l(ov,"buildFlowDiagram");function iv(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(iv,"formatVariance");var qn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new js,this.planning=new Hn,this.shipping=new xs,this.analytics=new Ss,this.performanceCmds=new Ps,this.maintenance=new Cs,this.analysis=new Bn,this.setupCmds=new vs,this.updateCmds=new Es,this.velocityCmds=new As,this.contextCmds=new Jn,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)}},uW=new qn;si();var mf={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}},gf=[{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"]}];ni();Tn();de();O();De();Xe();import{execSync as Di}from"node:child_process";import lt from"node:fs/promises";import av from"node:os";import sn from"node:path";import cv from"node:readline";import ge from"chalk";var Ri="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Dr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function zl(r){let e=0;try{let t=await lt.readdir(r,{withFileTypes:!0});for(let n of t){let s=sn.join(r,n.name);if(n.isDirectory())e+=await zl(s);else try{let o=await lt.stat(s);e+=o.size}catch{}}}catch{}return e}l(zl,"getDirectorySize");function ff(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(ff,"formatSize");async function lv(r){try{return(await lt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(lv,"countDirectoryItems");function uv(){let r={homebrew:!1,npm:!1};try{Di("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Di("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(uv,"detectInstallation");async function dv(){let r=[],e=cd(),t=x.getGlobalBasePath(),n=await M(t),s=n?await lv(sn.join(t,"projects")):0,o=n?await zl(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=sn.join(e.claude.config,"CLAUDE.md"),a=await M(i),c=!1;if(a)try{let Pe=await lt.readFile(i,"utf-8");c=Pe.includes(Ri)&&Pe.includes(Dr)}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 zl(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=sn.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,A=await M(S);r.push({path:S,type:"file",description:"Gemini router",exists:A});let R=sn.join(e.gemini.config,"GEMINI.md"),J=await M(R),he=!1;if(J)try{let Pe=await lt.readFile(R,"utf-8");he=Pe.includes(Ri)&&Pe.includes(Dr)}catch{}return J&&he&&r.push({path:R,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(dv,"gatherUninstallItems");async function pv(r){try{let e=await lt.readFile(r,"utf-8");if(!e.includes(Ri)||!e.includes(Dr))return!1;let t=e.indexOf(Ri),n=e.indexOf(Dr)+Dr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1249
1366
|
|
|
1250
|
-
`).trim(),!s||s.trim().length===0?await
|
|
1251
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
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(
|
|
1253
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
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(
|
|
1256
|
-
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await
|
|
1367
|
+
`).trim(),!s||s.trim().length===0?await lt.unlink(r):await lt.writeFile(r,`${s}
|
|
1368
|
+
`,"utf-8"),!0}catch{return!1}}l(pv,"removePrjctSection");async function mv(){let r=av.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=sn.join(r,`.prjct-backup-${e}`);try{await lt.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await M(n)&&await hf(n,sn.join(t,".prjct-cli")),t}catch{return null}}l(mv,"createBackup");async function hf(r,e){await lt.mkdir(e,{recursive:!0});let t=await lt.readdir(r,{withFileTypes:!0});for(let n of t){let s=sn.join(r,n.name),o=sn.join(e,n.name);n.isDirectory()?await hf(s,o):await lt.copyFile(s,o)}}l(hf,"copyDirectory");async function gv(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await pv(o.path)&&n.push(o.path):o.type==="directory"?(await lt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await lt.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||Di(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Di("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(gv,"performUninstall");async function fv(r){let e=cv.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(fv,"promptConfirmation");async function hv(r={},e=process.cwd()){let t=await dv(),n=uv(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ge.yellow(`
|
|
1369
|
+
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(ge.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ge.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=ge.dim("(section only)"):c.size&&(d=ge.dim(`(${ff(c.size)})`)),console.log(` ${ge.cyan(u.padEnd(35))} ${d}`),console.log(` ${ge.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ge.cyan("Homebrew".padEnd(35))} ${ge.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ge.cyan("npm global".padEnd(35))} ${ge.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ge.dim(` Total size: ${ff(o)}`)),console.log("")),r.dryRun)return console.log(ge.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ge.blue("Creating backup..."));let c=await mv();c?(console.log(ge.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(ge.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ge.yellow('Type "uninstall" to confirm:')),!await fv("> ")))return console.log(ge.yellow(`
|
|
1370
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ge.blue("Removing prjct..."));let{deleted:i,errors:a}=await gv(t,n,r);if(console.log(""),i.length>0&&console.log(ge.green(`Removed ${i.length} items`)),a.length>0){console.log(ge.yellow(`
|
|
1371
|
+
${a.length} errors:`));for(let c of a)console.log(ge.red(` - ${c}`))}return console.log(""),console.log(ge.green("prjct has been uninstalled.")),console.log(ge.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(hv,"uninstall");var ji=class extends me{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return hv(e,t)}};var Kn=new js,$i=new Hn,yv=new xs,yf=new Ss,wv=new Ps,$s=new Cs,Ms=new Bn,wf=new vs,kv=new Jn,Sv=new As,bv=new ji,Cv=new Es;function Pv(){for(let[r,e]of Object.entries(mf))W.registerCategory(r,e)}l(Pv,"registerCategories");function kf(){if(W.has("work"))return;Pv();let r=l(e=>gf.find(t=>t.name===e),"getMeta");W.registerMethod("task",Kn,"now",r("task")),W.registerMethod("done",Kn,"done",r("done")),W.registerMethod("next",Kn,"next",r("next")),W.registerMethod("pause",Kn,"pause",r("pause")),W.registerMethod("resume",Kn,"resume",r("resume")),W.registerMethod("workflow",Kn,"workflow",r("workflow")),W.registerMethod("sessions",Kn,"sessions",r("sessions")),W.registerMethod("init",$i,"init",r("init")),W.registerMethod("bug",$i,"bug",r("bug")),W.registerMethod("idea",$i,"idea",r("idea")),W.registerMethod("spec",$i,"spec",r("spec")),W.registerMethod("ship",yv,"ship",r("ship")),W.registerMethod("dash",yf,"dash",r("dash")),W.registerMethod("help",yf,"help",r("help")),W.registerMethod("perf",wv,"perf",r("perf")),W.registerMethod("velocity",Sv,"velocity",r("velocity")),W.registerMethod("cleanup",$s,"cleanup",r("cleanup")),W.registerMethod("design",$s,"design",r("design")),W.registerMethod("recover",$s,"recover",r("recover")),W.registerMethod("undo",$s,"undo",r("undo")),W.registerMethod("redo",$s,"redo",r("redo")),W.registerMethod("history",$s,"history",r("history")),W.registerMethod("analyze",Ms,"analyze",r("analyze")),W.registerMethod("sync",Ms,"sync",r("sync")),W.registerMethod("stats",Ms,"stats",r("stats")),W.registerMethod("status",Ms,"status",r("status")),W.registerMethod("seal",Ms,"seal",r("seal")),W.registerMethod("verify",Ms,"verify",r("verify")),W.registerMethod("start",wf,"start",r("start")),W.registerMethod("setup",wf,"setup",r("setup")),W.registerMethod("uninstall",bv,"uninstall",r("uninstall")),W.registerMethod("update",Cv,"update",r("update")),W.registerMethod("context",kv,"context",r("context"))}l(kf,"registerAllCommands");kf();pt();qi();import{Hono as Mv}from"hono";import{cors as Ov}from"hono/cors";import{logger as Fv}from"hono/logger";de();ie();rr();ir();ar();lr();O();ps();import vv from"node:fs/promises";import xv from"node:path";import{Hono as Tv}from"hono";function Ev(r){return x.getGlobalProjectPath(r)}l(Ev,"getProjectDataPath");function Sf(r,e){let t=new Tv,n=Ev(r);return t.get("/state",async s=>{let o=await F.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await ye.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ge.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=I.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await ot.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([F.read(r),ye.read(r),Ge.read(r),ot.read(r)]),u=I.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 F.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=xv.join(n,"context",`${o}.md`),c=await vv.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(Sf,"createRoutes");de();ie();rr();ir();ar();lr();import Os from"node:fs/promises";import Av from"node:path";import{Hono as Iv}from"hono";var Dv=x.getGlobalBasePath(),Fs=Av.join(Dv,"projects");function Mi(r){return I.getDoc(r,"project")}l(Mi,"getProjectConfig");async function Vl(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(Vl,"calculateDuration");function bf(){let r=new Iv;return r.get("/projects",async e=>{try{await Os.mkdir(Fs,{recursive:!0});let n=(await Os.readdir(Fs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Mi(o),a=await F.read(o),c=await ye.read(o),u=await Ge.read(o),d=await ot.read(o),m=a?.currentTask,p=await Vl(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(Mi(t)),F.read(t),ye.read(t),Ge.read(t),ot.read(t)]),c=I.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await Vl(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 F.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 F.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 F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(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 F.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 F.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([F.read(t),ye.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 F.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 Ge.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 Os.mkdir(Fs,{recursive:!0});let n=(await Os.readdir(Fs,{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 F.read(c),d=await ye.read(c),m=await Ge.read(c),p=await ot.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 Os.mkdir(Fs,{recursive:!0});let s=(await Os.readdir(Fs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=Mi(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 F.read(d),p=Mi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Vl(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(bf,"createExtendedRoutes");Fi();import{streamSSE as Rv}from"hono/streaming";var Cf=3600*1e3,jv=300*1e3,$v=3e4;function Pf(){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()>Cf&&t(i)},jv),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 Rv(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)}},$v),p=setTimeout(()=>{t(a)},Cf);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(Pf,"createSSEManager");function vf(r){let e=new Mv,t=Pf();r.enableCors!==!1&&e.use("*",Ov({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Fv()),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=Sf(r.projectId,r.projectPath);e.route("/api",n);let s=bf();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(Ws())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: ${Ws()?"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(vf,"createServer");var xf=3478;var qt={runDir:l(()=>`${process.env.HOME||Ls("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${qt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${qt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${qt.runDir()}/daemon.log`,"log")},Tf=1800*1e3;function Bl(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1372
|
+
`)}l(Bl,"encodeMessage");var _s=null,Rr=null,fe=null,Fe=null;async function Ef(r){let e=qt.socket(),t=qt.pid(),n=qt.runDir();if(Pt.mkdirSync(n,{recursive:!0}),Pt.existsSync(t)){let s=parseInt(Pt.readFileSync(t,"utf-8").trim(),10);Gv(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),Pt.unlinkSync(t)}if(Pt.existsSync(e)&&Pt.unlinkSync(e),Fe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Tf,idleTimer:null},fe=new qn,_s=_v(s=>Nv(s)),_s.listen(e,()=>{Pt.chmodSync(e,384),Pt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Af()}),_s.on("error",s=>{console.error("Daemon socket error:",s.message),jr(1)}),!r.noHttp)try{let s=process.cwd(),o=await $.getProjectId(s);if(o){let i=r.port||xf;Rr=vf({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Rr.start()}}catch{}if(process.on("SIGTERM",()=>jr(0)),process.on("SIGINT",()=>jr(0)),process.on("SIGHUP",()=>{fe=new qn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Ef,"startDaemon");function Nv(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1373
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await Lv(o);r.write(Bl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Bl(i))}}}),r.on("error",()=>{})}l(Nv,"handleConnection");async function Lv(r){if(!Fe||!fe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Af(),Fe.commandsServed++,Fe.lastActivity=Date.now(),r.command==="daemon")return Hv(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 Uv(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1257
1374
|
`)||o.message||void 0,stderr:t.join(`
|
|
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(
|
|
1375
|
+
`)||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(Lv,"handleRequest");async function Uv(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return fe.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 fe.status(r.cwd,{json:t.json===!0,md:n});case"stats":return fe.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return fe.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return fe.seal(r.cwd,{json:t.json===!0});case"rollback":return fe.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return fe.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return fe.task(e,r.cwd,{md:n});case"done":return fe.done(r.cwd,{md:n});case"next":return fe.next(r.cwd,{md:n});case"pause":return fe.pause(e||"",r.cwd,{md:n});case"resume":return fe.resume(e,r.cwd,{md:n});case"bug":return fe.bug(e||"",r.cwd,{md:n});case"idea":return fe.idea(e||"",r.cwd,{md:n});case"ship":return fe.ship(e,r.cwd,{md:n});case"dash":return fe.dash(e||"default",r.cwd,{md:n});case"workflow":return fe.workflowPrefs(e,r.cwd,{md:n});case"sessions":return fe.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return fe.design(e||"",t);case"analyze":return fe.analyze(t);case"cleanup":return fe.cleanup(t);default:return W.execute(r.command,e,r.cwd)}}l(Uv,"executeCommand");function Hv(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:qt.socket(),uptime:Fe?Date.now()-Fe.startedAt:0,commandsServed:Fe?.commandsServed??0,lastActivity:Fe?new Date(Fe.lastActivity).toISOString():null,registeredCommands:W.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>jr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(Hv,"handleDaemonCommand");function Af(){Fe&&(Fe.idleTimer&&clearTimeout(Fe.idleTimer),Fe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Fe.idleTimeoutMs/1e3/60} minutes, shutting down`),jr(0)},Fe.idleTimeoutMs),Fe.idleTimer.unref&&Fe.idleTimer.unref())}l(Af,"resetIdleTimer");function jr(r){console.log("Daemon shutting down..."),Fe?.idleTimer&&clearTimeout(Fe.idleTimer),Rr&&(Rr.stop(),Rr=null),_s&&(_s.close(),_s=null);let e=qt.socket(),t=qt.pid();try{Pt.existsSync(e)&&Pt.unlinkSync(e)}catch{}try{Pt.existsSync(t)&&Pt.unlinkSync(t)}catch{}process.exit(r)}l(jr,"shutdown");function Gv(r){try{return process.kill(r,0),!0}catch{return!1}}l(Gv,"isProcessRunning");var Jl=process.argv.slice(2),Wv=parseInt(Jl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,zv=Jl.includes("--no-http"),Vv=Jl.includes("--foreground");Ef({port:Wv,noHttp:zv,foreground:Vv}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|