prjct-cli 1.36.0 → 1.37.1
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 +33 -0
- package/README.md +16 -13
- package/dist/bin/prjct-core.mjs +388 -356
- package/dist/cli/linear.mjs +8 -8
- package/dist/daemon/entry.mjs +340 -275
- 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 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=
|
|
8
|
+
var Kr=Object.defineProperty;var Uh=Object.getOwnPropertyDescriptor;var Hh=Object.getOwnPropertyNames;var Gh=Object.prototype.hasOwnProperty;var l=(r,e)=>Kr(r,"name",{value:e,configurable:!0}),In=(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 k=(r,e)=>()=>(r&&(e=r(r=0)),e);var Rn=(r,e)=>{for(var t in e)Kr(r,t,{get:e[t],enumerable:!0})},Wh=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Hh(e))!Gh.call(r,s)&&s!==t&&Kr(r,s,{get:()=>e[s],enumerable:!(n=Uh(e,s))||n.enumerable});return r};var Pt=r=>Wh(Kr({},"__esModule",{value:!0}),r);var Ru=k(()=>{"use strict"});var Yr,Du=k(()=>{"use strict";Yr={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 er,Xr=k(()=>{"use strict";er={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 ju(r){return r instanceof Error&&"code"in r}function P(r){return ju(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var F=k(()=>{"use strict";l(ju,"isNodeError");l(P,"isNotFoundError");l(y,"getErrorMessage")});var $u=k(()=>{"use strict"});var Mu=k(()=>{"use strict";$u()});function Qr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var $,Ou,ls=k(()=>{"use strict";$={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"},Ou=["frontend","backend","devops","docs","testing","database","general"];l(Qr,"calculateConfidence")});var ra=k(()=>{"use strict"});var oa=k(()=>{"use strict";Ru();Du();Xr();F();Mu();ls();ra()});var W={};Rn(W,{calculateDuration:()=>ty,formatDate:()=>us,formatDuration:()=>nn,formatMonth:()=>qh,getDateKey:()=>Kh,getDateRange:()=>Qh,getDaysAgo:()=>gn,getDaysFromNow:()=>Xh,getEndOfDay:()=>sy,getStartOfDay:()=>ny,getTimestamp:()=>b,getTodayKey:()=>Fu,getYearMonthDay:()=>ia,isToday:()=>Zh,isWithinLastDays:()=>ey,parseDate:()=>Yh,toRelative:()=>ry});import{formatDistanceToNowStrict as Jh}from"date-fns";function us(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 qh(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Fu(){return us(new Date)}function Kh(r){return us(r)}function ia(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Yh(r){return new Date(r)}function b(){return new Date().toISOString()}function gn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Xh(r){let e=new Date;return e.setDate(e.getDate()+r),e}function Qh(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 Zh(r){return us(r)===Fu()}function ey(r,e){let t=gn(e);return r>=t}function nn(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 ty(r,e=new Date){let t=e.getTime()-r.getTime();return nn(t)}function ny(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function sy(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function ry(r){let e=typeof r=="string"?new Date(r):r;return Jh(e,{addSuffix:!0})}var ie=k(()=>{"use strict";l(us,"formatDate");l(qh,"formatMonth");l(Fu,"getTodayKey");l(Kh,"getDateKey");l(ia,"getYearMonthDay");l(Yh,"parseDate");l(b,"getTimestamp");l(gn,"getDaysAgo");l(Xh,"getDaysFromNow");l(Qh,"getDateRange");l(Zh,"isToday");l(ey,"isWithinLastDays");l(nn,"formatDuration");l(ty,"calculateDuration");l(ny,"getStartOfDay");l(sy,"getEndOfDay");l(ry,"toRelative")});import Lu from"node:fs/promises";async function Uu(r,e){let t;try{t=await Lu.readFile(r,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await _u(r,t),Nu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await _u(r,t),Nu(r,oy(s.error)),null)}async function _u(r,e){let t=`${r}.backup`;try{await Lu.writeFile(t,e,"utf-8")}catch{}}function Nu(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function oy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Hu=k(()=>{"use strict";F();l(Uu,"safeRead");l(_u,"createBackup");l(Nu,"logCorruption");l(oy,"formatZodError")});var fe={};Rn(fe,{appendLine:()=>aa,appendToFile:()=>ay,atomicWrite:()=>iy,copyFile:()=>my,deleteDir:()=>uy,deleteFile:()=>ly,dirExists:()=>Zr,ensureDir:()=>Rt,fileExists:()=>R,getFileExtension:()=>yy,getFileModifiedTime:()=>py,getFileNameWithoutExtension:()=>wy,getFileSize:()=>dy,listFiles:()=>sn,moveFile:()=>gy,prependToFile:()=>cy,readFile:()=>Qe,readJson:()=>Gt,readLines:()=>fy,writeFile:()=>Wt,writeJson:()=>Dn,writeLines:()=>hy});import ge from"node:fs/promises";import ds from"node:path";async function Gt(r,e=null,t){if(t)return await Uu(r,t)??e;try{let n=await ge.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function Dn(r,e,t=2){let n=JSON.stringify(e,null,t);await ge.writeFile(r,n,"utf-8")}async function Qe(r,e=""){try{return await ge.readFile(r,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Wt(r,e){let t=ds.dirname(r);await ge.mkdir(t,{recursive:!0}),await ge.writeFile(r,e,"utf-8")}async function iy(r,e){let t=ds.dirname(r);await ge.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ge.writeFile(n,e,"utf-8"),await ge.rename(n,r)}async function ay(r,e){await ge.appendFile(r,e,"utf-8")}async function aa(r,e){let t=ds.dirname(r);await ge.mkdir(t,{recursive:!0}),await ge.appendFile(r,`${e}
|
|
9
|
+
`,"utf-8")}async function cy(r,e){try{let t=await ge.readFile(r,"utf-8");await ge.writeFile(r,e+t,"utf-8")}catch(t){if(P(t))await ge.writeFile(r,e,"utf-8");else throw t}}async function R(r){try{return await ge.access(r),!0}catch(e){if(P(e))return!1;throw e}}async function Zr(r){try{return(await ge.stat(r)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Rt(r){await ge.mkdir(r,{recursive:!0})}async function ly(r){try{return await ge.unlink(r),!0}catch(e){if(P(e))return!1;throw e}}async function uy(r){try{return await ge.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function sn(r,e={}){try{let n=await ge.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 dy(r){return(await ge.stat(r)).size}async function py(r){return(await ge.stat(r)).mtime}async function my(r,e){await ge.copyFile(r,e)}async function gy(r,e){await ge.rename(r,e)}async function fy(r){return(await Qe(r,"")).split(`
|
|
10
|
+
`)}async function hy(r,e){let t=e.join(`
|
|
11
|
+
`);await Wt(r,t)}function yy(r){return ds.extname(r)}function wy(r){return ds.basename(r,ds.extname(r))}var $e=k(()=>{"use strict";Hu();F();l(Gt,"readJson");l(Dn,"writeJson");l(Qe,"readFile");l(Wt,"writeFile");l(iy,"atomicWrite");l(ay,"appendToFile");l(aa,"appendLine");l(cy,"prependToFile");l(R,"fileExists");l(Zr,"dirExists");l(Rt,"ensureDir");l(ly,"deleteFile");l(uy,"deleteDir");l(sn,"listFiles");l(dy,"getFileSize");l(py,"getFileModifiedTime");l(my,"copyFile");l(gy,"moveFile");l(fy,"readLines");l(hy,"writeLines");l(yy,"getFileExtension");l(wy,"getFileNameWithoutExtension")});import{z as zt}from"zod";function Gu(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 CE,PE,vE,tr,xE,nr=k(()=>{"use strict";CE=zt.enum(["opus","sonnet","haiku"]),PE=zt.enum(["2.5-pro","2.5-flash","2.0-flash"]),vE=zt.string().min(1),tr=zt.object({provider:zt.string(),model:zt.string(),cliVersion:zt.string().optional(),recordedAt:zt.string()}),xE=zt.object({preferredModel:zt.string().optional(),lastAnalysisModel:tr.optional()});l(Gu,"compareSemver")});import ca from"node:fs/promises";import ky from"node:os";import Wu from"node:path";async function Bu(){try{let r=await ca.readFile(Vu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Sy?null:e.detection}catch{return null}}async function Ju(r){let e={timestamp:new Date().toISOString(),detection:r};await ca.mkdir(zu,{recursive:!0}),await ca.writeFile(Vu,JSON.stringify(e,null,2))}var zu,Vu,Sy,qu=k(()=>{"use strict";zu=Wu.join(ky.homedir(),".prjct-cli","cache"),Vu=Wu.join(zu,"providers.json"),Sy=600*1e3;l(Bu,"readProviderCache");l(Ju,"writeProviderCache")});var ft={};Rn(ft,{AntigravityProvider:()=>ua,ClaudeProvider:()=>eo,CodexProvider:()=>da,CursorProvider:()=>Xu,GeminiProvider:()=>la,Providers:()=>ot,WindsurfProvider:()=>Qu,detectAllProviders:()=>sr,detectAntigravity:()=>so,detectCodex:()=>jn,detectCursorProject:()=>td,detectProvider:()=>to,detectWindsurfProject:()=>nd,getActiveProvider:()=>vy,getCommandsDir:()=>Dy,getGlobalContextPath:()=>Ay,getGlobalSettingsPath:()=>Iy,getProjectCommandsPath:()=>jy,getProviderBranding:()=>no,getSkillsPath:()=>Ry,hasProviderConfig:()=>xy,needsCursorRouterRegeneration:()=>Ty,needsWindsurfRouterRegeneration:()=>Ey,selectProvider:()=>pa,validateCliVersion:()=>ed});import{exec as by}from"node:child_process";import fn from"node:os";import Fe from"node:path";import{promisify as Cy}from"node:util";async function Zu(r){try{let{stdout:e}=await Ku(`which ${r}`,{timeout:Yu});return e.trim()}catch{return null}}async function Py(r){try{let{stdout:e}=await Ku(`${r} --version`,{timeout:Yu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function to(r){let e=ot[r];if(!e.cliCommand)return{installed:!1};let t=await Zu(e.cliCommand);if(!t)return{installed:!1};let n=await Py(e.cliCommand),s=ed(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function ed(r,e){let t=ot[r];return!t.minCliVersion||!e?null:Gu(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 sr(r=!1){if(!r){let i=await Bu();if(i)return i}let[e,t,n]=await Promise.all([to("claude"),to("gemini"),jn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await Ju(o).catch(()=>{}),o}async function vy(r){if(r&&ot[r])return ot[r];let e=await sr();return e.claude.installed&&!e.gemini.installed?eo:e.gemini.installed&&!e.claude.installed?la:eo}async function xy(r){let e=ot[r];return e.configDir?R(e.configDir):!1}function no(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function td(r){let e=Fe.join(r,".cursor"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.mdc"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Ty(r){let e=await td(r);return e.detected&&!e.routerInstalled}async function nd(r){let e=Fe.join(r,".windsurf"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.md"),[s,o]=await Promise.all([R(e),R(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Ey(r){let e=await nd(r);return e.detected&&!e.routerInstalled}async function so(){let r=ua.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Fe.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([R(r),R(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function jn(){let r=da.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Zu("codex"),t=Fe.join(r,"skills","prjct","SKILL.md"),[n,s]=await Promise.all([R(r),R(t)]),o=!!e||n;return{installed:o,skillInstalled:s,configPath:o?r:void 0}}function Ay(r){let e=ot[r];return e.configDir?Fe.join(e.configDir,e.contextFile):null}function Iy(r){let e=ot[r];return!e.configDir||!e.settingsFile?null:Fe.join(e.configDir,e.settingsFile)}function Ry(r){return ot[r].skillsDir}function Dy(r){return ot[r].commandsDir}function jy(r,e){let t=ot[r];return Fe.join(e,t.commandsDir)}async function pa(){let r=await sr(),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 Ku,Yu,eo,la,ua,Xu,Qu,da,ot,Ze=k(()=>{"use strict";nr();$e();qu();Ku=Cy(by),Yu=2e3,eo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Fe.join(fn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Fe.join(fn.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"},la={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Fe.join(fn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Fe.join(fn.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"},ua={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Fe.join(fn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Fe.join(fn.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},Xu={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},Qu={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},da={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Fe.join(fn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Fe.join(fn.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},ot={claude:eo,gemini:la,cursor:Xu,antigravity:ua,windsurf:Qu,codex:da};l(Zu,"whichCommand");l(Py,"getCliVersion");l(to,"detectProvider");l(ed,"validateCliVersion");l(sr,"detectAllProviders");l(vy,"getActiveProvider");l(xy,"hasProviderConfig");l(no,"getProviderBranding");l(td,"detectCursorProject");l(Ty,"needsCursorRouterRegeneration");l(nd,"detectWindsurfProject");l(Ey,"needsWindsurfRouterRegeneration");l(so,"detectAntigravity");l(jn,"detectCodex");l(Ay,"getGlobalContextPath");l(Iy,"getGlobalSettingsPath");l(Ry,"getSkillsPath");l(Dy,"getCommandsDir");l(jy,"getProjectCommandsPath");l(pa,"selectProvider")});import $y from"node:crypto";import Vt from"node:fs/promises";import ma from"node:os";import U from"node:path";import{globSync as My}from"glob";var ga,Oy,x,he=k(()=>{"use strict";ie();$e();ga=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(ma.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return $y.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Zr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await R(t)}async ensureGlobalStructure(){await Rt(this.globalBaseDir),await Rt(this.globalProjectsDir),await Rt(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 Rt(U.join(t,s));return await Rt(U.join(t,"planning","tasks")),await Rt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=ia(t);return U.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Rt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Vt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Vt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Vt.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 Zr(t)}getDisplayPath(e){let t=ma.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ze(),Pt(ft)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ze(),Pt(ft)).getActiveProvider();return(Ze(),Pt(ft)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(ma.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=U.join(e,s.file);if(await R(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await R(s))try{let o=await Vt.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 Vt.readFile(U.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=U.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await R(c)){let u=await Vt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=U.join(e,"package.json"),i=await Vt.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=My(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await R(u))try{let d=await Vt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await R(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},Oy=new ga,x=Oy});function Fy(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function rr(){return Fy()==="bun"}var fa=k(()=>{"use strict";l(Fy,"detectRuntime");l(rr,"isBun")});import ha from"node:fs";import sd from"node:path";function _y(r){if(rr()){let{Database:s}=In("bun:sqlite");return new s(r,{create:!0})}let e=In("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Ny,ro,I,N,se=k(()=>{"use strict";he();fa();l(_y,"openDatabase");Ny=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
13
13
|
-- =======================================================================
|
|
14
14
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
15
15
|
-- =======================================================================
|
|
@@ -283,13 +283,13 @@ var $r=Object.defineProperty;var jf=Object.getOwnPropertyDescriptor;var $f=Objec
|
|
|
283
283
|
('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
|
|
284
284
|
('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
|
|
285
285
|
('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
|
|
286
|
-
`)},"up")}],
|
|
286
|
+
`)},"up")}],ro=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return sd.join(x.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=sd.dirname(n);ha.existsSync(s)||ha.mkdirSync(s,{recursive:!0});let o=_y(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 ha.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(`
|
|
287
287
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
288
288
|
version INTEGER PRIMARY KEY,
|
|
289
289
|
name TEXT NOT NULL,
|
|
290
290
|
applied_at TEXT NOT NULL
|
|
291
291
|
)
|
|
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
|
|
292
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Ny)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 ro,N=I});function wa(r){if(Ou.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(oo))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 ya,oo,$n,or,ir,ar=k(()=>{"use strict";se();ls();ie();ya={frontend:[$.CODE_STYLE,$.FILE_STRUCTURE,$.ARCHITECTURE,$.TECH_STACK],backend:[$.CODE_STYLE,$.ARCHITECTURE,$.DEPENDENCIES,$.TECH_STACK],devops:[$.SHIP_WORKFLOW,$.TEST_BEHAVIOR,$.DEPENDENCIES,$.ARCHITECTURE],docs:[$.CODE_STYLE,$.NAMING_CONVENTION,$.FILE_STRUCTURE],testing:[$.TEST_BEHAVIOR,$.CODE_STYLE,$.DEPENDENCIES],database:[$.ARCHITECTURE,$.NAMING_CONVENTION,$.TECH_STACK,$.DEPENDENCIES],general:Object.values($)},oo={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(wa,"resolveCanonicalDomains");$n=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=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();N.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}},or=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()}},ir=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:b(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var cr,ka=k(()=>{"use strict";se();ls();ie();ar();cr=class r extends $n{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=Qr(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=Qr(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:Qr(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=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var rd=k(()=>{"use strict"});import lr from"node:fs/promises";import hn from"node:path";import{z as K}from"zod";async function Wy(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=hn.join(e,"package.json"),s=await lr.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 zy(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 qy(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Gy[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 Vy(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=hn.join(e,a);try{await lr.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 By(r,e){let t=Date.now();try{let n=await Ky(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 Jy(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=hn.join(e,o.file);try{await lr.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 od(r,e){let t=Date.now(),n=await Promise.all([Wy(r,e),zy(r,e),Vy(r,e),By(r,e),Jy(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 qy(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await lr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=hn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Ky(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await lr.readdir(s,{withFileTypes:!0});for(let i of o){let a=hn.join(s,i.name),c=hn.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 Ly,Uy,Hy,Sa,kA,Gy,ba=k(()=>{"use strict";F();nr();Ly=K.enum(["draft","verified","sealed"]),Uy=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),Hy=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),Sa=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(Uy),antiPatterns:K.array(Hy),analyzedAt:K.string(),modelMetadata:tr.optional(),status:Ly.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),kA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Gy={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(Wy,"verifyFrameworks");l(zy,"verifyLanguages");l(Vy,"verifyPatternLocations");l(By,"verifyFileCount");l(Jy,"verifyAntiPatternFiles");l(od,"semanticVerify");l(qy,"getProjectExtensions");l(Ky,"countProjectFiles")});import{z as Re}from"zod";var io,yn,Yy,PA,Ca,id,ur=k(()=>{"use strict";io=Re.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),yn=Re.object({primaryDomain:io,secondaryDomains:Re.array(io),confidence:Re.number().min(0).max(1),filePatterns:Re.array(Re.string()),relevantAgents:Re.array(Re.string())}),Yy=Re.object({classification:yn,classifiedAt:Re.string(),source:Re.enum(["cache","history","llm","heuristic"]),descriptionHash:Re.string(),projectId:Re.string()}),PA=Re.object({entries:Re.record(Re.string(),Yy),confirmedPatterns:Re.array(Re.object({descriptionHash:Re.string(),classification:yn,confirmedAt:Re.string(),taskDescription:Re.string()}))}),Ca={entries:{},confirmedPatterns:[]},id={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as G}from"zod";var Xy,Qy,ad,Zy,ew,tw,nw,sw,cd,TA,Pa=k(()=>{"use strict";Xy=G.enum(["low","medium","high"]),Qy=G.enum(["pending","converted","completed","archived","dormant"]),ad=G.enum(["high","medium","low"]),Zy=G.object({impact:ad,effort:ad}),ew=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),tw=G.object({name:G.string(),description:G.string()}),nw=G.object({name:G.string(),description:G.string().optional()}),sw=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:Xy,status:Qy,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:Zy.optional(),implementationNotes:G.string().optional(),stack:ew.optional(),modules:G.array(tw).optional(),roles:G.array(nw).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),cd=G.object({ideas:G.array(sw),lastUpdated:G.string()}),TA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as J}from"zod";function ud(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var ld,rw,ow,iw,aw,RA,DA,va=k(()=>{"use strict";ld=J.enum(["linear","jira","github","monday","asana","none"]),rw=J.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),ow=J.enum(["none","urgent","high","medium","low"]),iw=J.enum(["feature","bug","improvement","task","chore","epic"]),aw=J.object({id:J.string(),identifier:J.string(),title:J.string(),description:J.string().optional(),status:rw,priority:ow,type:iw.optional(),assignee:J.object({id:J.string(),name:J.string(),email:J.string().optional()}).optional(),labels:J.array(J.string()).default([]),team:J.object({id:J.string(),name:J.string(),key:J.string().optional()}).optional(),project:J.object({id:J.string(),name:J.string()}).optional(),url:J.string(),createdAt:J.string(),updatedAt:J.string(),fetchedAt:J.string()}),RA=J.object({provider:ld,lastSync:J.string(),staleAfter:J.number().default(18e5),issues:J.record(J.string(),aw)}),DA=J.object({provider:ld,fetched:J.number(),updated:J.number(),errors:J.array(J.object({issueId:J.string(),error:J.string()})),timestamp:J.string()});l(ud,"createEmptyIssues")});var fd={};Rn(fd,{AgentAssignmentSchema:()=>dd,OUTPUT_SCHEMAS:()=>md,SubtaskBreakdownSchema:()=>pd,TaskClassificationSchema:()=>yn,renderSchemaForPrompt:()=>xa});import{z as He}from"zod";function xa(r){let e=md[r];return e?`## OUTPUT FORMAT
|
|
293
293
|
|
|
294
294
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
295
295
|
|
|
@@ -298,15 +298,15 @@ ${e.example}
|
|
|
298
298
|
\`\`\`
|
|
299
299
|
|
|
300
300
|
Fields:
|
|
301
|
-
${
|
|
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
|
|
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
|
|
305
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
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
|
|
307
|
-
`)}async function
|
|
301
|
+
${cw(e.schema)}`:null}function cw(r){if(r instanceof He.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${gd(n)}`).join(`
|
|
302
|
+
`)}return"(see example above)"}function gd(r){return r instanceof He.ZodString?"string":r instanceof He.ZodNumber?"number":r instanceof He.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof He.ZodArray?`array of ${gd(r.element)}`:r instanceof He.ZodObject?"object":"any"}var dd,pd,md,ao=k(()=>{"use strict";ur();ur();dd=He.object({agentName:He.string(),reasoning:He.string(),confidence:He.number().min(0).max(1)}),pd=He.object({subtasks:He.array(He.object({description:He.string(),domain:io,agent:He.string(),dependsOn:He.array(He.number())})),effort:He.enum(["low","medium","high"])}),md={classification:{schema:yn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:dd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:pd,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(xa,"renderSchemaForPrompt");l(cw,"describeSchema");l(gd,"describeField")});import{z as T}from"zod";var hd,lw,uw,yd,dw,pw,mw,gw,fw,hw,yw,wd,ww,kw,LA,kd,Sd,bd,Cd,Sw,co,Ta=k(()=>{"use strict";hd=T.number().min(1).max(5),lw=T.enum(["exceeded","met","partial","failed"]),uw=T.enum(["definitely","probably","maybe","no"]),yd=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),dw=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:yd.optional(),explanation:T.string().optional()})}),pw=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),mw=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),gw=T.object({metrics:T.array(pw),acceptanceCriteria:T.array(mw),overallSuccess:lw,successScore:T.number().min(0).max(100)}),fw=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),hw=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(fw)}),yw=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:uw,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),wd=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:hd,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),ww=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:dw,success:gw.optional(),learnings:hw,roi:yw,rating:hd,taskOutcomes:T.array(wd).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),kw=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:yd,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),LA=T.object({outcomes:T.array(ww),taskOutcomes:T.array(wd).optional(),aggregates:kw.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),kd={outcomes:[],taskOutcomes:[],lastUpdated:""},Sd=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"),bd=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Cd=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Sw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),co=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=>Sw(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 _e}from"zod";function Tw(){let r={};for(let e of Pw)r[e]="allow";for(let e of vw)r[e]="ask";for(let e of xw)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var lo,WA,bw,Ea,Cw,zA,Pw,vw,xw,VA,Pd=k(()=>{"use strict";lo=_e.enum(["allow","deny","ask"]),WA=_e.enum(["read","write","delete","create"]),bw=_e.record(_e.string(),lo),Ea=_e.record(_e.string(),lo),Cw=_e.object({enabled:_e.boolean().default(!0),allowedDomains:_e.array(_e.string()).optional(),blockedDomains:_e.array(_e.string()).optional()}),zA=_e.object({bash:bw.optional(),files:_e.object({read:Ea.optional(),write:Ea.optional(),delete:Ea.optional()}).optional(),web:Cw.optional(),skills:_e.record(_e.string(),lo).optional(),doomLoop:_e.object({enabled:_e.boolean().default(!0),maxRetries:_e.number().default(3)}).optional(),externalDirectories:lo.default("ask")}),Pw=["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*"],vw=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],xw=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Tw,"buildDefaultPermissions");VA=Tw()});import{z as it}from"zod";var KA,YA,vd=k(()=>{"use strict";KA=it.object({projectId:it.string(),name:it.string(),repoPath:it.string(),description:it.string().optional(),version:it.string().optional(),cliVersion:it.string().optional(),techStack:it.array(it.string()),fileCount:it.number(),commitCount:it.number(),createdAt:it.string(),lastSync:it.string(),lastSyncCommit:it.string().optional(),lastSyncBranch:it.string().optional()}),YA={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as E}from"zod";var Ew,Aw,Iw,Rw,Dw,jw,$w,Mw,Ow,Fw,_w,Nw,Lw,Uw,Hw,Gw,Ww,zw,eI,tI,xd=k(()=>{"use strict";Ew=E.enum(["planned","active","completed","shipped"]),Aw=E.enum(["low","medium","high"]),Iw=E.enum(["feature","breaking_change","refactor","infrastructure"]),Rw=E.enum(["completed","active","planned"]),Dw=E.enum(["planned","active","completed"]),jw=E.enum(["git","git-branch","manual","prd"]),$w=E.object({id:E.string(),description:E.string(),completed:E.boolean(),completedAt:E.string().optional()}),Mw=E.object({id:E.string(),name:E.string(),status:Rw,completedAt:E.string().optional()}),Ow=E.object({goal:E.string(),phases:E.array(Mw),successMetrics:E.array(E.string()).optional()}),Fw=E.object({hours:E.number(),minutes:E.number(),totalMinutes:E.number(),display:E.string().optional()}),_w=E.object({hash:E.string(),message:E.string(),date:E.string(),author:E.string().optional()}),Nw=E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),breakdown:E.array(E.object({area:E.string(),hours:E.number()})).optional()}),Lw=E.object({hours:E.number().optional(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional()}),Uw=E.object({estimated:Nw.nullable(),actual:Lw.nullable()}),Hw=E.object({totalHours:E.number(),allocatedHours:E.number(),bufferPercent:E.number().optional()}),Gw=E.object({id:E.string(),name:E.string(),theme:E.string().optional(),goals:E.array(E.string()).optional(),features:E.array(E.string()),capacity:Hw.optional(),status:Dw,startDate:E.string().optional(),endDate:E.string().optional()}),Ww=E.object({id:E.string(),name:E.string(),description:E.string().optional(),date:E.string(),status:Ew,impact:Aw,effort:E.string().optional(),progress:E.number(),type:Iw.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($w),createdAt:E.string(),shippedAt:E.string().optional(),version:E.string().optional(),duration:Fw.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:jw.optional(),quarter:E.string().nullable().optional(),dependencies:E.array(E.string()).optional(),blockedBy:E.array(E.string()).optional(),effortTracking:Uw.optional(),valueScore:E.number().optional(),commits:E.array(_w).optional(),branch:E.string().optional(),commitsAhead:E.number().optional()}),zw=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()}),eI=E.object({strategy:Ow.nullable().optional(),features:E.array(Ww),backlog:E.array(E.union([E.string(),zw])),lastUpdated:E.string(),quarters:E.array(Gw).optional(),generatedFrom:E.enum(["git-history","manual","prd"]).optional(),generatedAt:E.string().optional()}),tI={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 Vw from"node:crypto";import{homedir as Bw}from"node:os";import{join as Jw}from"node:path";function me(){return Vw.randomUUID()}var qw,Td=k(()=>{"use strict";l(me,"generateUUID");qw=Jw(Bw(),".prjct-cli","projects")});import{z as et}from"zod";var uI,Ed=k(()=>{"use strict";uI=et.object({sessionId:et.string(),projectId:et.string(),projectPath:et.string(),projectName:et.string().optional(),taskDescription:et.string(),taskStatus:et.enum(["active","paused"]),activeSubtaskIndex:et.number().optional(),subtaskCount:et.number().optional(),branch:et.string().optional(),linearId:et.string().optional(),filesModified:et.array(et.string()).optional(),durationWorkedSec:et.number().optional(),timestamp:et.string(),resumeHint:et.string()})});import{z as Y}from"zod";var Kw,Ad,Yw,Xw,Qw,Zw,ek,tk,nk,Id,Aa=k(()=>{"use strict";Kw=Y.enum(["feature","fix","improvement","refactor"]),Ad=Y.enum(["pass","warning","fail","skipped"]),Yw=Y.enum(["added","changed","fixed","removed"]),Xw=Y.object({hours:Y.number(),minutes:Y.number(),totalMinutes:Y.number()}),Qw=Y.object({filesChanged:Y.number().nullable().optional(),linesAdded:Y.number().nullable().optional(),linesRemoved:Y.number().nullable().optional(),commits:Y.number().nullable().optional()}),Zw=Y.object({description:Y.string(),type:Yw.optional()}),ek=Y.object({lintStatus:Ad.nullable().optional(),lintDetails:Y.string().optional(),testStatus:Ad.nullable().optional(),testDetails:Y.string().optional()}),tk=Y.object({hash:Y.string().optional(),message:Y.string().optional(),branch:Y.string().optional()}),nk=Y.object({id:Y.string(),name:Y.string(),version:Y.string().nullable().optional(),type:Kw,agent:Y.string().optional(),description:Y.string().optional(),changes:Y.array(Zw).optional(),codeSnippets:Y.array(Y.string()).optional(),commit:tk.optional(),codeMetrics:Qw.optional(),qualityMetrics:ek.optional(),quantitativeImpact:Y.string().optional(),duration:Xw.optional(),tasksCompleted:Y.number().nullable().optional(),shippedAt:Y.string(),featureId:Y.string().optional()}),Id=Y.object({shipped:Y.array(nk),lastUpdated:Y.string()})});import{z as v}from"zod";var sk,Dd,rk,ok,ik,Ia,jd,ak,ck,$d,Rd,lk,uk,Md,Od,Fd,dk,pk,yI,uo=k(()=>{"use strict";nr();sk=v.enum(["low","medium","high","critical"]),Dd=v.enum(["feature","bug","improvement","chore"]),rk=v.enum(["active","backlog","previously_active"]),ok=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ik=v.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ia=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()}),jd=v.object({output:v.string().min(1,"Subtask output is required"),summary:Ia}),ak=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:ok,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Ia.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),ck=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),$d=v.object({id:v.string(),description:v.string(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(ak).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:ck.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:tr.optional()}),Rd=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional()}),lk=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()}),uk=v.object({taskId:v.string(),title:v.string(),classification:Dd,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Ia),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:lk.optional()}),Md=v.object({currentTask:$d.nullable(),previousTask:Rd.nullable().optional(),pausedTasks:v.array(Rd).optional(),taskHistory:v.array(uk).optional(),lastUpdated:v.string()}),Od=v.object({id:v.string(),description:v.string(),priority:sk,type:Dd,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:rk,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Fd=v.object({tasks:v.array(Od),lastUpdated:v.string()}),dk=v.object({tasksToday:v.number(),tasksThisWeek:v.number(),streak:v.number(),velocity:v.string(),avgDuration:v.string()}),pk=v.object({type:ik,description:v.string(),timestamp:v.string(),duration:v.string().optional()}),yI=v.object({projectId:v.string(),currentTask:$d.nullable(),queue:v.array(Od),stats:dk,recentActivity:v.array(pk),lastSync:v.string()})});import{z as re}from"zod";var mk,gk,_d,bI,CI,PI,wn,Nd,ps=k(()=>{"use strict";mk=re.enum(["improving","stable","declining"]),gk=re.object({sprintNumber:re.number(),startDate:re.string(),endDate:re.string(),pointsCompleted:re.number(),tasksCompleted:re.number(),avgVariance:re.number(),estimationAccuracy:re.number()}),_d=re.object({category:re.string(),avgVariance:re.number(),taskCount:re.number()}),bI=re.object({totalPoints:re.number(),sprints:re.number(),estimatedDate:re.string()}),CI=re.object({sprints:re.array(gk),averageVelocity:re.number(),velocityTrend:mk,estimationAccuracy:re.number(),overEstimated:re.array(_d),underEstimated:re.array(_d),lastUpdated:re.string()}),PI=re.object({sprintLengthDays:re.number().min(1).max(90).default(7),startDay:re.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:re.number().min(1).max(52).default(6),accuracyTolerance:re.number().min(0).max(100).default(20)}),wn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Nd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Dt=k(()=>{"use strict";rd();ba();ur();Pa();va();ao();nr();Ta();Pd();vd();xd();Td();Ed();Aa();uo();ps()});var Mn,Ra=k(()=>{"use strict";Dt();ls();ie();ar();Mn=class extends $n{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($),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values($);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values($));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:me(),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),D=(p.tags||[]).filter(B=>A.includes(B));g.tagMatch=Math.min(20,D.length*8)}let w=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-w*.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),D=0;for(let B of A)p.content.toLowerCase().includes(B)&&(D+=2),p.title.toLowerCase().includes(B)&&(D+=3);g.keywords=Math.min(15,D)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=ya[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=oo[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 wa(e)}_getCommandTags(e){return{ship:[$.COMMIT_STYLE,$.SHIP_WORKFLOW,$.TEST_BEHAVIOR],feature:[$.ARCHITECTURE,$.CODE_STYLE],done:[$.SHIP_WORKFLOW],analyze:[$.TECH_STACK,$.ARCHITECTURE],spec:[$.ARCHITECTURE,$.CODE_STYLE],task:[$.BRANCH_NAMING,$.CODE_STYLE],sync:[$.TECH_STACK,$.ARCHITECTURE,$.DEPENDENCIES],test:[$.TEST_BEHAVIOR],bug:[$.CODE_STYLE,$.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:[$.COMMIT_STYLE,$.SHIP_WORKFLOW,$.TEST_BEHAVIOR],feature:[$.ARCHITECTURE,$.CODE_STYLE],done:[$.SHIP_WORKFLOW],analyze:[$.TECH_STACK,$.ARCHITECTURE],spec:[$.ARCHITECTURE,$.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:[$.COMMIT_STYLE],branch_naming:[$.BRANCH_NAMING],test_before_ship:[$.TEST_BEHAVIOR,$.SHIP_WORKFLOW],preferred_agent:[$.AGENT_PREFERENCE],code_style:[$.CODE_STYLE],verbosity:[$.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 Da,fk,Ne,ms=k(()=>{"use strict";ar();ka();Ra();ar();ka();Ra();Da=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Mn,this._patternStore=new cr,this._historyStore=new ir,this._sessionStore=new or}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()}},fk=new Da,Ne=fk});import{exec as hk}from"node:child_process";import ht from"node:fs/promises";import jt from"node:path";import{promisify as yk}from"node:util";var On,ja,wk,Ge,Ld=k(()=>{"use strict";F();On=yk(hk),ja=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=jt.join(this.projectPath,"package.json"),t=await ht.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=jt.join(this.projectPath,"Cargo.toml");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=jt.join(this.projectPath,"requirements.txt");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=jt.join(this.projectPath,"go.mod");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=jt.join(this.projectPath,"Gemfile");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=jt.join(this.projectPath,"mix.exs");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=jt.join(this.projectPath,"pom.xml");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=jt.join(this.projectPath,"composer.json"),t=await ht.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=jt.join(this.projectPath,"pyproject.toml");return await ht.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await On('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 ht.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 ht.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 On(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await On("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await On('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await On('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 On('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 ht.access(jt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=jt.join(this.projectPath,e);return await ht.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await On(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
305
|
+
`).filter(Boolean)}catch{return[]}}},wk=new ja,Ge=wk});import{z as ye}from"zod";function kk(r){return r instanceof gs}function X(r){return kk(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var fs,yR,wR,kR,SR,bR,CR,gs,po,mo,dr,rn=k(()=>{"use strict";fs={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}},yR=fs.create("FileError",ye.object({path:ye.string(),operation:ye.enum(["read","write","delete","create","copy"]),reason:ye.string().optional()})),wR=fs.create("ValidationError",ye.object({field:ye.string(),expected:ye.string(),received:ye.string().optional(),message:ye.string().optional()})),kR=fs.create("PermissionError",ye.object({action:ye.string(),resource:ye.string(),reason:ye.string().optional()})),SR=fs.create("TaskError",ye.object({taskId:ye.string().optional(),operation:ye.enum(["create","update","complete","pause","resume","delete"]),reason:ye.string()})),bR=fs.create("SessionError",ye.object({sessionId:ye.string().optional(),reason:ye.string()})),CR=fs.create("SyncError",ye.object({projectId:ye.string().optional(),operation:ye.enum(["push","pull","auth","connect"]),reason:ye.string()})),gs=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)}},po=class r extends gs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},mo=class r extends gs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},dr=class r extends gs{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(kk,"isPrjctError");l(X,"getErrorMessage")});import $a from"node:fs";import fo from"node:path";function Ud(){if(pr)return pr;let r=__dirname;for(let e=0;e<5;e++){let t=fo.join(r,"package.json");if($a.existsSync(t))try{if(JSON.parse($a.readFileSync(t,"utf-8")).name==="prjct-cli")return pr=r,r}catch{}r=fo.dirname(r)}return pr=fo.join(__dirname,"..","..",".."),pr}function Ma(){if(go)return go;try{let r=fo.join(Ud(),"package.json"),e=JSON.parse($a.readFileSync(r,"utf-8"));return go=e.version,Sk=e,go}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var go,Sk,pr,We,ae,Bt=k(()=>{"use strict";F();go=null,Sk=null,pr=null;l(Ud,"getPackageRoot");l(Ma,"getVersion");We=Ma(),ae=Ud()});import Fa from"node:fs";import bk from"node:fs/promises";import ho from"node:path";function _a(){if(Hd)return Oa;Hd=!0;let r=ho.join(ae,"dist","templates.json");try{let e=Fa.readFileSync(r,"utf-8");return Oa=JSON.parse(e),Oa}catch{return null}}function Pk(r){let e=Fn.indexOf(r);e>-1&&Fn.splice(e,1),Fn.push(r)}function vk(){for(;hs.size>=Ck&&Fn.length>0;){let r=Fn.shift();r&&hs.delete(r)}}function yo(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 Gd(r){if(hs.has(r))return Pk(r),hs.get(r);let e,t=_a();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ho.join(ae,"templates","commands",`${r}.md`);try{e=await bk.readFile(s,"utf-8")}catch{throw mo.notFound(r)}}let n=yo(e);return vk(),hs.set(r,n),Fn.push(r),n}async function xk(r){return(await Gd(r)).frontmatter["allowed-tools"]||[]}function Tk(){hs.clear(),Fn.length=0}function ce(r){let e=_a();if(e?.[r])return e[r];let t=ho.join(ae,"templates",r);try{return Fa.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=_a();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ho.join(ae,"templates",r);try{return Fa.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Ck,hs,Fn,Oa,Hd,Ek,Na,Jt=k(()=>{"use strict";rn();Bt();Ck=50,hs=new Map,Fn=[],Oa=null,Hd=!1;l(_a,"loadBundle");l(Pk,"updateLruOrder");l(vk,"evictLru");l(yo,"parseFrontmatter");l(Gd,"load");l(xk,"getAllowedTools");l(Tk,"clearCache");l(ce,"getTemplateContent");l(kn,"listTemplates");Ek={load:Gd,parseFrontmatter:yo,getAllowedTools:xk,clearCache:Tk,getTemplateContent:ce,listTemplates:kn},Na=Ek});import q from"node:fs/promises";import Ua from"node:os";import Q from"node:path";async function Ak(){try{let r=ce("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Q.join(ae,"templates/global/modules/module-config.json"),t=await q.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Ik(r){let e=await Ak();if(!e){let i=ce("global/CLAUDE.md");if(i)return i;let a=Q.join(ae,"templates/global/CLAUDE.md");return q.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ce("global/CLAUDE.md");if(a)return a;let c=Q.join(ae,"templates/global/CLAUDE.md");return q.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=ce(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Q.join(ae,"templates/global/modules",i),u=await q.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 Rk(){try{let r=Q.join(Ua.homedir(),".prjct-cli","docs");await q.mkdir(r,{recursive:!0});let e=kn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ce(s);if(o){let i=Q.basename(s);await q.writeFile(Q.join(r,i),o,"utf-8")}}return{success:!0}}let t=Q.join(ae,"templates/global/docs"),n=await q.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Q.join(t,s),i=Q.join(r,s),a=await q.readFile(o,"utf-8");await q.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Dk(){let r=(Ze(),Pt(ft)),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 q.mkdir(e.configDir,{recursive:!0});let s=Q.join(e.configDir,e.contextFile),o=Q.join(ae,"templates","global",e.contextFile),i="";try{let u=ce(`global/${e.contextFile}`);u?i=u:i=await q.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Ik()}catch{let d=ce("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ae,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}}else{let d=ce("global/CLAUDE.md");if(d)i=d;else{let m=Q.join(ae,"templates/global/CLAUDE.md");i=await q.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await q.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),w=p+f+g;return await q.writeFile(s,w,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
308
308
|
|
|
309
|
-
${i}`;return await
|
|
309
|
+
${i}`;return await q.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await q.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Wd(){let r=Ua.homedir();return{claude:{commands:Q.join(r,".claude","commands","p"),config:Q.join(r,".claude"),router:Q.join(r,".claude","commands","p.md")},gemini:{commands:Q.join(r,".gemini","commands"),config:Q.join(r,".gemini"),router:Q.join(r,".gemini","commands","p.toml")}}}var La,jk,Ce,Sn=k(()=>{"use strict";Jt();F();Bt();l(Ak,"loadModuleConfig");l(Ik,"composeGlobalTemplate");l(Rk,"installDocs");l(Dk,"installGlobalConfig");La=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ua.homedir(),this.templatesDir=Q.join(ae,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Pt(ft)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Q.join(t.configDir,"commands"):this.claudeCommandsPath=Q.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await q.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=kn("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 q.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(Ze(),Pt(ft)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await q.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Q.join(this.claudeCommandsPath,a),u=ce(`commands/${a}`);if(u)await q.writeFile(c,u,"utf-8");else{let d=Q.join(this.templatesDir,a),m=await q.readFile(d,"utf-8");await q.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=Q.join(this.claudeCommandsPath,s);await q.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await q.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 q.access(this.claudeCommandsPath);let n=(await q.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(ce(`commands/${e}.md`))return!0;try{let n=Q.join(this.templatesDir,`${e}.md`);return await q.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Ze(),Pt(ft)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Q.join(t.configDir,"commands",n);await q.mkdir(Q.dirname(s),{recursive:!0});let o=ce(`commands/${n}`);if(o)return await q.writeFile(s,o,"utf-8"),!0;let i=Q.join(this.templatesDir,n),a=await q.readFile(i,"utf-8");return await q.writeFile(s,a,"utf-8"),!0}catch(s){if(P(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Ze(),Pt(ft)).getActiveProvider(),n=Q.join(t.configDir,"commands"),s=0;try{let i=(await q.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await q.unlink(Q.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 q.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await q.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=Q.join(this.claudeCommandsPath,o),a=n.includes(o),c=ce(`commands/${o}`);if(c)await q.writeFile(i,c,"utf-8");else{let u=Q.join(this.templatesDir,o),d=await q.readFile(u,"utf-8");await q.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 Dk()}async installDocs(){return Rk()}};l(Wd,"getProviderPaths");jk=new La,Ce=jk});import{z as De}from"zod";function Jd(r,e="default"){let t=zd[e]||zd.default;return r/1e3*t}function wo(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var $k,Mk,Vd,Bd,zd,ko=k(()=>{"use strict";$k=De.object({date:De.string(),tokensSaved:De.number(),syncs:De.number(),avgCompressionRate:De.number(),totalDuration:De.number()}),Mk=De.object({agentName:De.string(),usageCount:De.number(),tokensSaved:De.number()}),Vd=De.object({totalTokensSaved:De.number(),avgCompressionRate:De.number(),syncCount:De.number(),watchTriggers:De.number(),avgSyncDuration:De.number(),totalSyncDuration:De.number(),agentUsage:De.array(Mk),dailyStats:De.array($k),firstSync:De.string(),lastUpdated:De.string()}),Bd={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},zd={"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(Jd,"estimateCostSaved");l(wo,"formatCost")});function Ok(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Fk(r){let e=[],t=Ok(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Ha,o+i.length);if(c===-1)continue;let u=c+Ha.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Ga(r,e){let t=Fk(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
310
310
|
|
|
311
311
|
---
|
|
312
312
|
|
|
@@ -317,11 +317,11 @@ ${i}`;return await V.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
|
|
|
317
317
|
`;for(let s of t)n+=s.content,n+=`
|
|
318
318
|
|
|
319
319
|
`;return`${n.trimEnd()}
|
|
320
|
-
`}function
|
|
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(
|
|
322
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await
|
|
323
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:
|
|
324
|
-
`;await
|
|
320
|
+
`}function Wa(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(Ha)&&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 Ha,za=k(()=>{"use strict";Ha="<!-- /prjct:preserve -->";l(Ok,"createPreserveStartRegex");l(Fk,"extractPreservedSections");l(Ga,"mergePreservedSections");l(Wa,"validatePreserveBlocks")});function mr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&_k.has(e.code))return!0;if(e.code&&Kd.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 bo(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Kd.has(e.code))}function qd(r,e,t){let n=bn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(bn.delete(r),!1):!0:!1}function Va(r,e){let t=bn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bn.set(r,t)}function Nk(r){bn.delete(r)}var _k,Kd,bn,So,Yd,gr,Co=k(()=>{"use strict";_k=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Kd=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(mr,"isTransientError");l(bo,"isPermanentError");bn=new Map;l(qd,"isCircuitOpen");l(Va,"recordFailure");l(Nk,"recordSuccess");So=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(qd(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 Nk(t),o}catch(o){if(n=o,s++,bo(o))throw Va(t,this.options.circuitBreakerThreshold),o;if(!(mr(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 mr(e)}isCircuitOpen(e){return qd(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bn.get(e)}resetCircuit(e){bn.delete(e)}resetAllCircuits(){bn.clear()}},Yd=new So({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),gr=new So({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Xd=k(()=>{"use strict";za();Co()});import{exec as Lk}from"node:child_process";import{promisify as Uk}from"node:util";async function Po(r){try{let{stdout:e}=await Hk(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Gk(){let r=await Po("gh api user --jq .login");return r.success&&r.output||(r=await Po("git config --global github.user"),r.success&&r.output)?r.output:null}async function Wk(){let r=await Po("git config user.name");return r.success&&r.output?r.output:null}async function zk(){let r=await Po("git config user.email");return r.success&&r.output?r.output:null}async function ys(){let[r,e,t]=await Promise.all([Gk(),Wk(),zk()]);return{github:r,email:t,name:e||r||"Unknown"}}var Hk,vo=k(()=>{"use strict";Hk=Uk(Lk);l(Po,"execCommand");l(Gk,"detectGitHubUsername");l(Wk,"detectGitName");l(zk,"detectGitEmail");l(ys,"detect")});import _n from"node:fs/promises";import Vk from"node:path";import*as xo from"jsonc-parser";function Qd(r){let e=[],t=xo.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}: ${xo.printParseErrorCode(n.error)}`)}return t}var Ja,Bk,M,yt=k(()=>{"use strict";rn();F();ie();Bt();vo();he();l(Qd,"parseJsonc");Ja=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=x.getLocalConfigPath(e),n=await _n.readFile(t,"utf-8");return Qd(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${X(t)}`),null}}async writeConfig(e,t){let n=x.getLocalConfigPath(e),s=x.getLegacyPrjctPath(e);await _n.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await _n.writeFile(n,`${o}
|
|
322
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=x.getGlobalProjectConfigPath(e),n=await _n.readFile(t,"utf-8");return Qd(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${X(t)}`),null}}async writeGlobalConfig(e,t){let n=x.getGlobalProjectConfigPath(e),s=x.getGlobalProjectPath(e);await _n.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await _n.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:We,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:We,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 _n.readdir(Vk.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 ys(),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))}}},Bk=new Ja,M=Bk});import To from"node:fs/promises";import qa from"node:path";var Ka,Zd,ep=k(()=>{"use strict";yt();he();F();Ka=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await M.getProjectId(e),this.projectPath=e,this.agentsPath=x.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await To.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await To.readFile(qa.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=qa.join(this.agentsPath,`${e}.md`),n=await To.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=qa.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 To.appendFile(s,o)}catch(s){P(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Zd=Ka});import tp from"node:path";async function Kk(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await R(tp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await R(tp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Yk(){return{...Jk}}function Xk(){return{...qk}}async function np(){return Eo||(Eo=await Kk()?Yk():Xk(),Eo)}var Eo,Jk,qk,sp=k(()=>{"use strict";$e();Eo=null,Jk={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}},qk={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(Kk,"isClaudeEnvironment");l(Yk,"getClaudeAgent");l(Xk,"getTerminalAgent");l(np,"detect")});import fr from"node:fs/promises";var Ya,rp,op=k(()=>{"use strict";F();Ya=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await fr.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 fr.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 fr.readdir(e)}async fileExists(e){try{return await fr.access(e),!0}catch(t){if(P(t))return!1;throw t}}async createDirectory(e){await fr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
325
325
|
${e.map((t,n)=>`${n+1}. ${t}`).join(`
|
|
326
326
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
327
327
|
|
|
@@ -366,7 +366,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
366
366
|
|
|
367
367
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
368
368
|
|
|
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}}},
|
|
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}}},rp=Ya});var Zk,Ao,ws,ip=k(()=>{"use strict";ep();rn();sp();op();Co();Zk=["claude"],Ao=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Zd}async initialize(){return this.agent?this.agent:await Yd.execute(async()=>{if(this.agentInfo=await np(),!this.agentInfo?.isSupported)throw dr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Zk.includes(e))throw dr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new rp,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:`
|
|
370
370
|
AGENTIC EXECUTION:
|
|
371
371
|
- Read: templates/agentic/orchestrator.md
|
|
372
372
|
- Analyze task: "${e}"
|
|
@@ -374,14 +374,14 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
|
|
|
374
374
|
- Claude decides which agent(s) to use
|
|
375
375
|
- Always prefer specialists over generalist
|
|
376
376
|
- Fragment complex tasks into subtasks
|
|
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}},
|
|
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}},ws=new Ao});var Io,Ro,ap=k(()=>{"use strict";Io=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"}},Ro=new Io});import cp from"node:path";var eS,tS,hr,lp=k(()=>{"use strict";ie();$e();eS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],tS=`# Changelog
|
|
378
378
|
|
|
379
379
|
All notable changes to this project will be documented in this file.
|
|
380
380
|
|
|
381
381
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
382
382
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
383
|
-
`,
|
|
384
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await
|
|
383
|
+
`,hr=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let n of eS){let s=cp.join(this.projectPath,n);if(await R(s)){let o=await Qe(s),i=this.detectFormat(o);return{filePath:s,fileName:n,format:i,created:!1}}}let e="CHANGELOG.md",t=cp.join(this.projectPath,e);return await Wt(t,`${tS}
|
|
384
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),n=await Qe(t.filePath),s=e.date||us(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(n,e,s):o=this.insertMarkdownEntry(n,e,s),await Wt(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
385
|
${a}`}return`${e.trimEnd()}
|
|
386
386
|
|
|
387
387
|
${s}`}insertMarkdownEntry(e,t,n){let s=this.formatMarkdownEntry(t,n),o=e.indexOf(`
|
|
@@ -391,18 +391,18 @@ ${a}`}return`${s}
|
|
|
391
391
|
|
|
392
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
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
|
|
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(),!
|
|
398
|
-
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(
|
|
399
|
-
${
|
|
400
|
-
`),this)},progress(r,e,t){if(
|
|
401
|
-
`),this)}},h=
|
|
394
|
+
`)}}});import nS from"node:crypto";import Do from"node:fs/promises";import up from"node:path";function dp(){return{version:$t,lastUpdated:"",checksums:{}}}var $t,Xa,Be,yr=k(()=>{"use strict";he();F();ie();se();$t="1.0.0";l(dp,"getDefaultChecksums");Xa=class{static{l(this,"IndexStorage")}getIndexPath(e){return up.join(x.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await Do.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==$t?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 dp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await Do.readFile(e);return nS.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:$t,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 Do.readdir(t);await Promise.all(n.map(s=>Do.unlink(up.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!==$t?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!==$t?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)}},Be=new Xa});var pp,sS,jo,rS,mp=k(()=>{"use strict";yr();pp=8e4,sS={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"]},jo=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||pp,[c,u,d]=await Promise.all([Be.readIndex(t),Be.readDomains(t),Be.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let D of m){let B=d.domainIndex[D]||[];for(let be of B)p.add(be)}if(i&&d.domainIndex.general){let D=d.domainIndex.general.slice(0,10);for(let B of D)p.add(B)}let g=c.relevantFiles.filter(D=>p.has(D.path)&&D.score>=o);g.sort((D,B)=>B.score-D.score);let f=0,w=[];for(let D of g){let B=Math.ceil(D.size/this.CHARS_PER_TOKEN);if(f+B>a||w.length>=s)break;w.push(D),f+=B}let S=Math.ceil(c.relevantFiles.reduce((D,B)=>D+B.size,0)/this.CHARS_PER_TOKEN),A=S>0?(S-f)/S:0;return{files:w,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:w.length,compressionRate:A,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(sS))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 Be.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 Be.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Be.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||pp,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)}},rS=new jo});import{execFile as oS}from"node:child_process";import Qa from"node:fs/promises";import gp from"node:os";import Za from"node:path";import{promisify as iS}from"node:util";function lS(){let r=ce("mcp-config.json");if(!r)return{mcpServers:{context7:ec}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:ec}}}}function yp(){return lS().mcpServers?.context7||ec}function fp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Za.join(gp.tmpdir(),"prjct-context7-test","mcp.json"):Za.join(gp.homedir(),".claude","mcp.json")}async function hp(r){try{let e=await Qa.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e))return{};throw e}}async function uS(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=yp(),e=[...r.args||[],"--help"];await aS(r.command||"npx",e,{timeout:15e3})}var aS,ec,cS,ks,tc,wp,on,Ss=k(()=>{"use strict";Jt();F();aS=iS(oS),ec={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},cS=300*1e3,ks=null;l(lS,"parseTemplateConfig");l(yp,"getContext7Config");l(fp,"getConfigPath");l(hp,"readConfig");l(uS,"runSmokeCheck");tc=class{static{l(this,"Context7Service")}async install(){let e=fp(),t=Za.dirname(e);await Qa.mkdir(t,{recursive:!0});let n=await hp(e),s=n.mcpServers||{};return s.context7=yp(),n.mcpServers=s,await Qa.writeFile(e,JSON.stringify(n,null,2),"utf-8"),ks=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(ks&&Date.now()-ks.at<cS)return ks.status;let e=fp(),s=((await hp(e)).mcpServers||{}).context7;if(!s?.command||!Array.isArray(s.args)||s.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await uS();let o={installed:!0,verified:!0,configPath:e};return ks={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return ks={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},wp=new tc,on=wp});import kp from"node:path";var nc,$o,dS,Sp=k(()=>{"use strict";yr();ie();nc=[{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"}],$o=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 nc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=kp.dirname(i.path);n.get(u).add(`**/${kp.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=nc.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 nc)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:$t,projectId:e,domains:t,discoveredAt:s};await Be.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:$t,lastUpdate:s,fileCategories:n,domainIndex:i};await Be.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Be.readDomains(e),Be.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 Be.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 Be.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:$t,lastUpdate:b(),fileCategories:u,domainIndex:d};await Be.writeCategories(e,m)}return o}},dS=new $o});import sc from"node:path";var rc,pS,mS,Mo,bp,oc=k(()=>{"use strict";rc=30,pS=[/^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$/],mS=[/^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],Mo=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=rc){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=sc.basename(e.path);for(let n of pS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=sc.basename(e.path);for(let s of mS)if(s.test(t))return 15;let n=sc.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}},bp=new Mo});function bs(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return gS[r]}var ee,ic,ac,Oo,gS,Mt,Cp,an=k(()=>{"use strict";ee={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},ic=["feature","spec","design","refactor","migrate"],ac=["ship","cleanup","git","migrate"],Oo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],gS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bs,"getTimeout");Mt={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},Cp={HISTORY_MAX:100}});function cc(r,e){return{...er[r],...e}}function Fo(r,e,t){return{message:r,hint:e,...t}}var _o=k(()=>{"use strict";Xr();Xr();l(cc,"getError");l(Fo,"createError")});import{execSync as lc}from"node:child_process";var No,uc,Lo,Cs,Uo=k(()=>{"use strict";_o();No={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"}},uc=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=No[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=No[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Lo(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=No[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
395
|
+
`);throw new Lo({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(No),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=lc(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:Fo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return lc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return lc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Fo(`${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())}},Lo=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}},Cs=new uc});import{exec as fS}from"node:child_process";import{promisify as hS}from"node:util";var Ij,Pp=k(()=>{"use strict";an();Uo();Ij=hS(fS)});var qt,dc,wt,Cn=k(()=>{"use strict";Dt();ie();se();qt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},dc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=me(),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(me(),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}},wt=new dc});var Ho,lt,pc=k(()=>{"use strict";yt();Cn();se();Ho=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await M.getProjectId(e);if(!o)return;N.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 M.getProjectId(e);return n?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 M.getProjectId(e);return s?N.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 M.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(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=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=qt.MEMORY_MAX_ENTRIES)return 0;let s=n-qt.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);wt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},lt=new Ho});var vp=k(()=>{"use strict";he();$e()});import{execSync as yS}from"node:child_process";import wS from"node:fs/promises";import Go from"node:path";function kS(r){return r.trim().toLowerCase()}async function SS(r){try{return await wS.access(r),!0}catch{return!1}}function bS(){let r=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(r)return r;try{let e=In.resolve("prjct-cli/package.json");return Go.dirname(e)}catch{return null}}function CS(){let r=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(r)return r;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return yS("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim().replace(/\r?\n/g,"")}catch{return null}}function PS(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||ae}function vS(){let r=[],e=bS();e&&r.push({source:"package-resolve",root:e});let t=CS();return t&&r.push({source:"npm-root-g",root:Go.join(t,"prjct-cli")}),r.push({source:"local-dev",root:PS()}),r}function xS(){let e=kn("commands/").filter(t=>t.endsWith(".md")).map(t=>Go.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function gc(r){return r instanceof Error&&typeof r.code=="string"&&typeof r.message=="string"}var wr,mc,fc,hc=k(()=>{"use strict";Jt();Bt();wr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l(kS,"normalizeCommand");l(SS,"fileExists");l(bS,"getPackageResolveRoot");l(CS,"getNpmGlobalRoot");l(PS,"getLocalDevRoot");l(vS,"getCandidateRoots");l(xS,"getCatalogFromTemplates");mc=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return xS()}validatePCommand(e){let t=kS(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new wr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new wr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);for(let n of vS()){let s=Go.join(n.root,"templates","commands",`${t.command}.md`);if(await SS(s))return{command:t.command,templatePath:s,source:n.source}}throw new wr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(gc,"isPCommandResolveError");fc=new mc});import{createHash as TS}from"node:crypto";import Tp from"node:fs/promises";import wc from"node:path";function Nn(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function AS(r){let e=wc.resolve(r);return TS("sha256").update(e).digest("hex").slice(0,16)}function Wo(r){let e=ce(r);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function IS(r){let e=[],t=[r];for(;t.length>0&&e.length<xp;){let n=t.pop();if(!n)break;let s=await Tp.readdir(n,{withFileTypes:!0});for(let o of s){if(e.length>=xp)break;let i=wc.join(n,o.name);if(o.isDirectory()){ES.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function RS(r,e){let t=[],n=[],s=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=wc.relative(r,d),p=await Tp.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(s=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return s&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function DS(r){let e=new Set,t=[];for(let n of r){let s=`${Nn(n.name)}::${Nn(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}function jS(r){let e=new Set,t=[];for(let n of r){let s=`${Nn(n.issue)}::${Nn(n.file)}::${Nn(n.source)}`;e.has(s)||(e.add(s),t.push(n))}return t}var ES,xp,yc,Ep,Ap,kc=k(()=>{"use strict";Jt();se();ES=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),xp=400;l(Nn,"normalizeKey");l(AS,"repoHash");l(Wo,"parseBaselineFile");l(IS,"listSourceFiles");l(RS,"detectRepoRules");l(DS,"dedupePatterns");l(jS,"dedupeAntiPatterns");yc=class{static{l(this,"PatternExtractor")}async extract(e){let t=AS(e.projectPath),n=await IS(e.projectPath),s=[],o=[];for(let p of e.languages){let g=Nn(p),f=Wo(`baseline/patterns/${g}.json`),w=Wo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,language:p,source:"baseline",confidence:S.confidence??.8}))),o.push(...w.map(S=>({...S,file:S.file||"multiple",language:p,source:"baseline",confidence:S.confidence??.8})))}for(let p of e.frameworks){let g=Nn(p),f=Wo(`baseline/patterns/${g}.json`),w=Wo(`baseline/anti-patterns/${g}.json`);s.push(...f.map(S=>({...S,framework:p,source:"baseline",confidence:S.confidence??.82}))),o.push(...w.map(S=>({...S,file:S.file||"multiple",framework:p,source:"baseline",confidence:S.confidence??.82}))),e.context7Verified&&s.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await RS(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=DS([...s,...i.patterns,...a]),d=jS([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return I.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},Ep=new yc,Ap=Ep});import{exec as MS}from"node:child_process";import{promisify as OS}from"node:util";var u0,Ip=k(()=>{"use strict";yr();ie();oc();u0=OS(MS)});import Ln from"chalk";var Rp,FS,_S,Ot,Dp=k(()=>{"use strict";Ze();Rp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],FS=80,_S={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Rp,speed:FS},cli:{header:l(()=>`${Ln.cyan.bold("\u26A1")} ${Ln.cyan("prjct")}`,"header"),footer:l(()=>Ln.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Ln.cyan("\u26A1")} ${Ln.cyan("prjct")} ${Ln.cyan(Rp[r%10])} ${Ln.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>no(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>no(r).signature,"getSignature")},Ot=_S});import te from"chalk";function US(){return NS[LS]}var b0,Sc,NS,LS,Un,Ps,bc,kt,Pn,HS,GS,h,Hn=k(()=>{"use strict";Dp();an();_o();_o();b0=Ot.spinner.frames,Sc=Ot.spinner.speed,NS={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},LS="compact";l(US,"getTierConfig");Un={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},Ps=null,bc=0,kt=!1,Pn=l((r,e)=>{let t=e??(US().maxCharsPerLine||Mt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),HS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Mt.CLEAR_WIDTH)}\r`):!0,"clear"),GS={start(){return kt||console.log(Ot.cli.header()),this},end(){return kt||console.log(Ot.cli.footer()),this},spin(r){return kt?this:(this.stop(),process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(bc++,Pn(r,Mt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${Ot.cli.spin(0,Pn(r,Mt.SPINNER_MSG))}
|
|
397
|
+
`),this))},done(r,e){if(this.stop(),!kt){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${Un.success} ${Pn(r,Mt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Un.fail} ${Pn(r,Mt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?cc(r):r;return console.error(),console.error(`${Un.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),kt||console.log(`${Un.warn} ${Pn(r,Mt.WARN_MSG)}`),this},info(r){return this.stop(),kt||console.log(`${Un.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!kt&&e&&console.log(`${Un.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),kt)return this;let t=e.bullet||Un.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),kt||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(te.dim(s)),console.log(te.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),kt)return this;let t=e.split(`
|
|
398
|
+
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),kt?this:(console.log(`
|
|
399
|
+
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return Ps&&(clearInterval(Ps),Ps=null,HS()),this},step(r,e,t){if(kt)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(bc++,`${n} ${Pn(t,Mt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${Ot.cli.spin(0,`${n} ${Pn(t,Mt.STEP_MSG)}`)}
|
|
400
|
+
`),this)},progress(r,e,t){if(kt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Pn(t,Mt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Ps=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(bc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
401
|
+
`),this)}},h=GS});function jp(r,e){let t=[];kr("Languages",r.languages,e.languages,t),kr("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)"}),kr("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);kr("Patterns",n,s,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);kr("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 Cc(r){if(!r.hasChanges)return`## Analysis Diff
|
|
402
402
|
|
|
403
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(`
|
|
404
|
-
`)}function
|
|
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(`
|
|
404
|
+
`)}function $p(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 kr(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 Pc=k(()=>{"use strict";l(jp,"generateAnalysisDiff");l(Cc,"formatAnalysisDiffMd");l($p,"formatAnalysisDiffText");l(kr,"diffStringArray")});function zS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(WS.has(r)||r.includes("prjct"))return{level:vs.debug,name:"debug"};let e=vs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Mp>=r?(...n)=>console[t](e,...n):BS}var vs,WS,Mp,VS,BS,JS,L,Gn=k(()=>{"use strict";vs={error:0,warn:1,info:2,debug:3},WS=new Set(["1","true","*"]);l(zS,"getLogLevel");({level:Mp,name:VS}=zS()),BS=l(()=>{},"noop");l(zo,"createLogMethod");JS={error:zo(vs.error,"[prjct:error]","error"),warn:zo(vs.warn,"[prjct:warn]","warn"),info:zo(vs.info,"[prjct:info]","log"),debug:zo(vs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Mp>=0,"isEnabled"),level:l(()=>VS,"level")},L=JS});var Vo,qS,Op=k(()=>{"use strict";rn();se();oa();an();Gn();Vo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Cp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&L.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Yr.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(Yr.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw L.error("Event callback error:",n),n}}async logEvent(e){try{I.appendEvent(this.projectId,e.type,e)}catch(t){L.debug("Failed to log event:",X(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},qS=new Vo});var Bo,Jo,Fp=k(()=>{"use strict";he();ie();$e();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=x.getSyncPendingPath(e.projectId),n=await Gt(t,[])??[];n.push(e),await Dn(t,n)}async getPending(e){let t=x.getSyncPendingPath(e);return await Gt(t,[])??[]}async clearPending(e){let t=x.getSyncPendingPath(e);await Dn(t,[])}async updateLastSync(e){let t=x.getLastSyncPath(e),n={timestamp:b(),success:!0};await Dn(t,n)}async getLastSync(e){let t=x.getLastSyncPath(e);return await Gt(t,null)}},Jo=new Bo});var vc=k(()=>{"use strict";Op();Fp()});var Ft,qo=k(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Le,Kt=k(()=>{"use strict";vc();qo();ie();se();Le=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=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 Jo.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 YS}from"node:crypto";var xc,Je,Ko=k(()=>{"use strict";ba();Pc();ie();Kt();xc=class extends Le{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"};Sa.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 Sa.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:jp(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 od(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 YS("sha256").update(JSON.stringify(t)).digest("hex")}},Je=new xc});var Tc,qe,Sr=k(()=>{"use strict";Dt();Pa();ie();Cn();Kt();Tc=class extends Le{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",cd)}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:me(),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=gn(qt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;wt.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}},qe=new Tc});var Ec,Wn,Yo=k(()=>{"use strict";ko();ie();Kt();Ec=class extends Le{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Vd)}getDefault(){return{...Bd}}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],w=m.filter(A=>A.date>=f),S=[...i.agentUsage];if(t.agents)for(let A of t.agents){let D=S.findIndex(B=>B.agentName===A);D>=0?S[D]={...S[D],usageCount:S[D].usageCount+1,tokensSaved:S[D].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:w,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:Jd(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)}},Wn=new Ec});import at from"node:fs/promises";import pe from"node:path";async function br(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=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await XS(s,o,i),I.getDb(r);for(let{filename:a,key:c}of Rc){let u=pe.join(s,a),d=await zn(u);if(d===null){t.skippedFiles.push(a);continue}try{I.setDoc(r,c,d),_p(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of Ic){let u=pe.join(o,a),d=await zn(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()),Np(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await ob(r,o,t),await ib(r,o,t),await ab(r,i,t),await cb(r,i,t),t.errors.length===0&&await lb(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 XS(r,e,t){let n=pe.join(r,"backup");return await at.mkdir(n,{recursive:!0}),await at.mkdir(pe.join(n,"index"),{recursive:!0}),await at.mkdir(pe.join(n,"memory"),{recursive:!0}),await Ac(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Ac(e,pe.join(n,"index")),await Ac(t,pe.join(n,"memory")),n}async function Ac(r,e,t){try{let n=await at.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=pe.join(r,s.name),i=pe.join(e,s.name);await at.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function _p(r,e,t){switch(e){case"state":QS(r,t);break;case"queue":ZS(r,t);break;case"ideas":eb(r,t);break;case"shipped":tb(r,t);break;case"metrics":nb(r,t);break;case"analysis":sb(r,t);break}}function QS(r,e){let t=I.getDb(r),n=t.prepare(`
|
|
406
406
|
INSERT OR REPLACE INTO tasks
|
|
407
407
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
408
408
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -413,83 +413,83 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
|
|
|
413
413
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
414
414
|
depends_on, started_at, completed_at, output, summary)
|
|
415
415
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
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 ZS(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
417
417
|
INSERT OR REPLACE INTO queue_tasks
|
|
418
418
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
419
419
|
feature_id, feature_name)
|
|
420
420
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
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 eb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
422
422
|
INSERT OR REPLACE INTO ideas
|
|
423
423
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
424
424
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
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 tb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
426
426
|
INSERT OR REPLACE INTO shipped_features
|
|
427
427
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
428
428
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
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 nb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
430
430
|
INSERT OR REPLACE INTO metrics_daily
|
|
431
431
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
432
432
|
VALUES (?, ?, ?, ?, ?)
|
|
433
|
-
`);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 sb(r,e){let n=I.getDb(r).prepare(`
|
|
434
434
|
INSERT OR REPLACE INTO analysis
|
|
435
435
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
436
436
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
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
|
|
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 Np(r,e,t){e==="categories-cache"&&rb(r,t)}function rb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=I.getDb(r).prepare(`
|
|
438
438
|
INSERT OR REPLACE INTO index_files
|
|
439
439
|
(path, categories, domain, score, size, mtime, language)
|
|
440
440
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
441
|
-
`);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 ob(r,e,t){let n=pe.join(e,"checksums.json"),s=await zn(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 ib(r,e,t){let n=pe.join(e,"file-scores.json"),s=await zn(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(`
|
|
442
442
|
INSERT OR REPLACE INTO index_files
|
|
443
443
|
(path, score, size, mtime, language, categories, domain)
|
|
444
444
|
VALUES (?, ?, ?, ?, NULL,
|
|
445
445
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
446
446
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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 ab(r,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await at.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 cb(r,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await at.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 lb(r,e,t,n){let s=l(async(i,a)=>{try{await at.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Rc)await s(pe.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(pe.join(e,i),`cleanup:index/${i}`);await s(pe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(pe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function zn(r){try{let e=await at.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Xo(r){let e=x.getGlobalProjectPath(r),t=pe.join(e,"storage"),n=0;I.getDb(r);for(let{filename:u,key:d}of Rc){let m=pe.join(t,u),p=await zn(m);if(p!==null){I.setDoc(r,d,p),_p(r,d,p);try{await at.unlink(m)}catch{}n++}}let s=pe.join(e,"project.json"),o=await zn(s);if(o!==null){I.setDoc(r,"project",o);try{await at.unlink(s)}catch{}n++}let i=pe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=pe.join(i,u);try{let p=(await at.readFile(d,"utf-8")).split(`
|
|
450
|
+
`).filter(f=>f.trim());if(p.length===0){await at.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 w of p)try{let S=JSON.parse(w);f.run(S.type??S.action??"unknown",S.taskId??S.task_id??null,w,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 w of p)try{let S=JSON.parse(w),A=`learning:${S.taskId??S.timestamp??Date.now()}`,D=S.tags;f.run(A,D?.[0]??null,w,1,S.timestamp??new Date().toISOString())}catch{}})()}await at.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...Ic.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await zn(d);if(m===null)continue;let p=Ic.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()),Np(r,p.key,m));try{await at.unlink(d)}catch{}n++}return n}var Rc,Ic,Qo=k(()=>{"use strict";he();F();se();Rc=[{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"}],Ic=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(br,"migrateJsonToSqlite");l(XS,"createBackup");l(Ac,"copyFiles");l(_p,"populateNormalized");l(QS,"populateTasksFromState");l(ZS,"populateQueueTasks");l(eb,"populateIdeas");l(tb,"populateShippedFeatures");l(nb,"populateMetricsDaily");l(sb,"populateAnalysis");l(Np,"populateIndexTables");l(rb,"populateCategoriesIndex");l(ob,"migrateChecksums");l(ib,"migrateFileScores");l(ab,"migrateEventsJsonl");l(cb,"migrateLearningsJsonl");l(lb,"cleanupJsonFiles");l(zn,"readJsonSafe");l(Xo,"sweepLegacyJson")});var Dc,Pe,Cr=k(()=>{"use strict";Dt();uo();ie();Cn();Kt();Dc=class extends Le{static{l(this,"QueueStorage")}constructor(){super("queue.json",Fd)}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:me(),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:me(),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=gn(qt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;wt.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()})}},Pe=new Dc});var jc,ut,Pr=k(()=>{"use strict";Dt();Aa();ie();Cn();Kt();jc=class extends Le{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Id)}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:me(),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=gn(qt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;wt.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}},ut=new jc});var vr,$c,Vn,Mc=k(()=>{"use strict";vr={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"}},$c=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=vr[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 vr[e]}getPrompt(e){return vr[e].prompt}getValidCommands(e){return vr[e].transitions}formatNextSteps(e){return vr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Vn=new $c});var Oc,_,xr=k(()=>{"use strict";Dt();uo();ie();Mc();Cn();Kt();Oc=class extends Le{static{l(this,"StateStorage")}constructor(){super("state.json",Md)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Vn.getCurrentState(e),s=Vn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:me()};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[];wt.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=jd.safeParse(t);if(!n.success){let f=n.error.issues.map(w=>`${w.path.join(".")}: ${w.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
451
451
|
${f.join(`
|
|
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}},
|
|
453
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,n,n,t.metadata?JSON.stringify(t.metadata):null);let s=
|
|
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?
|
|
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}},_=new Oc});var Lp=k(()=>{"use strict";vc();F()});var Fc,_c,Nc=k(()=>{"use strict";ps();Kt();Fc=class extends Le{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Nd,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}},_c=new Fc});var Lc,ct,Uc=k(()=>{"use strict";se();Lc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let n=new Date().toISOString();N.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=N.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=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 N.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),N.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 N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],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}}},ct=new Lc});function Hc(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 Gc,ve,Tr=k(()=>{"use strict";Uc();se();l(Hc,"rowToRule");Gc=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?Hc(n):null}getRulesForCommand(e,t){let n=ct.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(Hc)}getAllRules(e){return I.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Hc)}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}},ve=new Gc});var Yt=k(()=>{"use strict";Ko();Cn();se();Sr();yr();Yo();Qo();Cr();Pr();xr();Lp();Kt();Nc();Tr()});function ub(){return`\u26A1 prjct
|
|
455
455
|
|
|
456
|
-
---`}function
|
|
457
|
-
\u26A1 prjct \xB7 v${
|
|
458
|
-
`)}function
|
|
456
|
+
---`}function db(){return`---
|
|
457
|
+
\u26A1 prjct \xB7 v${Ma()}`}function H(...r){return pb(ub(),...r.filter(Boolean),db())}function Wc(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
|
|
458
|
+
`)}function Up(r,e=""){return`\`\`\`${e}
|
|
459
459
|
${r}
|
|
460
|
-
\`\`\``}function
|
|
461
|
-
${e}`}function
|
|
462
|
-
`)}function
|
|
463
|
-
> ${e.join(" | ")}`:"";return`## \u26A1 ${r.description}${t}`}function
|
|
464
|
-
${
|
|
460
|
+
\`\`\``}function le(r,e,t=3){return`### ${r}
|
|
461
|
+
${e}`}function ze(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
462
|
+
`)}function zc(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 Hp(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
|
+
${Wc(t,n)}`}function Gp(r){return r.length===0?"":`### Relevant Files
|
|
465
465
|
${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${n}\`${s}`}).join(`
|
|
466
|
-
`)}`}function
|
|
467
|
-
${
|
|
468
|
-
${
|
|
469
|
-
> ${e}`:`## \u2705 ${r}`}function
|
|
470
|
-
|
|
471
|
-
`)}function
|
|
472
|
-
Next:`));for(let o of s){let i=
|
|
473
|
-
`);
|
|
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
|
-
`)}},
|
|
466
|
+
`)}`}function Wp(r){return`### Rules
|
|
467
|
+
${ze(r)}`}function ue(r){let e=["Command","Action"],t=r.map(n=>[`\`${n.command}\``,n.label]);return`### Next
|
|
468
|
+
${Wc(e,t)}`}function St(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 Wc(t,n)}function xe(r,e){return e?`## \u2705 ${r}
|
|
469
|
+
> ${e}`:`## \u2705 ${r}`}function zp(r){return`> \u26A0\uFE0F **${r}**`}function pb(...r){return r.filter(Boolean).join(`
|
|
470
|
+
|
|
471
|
+
`)}function vt(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var xs=k(()=>{"use strict";Bt();l(ub,"mdHeader");l(db,"mdFooter");l(H,"mdOutput");l(Wc,"mdTable");l(Up,"mdCodeBlock");l(le,"mdSection");l(ze,"mdList");l(zc,"mdTaskHeader");l(Hp,"mdSubtasks");l(Gp,"mdRelevantFiles");l(Wp,"mdRules");l(ue,"mdNextSteps");l(St,"mdStats");l(xe,"mdDone");l(zp,"mdWarn");l(pb,"mdJoin");l(vt,"mdActionRequired")});import Er from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Bp[r]||"idle",n=Vn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Vp[o]||o}));console.log(Er.dim(`
|
|
472
|
+
Next:`));for(let o of s){let i=Er.cyan(o.cmd.padEnd(12));console.log(Er.dim(` ${i} \u2192 ${o.desc}`))}}function Zo(r){let e=Bp[r]||"idle";return Vn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Vp[n]||n}))}function Ar(r){let e=Vn.getStateInfo(r);console.log(Er.dim(`\u{1F4CD} State: ${Er.white(r.toUpperCase())} - ${e.description}`))}var Vp,Bp,Ts=k(()=>{"use strict";Mc();Vp={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"},Bp={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(Zo,"getNextSteps");l(Ar,"showStateInfo")});import tt from"node:path";async function mb(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 R(tt.join(r,"pnpm-lock.yaml"))?"pnpm":await R(tt.join(r,"yarn.lock"))?"yarn":await R(tt.join(r,"bun.lockb"))||await R(tt.join(r,"bun.lock"))?"bun":(await R(tt.join(r,"package-lock.json")),"npm")}function Jp(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function gb(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Es(r,e){for(let s of fb)if(await R(tt.join(r,s)))return s;let n=(e??await sn(r)).find(s=>s.endsWith(hb));if(n)return n}async function cn(r){for(let e of yb)if(await R(tt.join(r,e)))return e}async function ei(r){let e=tt.join(r,"package.json"),t=await Gt(e,null);if(t){let a=await mb(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Jp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Jp(a,"typecheck")}),c.test&&(u.test={tool:a,command:gb(a)}),u.versionFile=await Es(r),u.changelogFile=await cn(r),u}if(await R(tt.join(r,"pytest.ini"))){let a=await Es(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let n=await Qe(tt.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await Es(r),c=await cn(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"Cargo.toml"))){let a=await cn(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await R(tt.join(r,"go.mod"))){let a=await Es(r),c=await cn(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let s=await sn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Es(r,s),c=await cn(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await R(tt.join(r,"pom.xml"))){let a=await cn(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await R(tt.join(r,"gradlew"))&&(await R(tt.join(r,"build.gradle"))||await R(tt.join(r,"build.gradle.kts")))){let a=await cn(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Es(r),i=await cn(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var fb,hb,yb,Vc=k(()=>{"use strict";$e();l(mb,"detectPackageManager");l(Jp,"pmRun");l(gb,"pmTest");fb=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],hb=".csproj",yb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Es,"detectVersionFile");l(cn,"detectChangelogFile");l(ei,"detectProjectCommands")});import*as ne from"@clack/prompts";import Bn from"chalk";var ti,qp,As,Kp=k(()=>{"use strict";Hn();ti=[{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."}],qp=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],As=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(){ne.intro(Bn.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 ne.outro(Bn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=ti.findIndex(n=>n.value===this.detectedType),t=await ne.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ti.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?ti[e].value:void 0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ne.multiselect({message:"Which AI agents do you use?",options:qp.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return ne.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);ne.note(e,"Detected stack");let t=await ne.confirm({message:"Is this stack correct?",initialValue:!0});if(ne.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await ne.group({language:l(()=>ne.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ne.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 ne.group({verbosity:l(()=>ne.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(()=>ne.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=[`${Bn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Bn.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${Bn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Bn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Bn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
473
|
+
`);ne.note(e,"Configuration Summary");let t=await ne.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ne.isCancel(t)||!t?(ne.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{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),s.push("codex")}catch{try{await e.access(t.join(n.homedir(),".codex")),s.push("codex")}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,ne.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ti.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return qp.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 Bc from"node:path";var wb,kb,ni,Sb,dt,Jn=k(()=>{"use strict";he();Dt();$e();wb="outcomes",kb="outcomes.jsonl",ni=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=x.getGlobalProjectPath(e);return Bc.join(t,wb)}getOutcomesPath(e){return Bc.join(this.getOutcomesDir(e),kb)}async record(e,t){let n={...t,id:me()},s=this.getOutcomesPath(e);return await Rt(Bc.dirname(s)),await aa(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await R(t))return[];let n=await Qe(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}},Sb=new ni,dt=Sb});var si,bb,Jc,Yp=k(()=>{"use strict";Jn();si=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await dt.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 dt.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 dt.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(w=>w.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((w,S)=>w+S.qualityScore,0)/a,m=i.filter(w=>{if(!w.variance)return!1;let S=this.parseVariance(w.variance),A=this.parseDuration(w.estimatedDuration);return A===0?!1:Math.abs(S)/A<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let w of i.filter(S=>S.completedAsPlanned))for(let S of w.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((w,S)=>S[1]-w[1]).slice(0,3).map(([w])=>w);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 dt.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 dt.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}},bb=new si,Jc=bb});var Ir,ri,qc,Kc=k(()=>{"use strict";ls();ie();Ir=3,ri=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>=Ir){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}/${Ir} 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>=Ir){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}/${Ir} 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>=Ir&&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:[$.FILE_STRUCTURE,$.ARCHITECTURE],tech_stack:[$.TECH_STACK],architecture:[$.ARCHITECTURE,$.CODE_STYLE],estimation:[$.SHIP_WORKFLOW],workflow:[$.SHIP_WORKFLOW,$.CODE_STYLE],gotcha:[$.TEST_BEHAVIOR,$.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
|
+
`)}},qc=new ri});var oi,Xp,Yc=k(()=>{"use strict";Ta();Kt();ie();oi=class extends Le{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...kd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:co([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?co(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:co(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=Sd(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=bd(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:Cd(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}},Xp=new oi});var Xc=k(()=>{"use strict";Kp();Yp();Kc();Jn();Yc()});import Xt from"chalk";function Cb(r){return Qp[r.toLowerCase()]||Qp.default}var Qp,Qc,ii,Zp=k(()=>{"use strict";Qp={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(Cb,"getIcon");Qc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Xt.cyan(`
|
|
476
476
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
477
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
478
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
479
|
-
`)}function
|
|
480
|
-
`)}var
|
|
477
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=Cb(t);console.log(Xt.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Xt.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Xt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Xt.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?Xt.green("\u2713"):Xt.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Xt.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?` ${Xt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Xt.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ii=new Qc});import Ke from"chalk";function Pb(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%em.length;return em[t]}function vb(r,e,t="\u25B6"){let n=Ke.dim(String(r+1).padStart(2)),o=Pb(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=Ke.green("\u2713 Complete");break;case"in_progress":a=Ke.yellow(`${t} Working...`);break;case"pending":a=Ke.gray("\u25CB Pending");break;case"failed":a=Ke.red("\u2717 Failed");break;case"blocked":a=Ke.gray("\u2298 Blocked");break;default:a=Ke.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function xb(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ke.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ke.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(vb(t,r[t]));return e.push(""),e.join(`
|
|
479
|
+
`)}function tm(r){console.log(xb(r))}var em,nm=k(()=>{"use strict";em=[Ke.cyan,Ke.magenta,Ke.yellow,Ke.blue,Ke.green,Ke.redBright,Ke.magentaBright,Ke.cyanBright];l(Pb,"getDomainColor");l(vb,"formatSubtaskLine");l(xb,"renderSubtaskProgress");l(tm,"printSubtaskProgress")});function Tb(r){return sm.includes(r)}async function Eb(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 Ab(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 sm,Ib,ai,rm=k(()=>{"use strict";sm=["ship","feature","spec","cleanup","migrate"];l(Tb,"requiresReasoning");l(Eb,"reason");l(Ab,"formatPlan");Ib={requiresReasoning:Tb,reason:Eb,formatPlan:Ab,REASONING_REQUIRED_COMMANDS:sm},ai=Ib});import Rr from"node:fs/promises";var Zc,Rb,pt,el=k(()=>{"use strict";yt();he();F();qo();Zc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ft({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await M.getProjectId(e),s=x.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:x.getFilePath(n,"core","now.md"),next:x.getFilePath(n,"core","next.md"),context:x.getFilePath(n,"core","context.md"),shipped:x.getFilePath(n,"progress","shipped.md"),metrics:x.getFilePath(n,"progress","metrics.md"),ideas:x.getFilePath(n,"planning","ideas.md"),roadmap:x.getFilePath(n,"planning","roadmap.md"),specs:x.getFilePath(n,"planning","specs"),memory:x.getFilePath(n,"memory","context.jsonl"),patterns:x.getFilePath(n,"memory","patterns.json"),analysis:x.getFilePath(n,"analysis","repo-summary.md"),codePatterns:x.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Rr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Rr.readFile(d,"utf-8"),Rr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await Rr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Rr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},Rb=new Zc,pt=Rb});import{exec as Db}from"node:child_process";import Te from"node:fs/promises";import om from"node:os";import vn from"node:path";import{promisify as jb}from"node:util";function im(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 tl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Mb(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
481
481
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
482
482
|
`}),r.recommendations.length>0&&(e+=`
|
|
483
483
|
Recommendations:
|
|
484
484
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
485
|
-
`})),e}async function
|
|
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
|
|
485
|
+
`})),e}async function am(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Te.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=im(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 Te.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 Te.access(vn.dirname(i),Te.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 cm(r){let e=[],t=[],n={};try{let{stdout:i}=await $b("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=vn.join(r.projectPath,"package.json");try{let i=await Te.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 Te.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}.*${tl(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 Te.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 lm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Te.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 Te.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(tl(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 Te.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 um(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Te.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 Te.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 dm(r){let e=[],t=[],n={},s=vn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Te.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=vn.join(om.homedir(),".prjct-cli");try{await Te.access(o,Te.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Te.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 pm(r){let e=[],t=[],n={},s=vn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Te.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=vn.join(om.homedir(),".prjct-cli/projects",o||"");try{await Te.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 mm(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 Te.access(vn.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 Te.stat(vn.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 gm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Te.access(s),n.specsExists=!0;let i=await Te.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 hm(r,e,t){let n=fm[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 Ob(r,e,t){let n=await hm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function Fb(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var $b,fm,_b,ci,ym=k(()=>{"use strict";F();$b=jb(Db);l(im,"formatDuration");l(tl,"escapeRegex");l(Mb,"formatWarnings");l(am,"verifyDone");l(cm,"verifyShip");l(lm,"verifyFeature");l(um,"verifyNow");l(dm,"verifyInit");l(pm,"verifySync");l(mm,"verifyAnalyze");l(gm,"verifySpec");fm={done:am,ship:cm,feature:lm,now:um,init:dm,sync:pm,analyze:mm,spec:gm};l(hm,"verify");l(Ob,"prepareCommand");l(Fb,"requiresVerification");_b={verify:hm,prepareCommand:Ob,requiresVerification:Fb,verifiers:fm,formatWarnings:Mb,formatDuration:im,escapeRegex:tl,verifyDone:am,verifyShip:cm,verifyFeature:lm,verifyNow:um,verifyInit:dm,verifySync:pm,verifyAnalyze:mm,verifySpec:gm},ci=_b});function Lb(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 Ub(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of Nb)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:Lb(t)};return{detected:!1}}function Hb(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 Gb(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 Wb(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 zb(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 Nb,nl,Vb,Is,wm=k(()=>{"use strict";Nb=[{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(Lb,"getHallucinationSuggestion");l(Ub,"detectHallucination");l(Hb,"isSimilarError");l(Gb,"analyzeErrorPattern");l(Wb,"generateEscalationMessage");l(zb,"generateSuggestion");nl=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=>Hb(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=Gb(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:Wb(e,o,this.maxAttempts),suggestion:zb(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 Ub(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}}},Vb=new nl,Is=Vb});function sl(r,e){let t=Dr(e),n=Bb[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 Jb(r,e){let t=Dr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function qb(r,e,t){let n=Dr(t),s=sl(r,t),o=sl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function li(r,e=wn){let t=Dr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=Kb(r,e),s=Yb(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=Zb(o),a=Xb(o),c=Qb(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=eC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Sm(r,e,t=wn){let n=Dr(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 Kb(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=qb(i,s,e);if(!t.has(a)){let c=sl(i,e),u=Jb(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Yb(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+tC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>ol(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function Xb(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 Qb(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=ol(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function Zb(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 eC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=ol(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function ol(r){if(!r.variance)return 0;let e=rl(r.estimatedDuration),t=rl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function rl(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 bm(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 tC(r){if(!r.estimatedDuration)return 0;let e=rl(r.estimatedDuration);if(e<=0)return 0;let t=km[0],n=Number.POSITIVE_INFINITY;for(let s of km){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Dr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Bb,km,il=k(()=>{"use strict";ps();Bb={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(sl,"getSprintStart");l(Jb,"getSprintEnd");l(qb,"getSprintNumber");l(li,"calculateVelocity");l(Sm,"projectCompletion");l(Kb,"bucketBySprint");l(Yb,"buildSprintVelocities");l(Xb,"detectTrend");l(Qb,"calculateOverallAccuracy");l(Zb,"calculateAverageVelocity");l(eC,"detectEstimationPatterns");l(ol,"parseVariancePercent");l(rl,"parseDurationMinutes");l(bm,"formatVelocityContext");km=[{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(tC,"derivePoints");l(Dr,"resolveConfig")});import{exec as nC}from"node:child_process";import sC from"node:fs/promises";import ui from"node:path";import{promisify as rC}from"node:util";async function di(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=lC(r),c=await uC(e),u=await dC(e),d=[];for(let p of c){if(!i&&mC(p))continue;let g=pC(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 lC(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 uC(r){let e=[];async function t(n,s=""){try{let o=await sC.readdir(n,{withFileTypes:!0});for(let i of o){let a=ui.join(n,i.name),c=ui.join(s,i.name);if(i.isDirectory()){if(cC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=ui.extname(i.name).toLowerCase();aC.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(r),e}async function dC(r){let e=new Map;try{let{stdout:t}=await oC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
488
488
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
489
489
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
490
490
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
491
491
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
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
|
|
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 pC(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(iC))for(let w of f)if(c.includes(w)&&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=ui.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 mC(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 oC,iC,aC,cC,al=k(()=>{"use strict";F();oC=rC(nC),iC={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"]},aC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),cC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(di,"findRelevantFiles");l(lC,"extractKeywords");l(uC,"getAllCodeFiles");l(dC,"getGitRecency");l(pC,"scoreFile");l(mC,"isTestFile")});import{exec as gC}from"node:child_process";import{promisify as fC}from"node:util";async function Cm(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 wC(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await yC(r,t);return o=o.filter(c=>!kC(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 yC(r,e){let{stdout:t}=await jr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
493
493
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
494
494
|
NF {
|
|
495
495
|
count[$0]++
|
|
@@ -499,8 +499,8 @@ Recommendations:
|
|
|
499
499
|
for (f in count) print count[f], lastmod[f], f
|
|
500
500
|
}
|
|
501
501
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
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),
|
|
503
|
-
`).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),w=Math.max(0,1-g/30),S=u/i,A=w*.6+S*.4,D;f<1?D="just now":f<24?D=`${f}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(A*100)/100,lastChanged:D,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function wC(r){let{stdout:e}=await jr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await jr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await jr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
503
|
+
`).filter(Boolean),{stdout:i}=await jr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
504
504
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
505
505
|
NF {
|
|
506
506
|
count[$0]++
|
|
@@ -510,10 +510,10 @@ Recommendations:
|
|
|
510
510
|
for (f in count) print count[f], lastmod[f], f
|
|
511
511
|
}
|
|
512
512
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
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),
|
|
514
|
-
`);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),w=p[3],S=u-f,A=Math.floor(S/86400),D=Math.floor(S/3600),B=Math.max(0,1-A/14),be=g/d,je=B*.5+be*.5,Ve;D<1?Ve="just now":D<24?Ve=`${D}h ago`:Ve=`${A}d ago`,a.push({path:w,changes:g,heatScore:Math.round(je*100)/100,lastChanged:Ve,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function kC(r){let e=r.split("/").pop()||"";for(let t of hC)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var jr,hC,Pm=k(()=>{"use strict";jr=fC(gC),hC=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Cm,"getRecentFiles");l(yC,"getHotFilesFromCommits");l(wC,"getBranchOnlyFiles");l(kC,"shouldIgnore")});function cl(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function vm(r,e){let t=SC[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function CC(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Tm(r,e){let t=cl(r),n=cl(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=vm(s,bC),a=xm.map(c=>({model:c,...vm(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:CC(i.total),byModel:a}}}function ll(r){let e=cl(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:xm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var SC,bC,xm,Em=k(()=>{"use strict";SC={"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}},bC="claude-sonnet-4.5";l(cl,"countTokens");xm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(vm,"calculateModelCost");l(CC,"formatCostSaved");l(Tm,"measureCompression");l(ll,"noCompression")});import PC from"node:fs/promises";import ul from"node:path";async function Rm(r,e=process.cwd()){let t=ul.isAbsolute(r)?r:ul.join(e,r),n;try{n=await PC.readFile(t,"utf-8")}catch(u){if(P(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:ll("")};throw u}let s=ul.extname(r).toLowerCase(),o=vC[s]||"unknown",i=AC[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:ll(n)};let a=IC(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:Tm(n,c)}}function IC(r,e){let t=[],n=r.split(`
|
|
515
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(`
|
|
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:
|
|
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:RC(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function RC(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var vC,Am,xC,TC,EC,Im,AC,Dm=k(()=>{"use strict";F();Em();vC={".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"},Am=[{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}],xC=[{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}],TC=[{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}],EC=[{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}],Im=[{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}],AC={typescript:Am,javascript:Am,python:xC,go:TC,rust:EC,java:Im,csharp:Im,php:[],ruby:[],unknown:[]};l(Rm,"extractSignatures");l(IC,"extractFromContent");l(RC,"cleanSignature")});import{createHash as DC}from"node:crypto";import Mm from"node:fs/promises";import Om from"node:path";function jm(r){return DC("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function $m(r){try{let e=Om.join(r,"storage","classification-cache.json"),t=await Mm.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?Ca:(console.warn("[classifier] Failed to load cache:",y(e)),Ca)}}async function dl(r,e){try{let t=Om.join(r,"storage","classification-cache.json");await Mm.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function $C(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>jC?null:n.classification}function MC(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function OC(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Fm(e),s=xa("classification")||"",o=`Classify this software engineering task into a domain.
|
|
517
517
|
|
|
518
518
|
Task: "${r}"
|
|
519
519
|
|
|
@@ -521,19 +521,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
521
521
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
522
522
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
523
523
|
|
|
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=
|
|
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([
|
|
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
|
|
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`}},
|
|
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=
|
|
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=yn.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 _C(r,e){let t=Fm(e),n=new Map;for(let[p,g]of Object.entries(FC)){if(p==="general"||!t.includes(p))continue;let f=0;for(let w of g)r.match(new RegExp(w,"gi"))&&(f+=w.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return id;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=NC(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 Fm(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 NC(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 jC,FC,pl,LC,_m,Nm=k(()=>{"use strict";ur();ao();F();jC=3600*1e3;l(jm,"hashDescription");l($m,"loadCache");l(dl,"saveCache");l($C,"lookupCache");l(MC,"lookupPatterns");l(OC,"classifyWithLLM");FC={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(_C,"classifyWithHeuristic");l(Fm,"buildAvailableDomains");l(NC,"getFilePatterns");pl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=jm(e),i=await $m(n),a=$C(i,o,t);if(a)return{classification:a,source:"cache"};let c=MC(i,o);if(c)return{classification:c,source:"history"};let u=await OC(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await dl(n,i),{classification:u,source:"llm"};let d=_C(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await dl(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=jm(e),o=await $m(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await dl(n,o))}},LC=new pl,_m=LC});import{exec as UC}from"node:child_process";import $r from"node:fs/promises";import HC from"node:os";import qn from"node:path";import{promisify as GC}from"node:util";var Lm,Um,ml,WC,pi,gl=k(()=>{"use strict";il();yt();he();ps();Yt();al();Pm();Dm();F();Jn();Nm();Jt();Lm=GC(UC),Um=["database","backend","frontend","testing","devops"],ml=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await M.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((je,Ve)=>{if(je.status==="fulfilled")return je.value;g.push(p[Ve]),console.warn(`Context tool "${p[Ve]}" failed: ${y(je.reason)}`)}),[w,S,A]=f,D={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},B=this.shouldFragment(a,t),be=null;return B&&e==="task"&&(be=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:B,subtasks:be,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:w,sealedAnalysis:S??null,velocityContext:A??null,contextDegradation:D}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),di(e,t,{maxFiles:10,minScore:.15}),Cm(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Rm(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([Lm("git branch --show-current",{cwd:e}),Lm("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 Je.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 dt.getAll(e);if(t.length===0)return null;let n=li(t,wn);return n.sprints.length===0?null:bm(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=qn.join(e,"analysis","repo-analysis.json"),n=await $r.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=x.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await _.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await _m.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=qn.join(e,"agents");return(await $r.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=x.getGlobalProjectPath(t),s=qn.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=qn.join(s,u);try{let m=await $r.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=yo(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=qn.join(HC.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=qn.join(t,`${i}.md`),c=qn.join(t,i,"SKILL.md");try{let u=await $r.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await $r.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=Um.indexOf(a),d=Um.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await _.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},WC=new ml,pi=WC});function zC(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 fl,VC,Me,Hm=k(()=>{"use strict";Dt();ie();an();an();l(zC,"generateApprovalPrompt");fl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ic.includes(e)}isDestructive(e){return ac.includes(e)}isToolAllowedInPlanning(e){return Oo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Oo.includes(n)):t}startPlanning(e,t,n){let s={id:me(),projectId:e,command:t,params:n,status:ee.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?[ee.GATHERING,ee.ANALYZING,ee.PROPOSING,ee.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===ee.APPROVED?n.approvedAt=b():t===ee.EXECUTING?n.executionStartedAt=b():(t===ee.COMPLETED||t===ee.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=ee.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=ee.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!==ee.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=ee.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=ee.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!==ee.APPROVED?null:(t.status=ee.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ee.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!==ee.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=ee.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=ee.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 zC(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[ee.GATHERING]:"\u{1F50D}",[ee.ANALYZING]:"\u{1F9E0}",[ee.PROPOSING]:"\u{1F4DD}",[ee.PENDING_APPROVAL]:"\u23F3",[ee.APPROVED]:"\u2705",[ee.EXECUTING]:"\u26A1",[ee.COMPLETED]:"\u{1F389}",[ee.REJECTED]:"\u274C",[ee.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ee.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`}},VC=new fl,Me=VC});function BC(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return mi[t]?mi[t]:mi[e]?mi[e]:e}function gi(r){let e=new Set,t=[];for(let n of r){let s=BC(n);e.has(s)||(e.add(s),t.push(n))}return t}var mi,hl=k(()=>{"use strict";mi={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(BC,"normalizeFrameworkName");l(gi,"deduplicateTechStack")});import{z as Oe}from"zod";function Gm(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=gi(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])=>JC[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(`
|
|
529
529
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
530
|
-
`)}var
|
|
531
|
-
`,"utf-8"),
|
|
532
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
530
|
+
`)}var UF,JC,Wm=k(()=>{"use strict";hl();UF=Oe.object({projectPath:Oe.string(),language:Oe.string().optional(),framework:Oe.string().optional(),techStack:Oe.array(Oe.string()).default([]),domains:Oe.object({hasFrontend:Oe.boolean().default(!1),hasBackend:Oe.boolean().default(!1),hasDatabase:Oe.boolean().default(!1),hasTesting:Oe.boolean().default(!1),hasDocker:Oe.boolean().default(!1)}).optional(),fileCount:Oe.number().optional(),availableAgents:Oe.array(Oe.string()).default([]),analysisLanguages:Oe.array(Oe.string()).default([]),analysisFrameworks:Oe.array(Oe.string()).default([]),analysisPackageManager:Oe.string().optional()}),JC={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Gm,"buildAntiHallucinationBlock")});import{z as _t}from"zod";var qC,zm,Vm=k(()=>{"use strict";qC=_t.object({agents:_t.boolean(),patterns:_t.boolean(),checklist:_t.boolean(),modules:_t.array(_t.string())}),zm=_t.object({version:_t.string(),description:_t.string().optional(),commands:_t.record(_t.string(),qC).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function yl(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Bm(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=yl(o,KC),a=yl(o,YC),c=yl(o,XC);return s.some(d=>QC.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 KC,YC,XC,QC,Jm=k(()=>{"use strict";KC=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],YC=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],XC=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],QC=["Write","Edit","Bash"];l(yl,"countMatches");l(Bm,"classifyCommand")});import wl from"node:fs/promises";import ZC from"node:path";async function Km(){if(Mr)return Mr;let r=await wl.readFile(kl,"utf-8"),e=JSON.parse(r);return Mr=zm.parse(e),Mr}function eP(r){return Ym.get(r)}function tP(r,e){Ym.set(r,e)}function sP(r,e){let t=r,n=qm.get(t);return n&&oP(n.entry,e)?(n.count++,n.count>=nP):(qm.set(t,{entry:e,count:1}),!1)}async function rP(r,e){let t=await wl.readFile(kl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await wl.writeFile(kl,`${JSON.stringify(n,null,2)}
|
|
531
|
+
`,"utf-8"),Mr=null}function oP(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 Xm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=eP(e);if(n)return{entry:n,source:"cache"};if(t){let s=Bm(e,t);return tP(e,s),sP(e,s)&&rP(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var kl,Mr,Ym,qm,nP,Qm=k(()=>{"use strict";Vm();Bt();Jm();kl=ZC.join(ae,"core/config/command-context.config.json"),Mr=null;l(Km,"loadCommandContextConfig");Ym=new Map;l(eP,"getCachedClassification");l(tP,"cacheClassification");qm=new Map,nP=3;l(sP,"trackClassification");l(rP,"persistClassification");l(oP,"isSameEntry");l(Xm,"resolveCommandContextFull")});import iP from"node:os";import{z as Qt}from"zod";function aP(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function cP(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Zm(r){let e=r.platform??iP.platform(),t=r.runtime??aP(),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",cP(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
533
533
|
`)}
|
|
534
|
-
</env>`}var
|
|
535
|
-
... (truncated to ~${e} tokens)`}function
|
|
536
|
-
`);return
|
|
534
|
+
</env>`}var n_,eg=k(()=>{"use strict";n_=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(aP,"detectRuntime");l(cP,"normalizePlatform");l(Zm,"buildEnvironmentBlock")});function ng(r){let e=r.getAllocationFor("injection");return{...hi,totalPrompt:e}}function Kn(r,e){let t=e*sg;return r.length<=t?r:`${r.substring(0,t)}
|
|
535
|
+
... (truncated to ~${e} tokens)`}function tg(r){return Math.ceil(r.length/sg)}function rg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=lP[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 hi,sg,lP,fi,og=k(()=>{"use strict";hi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ng,"budgetsFromCoordinator");sg=4;l(Kn,"truncateToTokenBudget");l(tg,"estimateTokens");lP={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(rg,"filterSkillsByDomains");fi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...hi,...e}}addSection(e,t){let n=Kn(e,t),s=tg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Kn(n,o);return this.used+=tg(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 ig from"node:fs/promises";import Yn from"node:path";var Sl,uP,ag,cg=k(()=>{"use strict";Yt();F();$e();Bt();Xc();Wm();Qm();eg();og();hl();Jt();Sl=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 R(e)){let s=await ig.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?ng(this._coordinator):hi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ce(`global/modules/${e}`);if(t)return t;let n=Yn.join(ae,"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=kn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ce(s);if(o){let i=Yn.basename(s,".md");t[i]=o}}}else{let s=Yn.join(ae,"templates","checklists");if(await R(s)){let o=(await ig.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Yn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${y(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([_.read(e),Pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(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 Jc.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 Kn(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=Yn.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 Km();p=Xm(C,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
537
537
|
`),s.role&&d.push(`Role: ${s.role}
|
|
538
538
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
539
539
|
`),d.push(`
|
|
@@ -542,8 +542,8 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
542
542
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
543
543
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
544
544
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
545
|
-
`);let
|
|
546
|
-
${
|
|
545
|
+
`);let w=t.projectPath;if(w){let C=u?.project?.id?Yn.basename(w):Yn.basename(w),j=Zm({projectName:C,projectPath:w,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
546
|
+
${j}
|
|
547
547
|
`)}if(u){let C=u.sealedAnalysis;if(d.push(`
|
|
548
548
|
## PROJECT ANALYSIS (Sealed)
|
|
549
549
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
@@ -558,46 +558,46 @@ ${D}
|
|
|
558
558
|
`),d.push(`**Analysis Status**: ${C.status}${C.commitHash?` (commit: ${C.commitHash.slice(0,8)})`:""}
|
|
559
559
|
`),C.patterns?.length>0){d.push(`
|
|
560
560
|
### Code Patterns (Follow These)
|
|
561
|
-
`);for(let
|
|
561
|
+
`);for(let j of C.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
562
562
|
`)}if(C.antiPatterns?.length>0){d.push(`
|
|
563
563
|
### Anti-Patterns (Avoid These)
|
|
564
|
-
`);for(let
|
|
564
|
+
`);for(let j of C.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
565
565
|
`)}}d.push(`
|
|
566
566
|
`)}let S=p.patterns,A=n?.codePatterns||"";if(S&&A&&A.trim()){let C=this.extractPatternSummary(A);C&&(d.push(`## CODE PATTERNS
|
|
567
567
|
`),d.push(C),d.push(`
|
|
568
568
|
Full patterns: Read analysis/patterns.md
|
|
569
|
-
`))}let
|
|
569
|
+
`))}let D=n?.analysis||"";if(S&&D&&D.trim()){let C=D.match(/Stack[:\s]+([^\n]+)/i)||D.match(/Technology[:\s]+([^\n]+)/i),j=C?C[1].trim():"detected";d.push(`
|
|
570
570
|
## STACK
|
|
571
|
-
Stack: ${
|
|
571
|
+
Stack: ${j}
|
|
572
572
|
`),A||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
573
573
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
574
574
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
575
575
|
|
|
576
|
-
`);for(let
|
|
577
|
-
`),
|
|
578
|
-
`),
|
|
579
|
-
`),
|
|
580
|
-
`);let
|
|
581
|
-
${
|
|
576
|
+
`);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
|
|
577
|
+
`),j.effort&&d.push(`Effort: ${j.effort}
|
|
578
|
+
`),j.model&&d.push(`Model: ${j.model}
|
|
579
|
+
`),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
|
|
580
|
+
`);let Ie=Kn(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
581
|
+
${Ie}
|
|
582
582
|
\`\`\`
|
|
583
583
|
|
|
584
|
-
`)}}let C=
|
|
584
|
+
`)}}let C=rg(u.skills,u.detectedDomains);if(C.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
585
585
|
|
|
586
|
-
`);for(let
|
|
587
|
-
`);let
|
|
588
|
-
${
|
|
586
|
+
`);for(let j of C){d.push(`#### Skill: ${j.name}
|
|
587
|
+
`);let Ie=Kn(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
588
|
+
${Ie}
|
|
589
589
|
\`\`\`
|
|
590
590
|
|
|
591
|
-
`)}}}let
|
|
592
|
-
`),d.push(
|
|
591
|
+
`)}}}let B=this.getModulesForCommand(m,p);if(B.length>0)for(let C of B){let j=await this.loadModule(C);j&&(d.push(`
|
|
592
|
+
`),d.push(j))}if(c?.isPlanning&&(d.push(`
|
|
593
593
|
## PLAN MODE
|
|
594
594
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
595
595
|
`),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
|
|
596
596
|
`)),c?.requiresApproval&&d.push(`
|
|
597
597
|
## APPROVAL REQUIRED
|
|
598
598
|
Show changes, list affected files, ask for confirmation.
|
|
599
|
-
`),
|
|
600
|
-
${
|
|
599
|
+
`),w){let C=u?.sealedAnalysis,j=[...C?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ie={projectPath:w,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:gi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Qs=>Qs.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};d.push(`
|
|
600
|
+
${Gm(Ie)}
|
|
601
601
|
`)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let C=u.contextDegradation;d.push(`
|
|
602
602
|
### CONTEXT DEGRADATION NOTICE
|
|
603
603
|
|
|
@@ -613,27 +613,27 @@ ${Qp(ve)}
|
|
|
613
613
|
`),C.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
614
614
|
`),d.push(`| Score | File | Why |
|
|
615
615
|
`),d.push(`|-------|------|-----|
|
|
616
|
-
`);for(let
|
|
616
|
+
`);for(let j of C.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
|
|
617
617
|
`);d.push(`
|
|
618
618
|
`)}if(C.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
619
|
-
`);for(let
|
|
620
|
-
// ${
|
|
621
|
-
${
|
|
619
|
+
`);for(let j of C.signatures)d.push(`\`\`\`typescript
|
|
620
|
+
// ${j.path}
|
|
621
|
+
${j.content}
|
|
622
622
|
\`\`\`
|
|
623
623
|
`);d.push(`
|
|
624
|
-
`)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let
|
|
624
|
+
`)}if(C.recentFiles.length>0){d.push("**Recently Changed**: ");let j=C.recentFiles.slice(0,5).map(Ie=>`${Ie.path} (${Ie.lastChanged})`).join(", ");d.push(`${j}
|
|
625
625
|
|
|
626
|
-
`)}}let
|
|
627
|
-
## FILES: ${
|
|
626
|
+
`)}}let be=t.files||[];if(be.length>0){let C=be.slice(0,5).join(", ");d.push(`
|
|
627
|
+
## FILES: ${be.length} available. Top: ${C}
|
|
628
628
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
629
629
|
|
|
630
|
-
`)}else
|
|
631
|
-
## PROJECT: ${
|
|
630
|
+
`)}else w&&d.push(`
|
|
631
|
+
## PROJECT: ${w}
|
|
632
632
|
Read files before modifying.
|
|
633
633
|
|
|
634
|
-
`);let
|
|
634
|
+
`);let je=this.filterRelevantState(n);if(je&&(d.push(`
|
|
635
635
|
## PRJCT STATE (Project Management Data)
|
|
636
|
-
`),d.push(
|
|
636
|
+
`),d.push(je),d.push(`
|
|
637
637
|
`)),u?.velocityContext&&(d.push(`
|
|
638
638
|
### VELOCITY (Historical Estimation Data)
|
|
639
639
|
|
|
@@ -641,7 +641,7 @@ Read files before modifying.
|
|
|
641
641
|
|
|
642
642
|
`)),o&&Object.keys(o).some(C=>o[C])){d.push(`
|
|
643
643
|
## PROJECT DEFAULTS (apply automatically)
|
|
644
|
-
`);for(let[C,
|
|
644
|
+
`);for(let[C,j]of Object.entries(o))j&&d.push(`- ${C}: ${j}
|
|
645
645
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
646
646
|
## THINK FIRST (reasoning from analysis)
|
|
647
647
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
@@ -660,34 +660,34 @@ Read files before modifying.
|
|
|
660
660
|
|
|
661
661
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
662
662
|
`),d.push(`|---|--------|-------------|--------|
|
|
663
|
-
`);for(let
|
|
664
|
-
`)}let C=u.subtasks.find(
|
|
663
|
+
`);for(let j of u.subtasks){let Ie=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${Ie} |
|
|
664
|
+
`)}let C=u.subtasks.find(j=>j.status==="in_progress");if(C&&(d.push(`
|
|
665
665
|
**FOCUS ON SUBTASK #${C.order}**: ${C.description}
|
|
666
666
|
`),d.push(`Agent: ${C.agent} | Domain: ${C.domain}
|
|
667
667
|
`),C.dependsOn.length>0&&d.push(`Dependencies: ${C.dependsOn.join(", ")}
|
|
668
|
-
`),C.handoff)){let
|
|
668
|
+
`),C.handoff)){let j=C.handoff;d.push(`
|
|
669
669
|
### Previous Subtask Handoff
|
|
670
670
|
|
|
671
|
-
`),d.push(`**From:** ${
|
|
671
|
+
`),d.push(`**From:** ${j.fromSubtask}
|
|
672
672
|
|
|
673
673
|
`),d.push(`**What was done:**
|
|
674
|
-
`);for(let
|
|
675
|
-
`);if(
|
|
674
|
+
`);for(let Ie of j.whatWasDone)d.push(`- ${Ie}
|
|
675
|
+
`);if(j.filesChanged.length>0){d.push(`
|
|
676
676
|
**Files changed:**
|
|
677
|
-
`);for(let
|
|
677
|
+
`);for(let Ie of j.filesChanged)d.push(`- \`${Ie.path}\` (${Ie.action})
|
|
678
678
|
`)}d.push(`
|
|
679
679
|
**Context for this subtask:**
|
|
680
|
-
${
|
|
680
|
+
${j.outputForNextAgent}
|
|
681
681
|
`)}d.push(`
|
|
682
|
-
`)}let
|
|
683
|
-
${
|
|
684
|
-
`)}if(p.checklist){let C=await this.loadChecklistRouting(),
|
|
682
|
+
`)}let Ve=this.getSchemaTypeForCommand(m);if(Ve){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(ao(),fd)),j=C(Ve);j&&d.push(`
|
|
683
|
+
${j}
|
|
684
|
+
`)}if(p.checklist){let C=await this.loadChecklistRouting(),j=await this.loadChecklists();C&&Object.keys(j).length>0&&(d.push(`
|
|
685
685
|
## QUALITY CHECKLISTS
|
|
686
686
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
687
|
-
`),d.push(`Available: ${Object.keys(
|
|
687
|
+
`),d.push(`Available: ${Object.keys(j).join(", ")}
|
|
688
688
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
689
689
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
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
|
|
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 fi({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}
|
|
691
691
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
692
692
|
|
|
693
693
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -704,7 +704,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
704
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(`
|
|
705
705
|
Avoid:
|
|
706
706
|
${a}`)}let o=t.join(`
|
|
707
|
-
`);return
|
|
707
|
+
`);return Kn(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
708
708
|
## RULES (CRITICAL)
|
|
709
709
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
710
710
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -721,7 +721,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
721
721
|
- Prefer structured output (JSON) over free text when applicable.
|
|
722
722
|
|
|
723
723
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
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}}}},
|
|
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}}}},uP=new Sl,ag=uP});import lg from"node:fs/promises";import xt from"node:path";var dP,pP,bl,Cl,yi,Pl=k(()=>{"use strict";yt();he();F();dP=["task","done","ship","resume","bug","enrich"],pP=["init","sync","pause","next","dash","history","undo","redo"],bl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return xt.dirname(In.resolve("prjct-cli/package.json"))}async getProjectId(e){return M.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=x.getGlobalProjectPath(s),a=await(Ze(),Pt(ft)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=xt.join(u,"templates")}catch{c=xt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await x.getAgentSettingsPath(),paths:{orchestrator:xt.join(c,"agentic","orchestrator.md"),agentRouting:xt.join(c,"agentic","agent-routing.md"),taskFragmentation:xt.join(c,"agentic","task-fragmentation.md"),commandTemplate:xt.join(c,"commands",`${e}.md`),repoAnalysis:xt.join(o,"analysis","repo-analysis.json"),agentsDir:xt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:xt.join(o,"storage","state.json")}}}requiresOrchestration(e){return dP.includes(e)?!0:!pP.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await lg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=xt.join(x.getGlobalProjectPath(t),"agents");return(await lg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
725
725
|
## Agentic Execution Mode
|
|
726
726
|
|
|
727
727
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -804,13 +804,13 @@ When fragmenting tasks:
|
|
|
804
804
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
805
805
|
3. Each completed subtask generates a summary
|
|
806
806
|
4. Pass summary to next agent for context handoff
|
|
807
|
-
`,context:e,requiresOrchestration:t}}},
|
|
808
|
-
`+
|
|
809
|
-
`+
|
|
810
|
-
`+
|
|
811
|
-
`+
|
|
812
|
-
`+
|
|
813
|
-
`}},
|
|
807
|
+
`,context:e,requiresOrchestration:t}}},Cl=new bl,yi=Cl});import{exec as mP}from"node:child_process";import ug from"node:fs/promises";import{promisify as gP}from"node:util";var fP,Xn,Ye,vl=k(()=>{"use strict";Co();fP=gP(mP),Xn={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())}};Xn.register("Read",async r=>{try{return await gr.execute(async()=>await ug.readFile(r,"utf-8"),`read-${r}`)}catch(e){return bo(e)||mr(e),null}});Xn.register("Write",async(r,e)=>{try{return await gr.execute(async()=>await ug.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return bo(t)||mr(t),!1}});Xn.register("Bash",async r=>{try{return await gr.execute(async()=>await fP(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Xn.register("GetTimestamp",async()=>new Date().toISOString());Xn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Xn.register("GetDateTime",async()=>new Date().toISOString());Ye=Xn});import xl from"node:fs/promises";import hP from"node:os";import dg from"node:path";async function yP(r){try{let e=dg.dirname(wi);await R(e)||await xl.mkdir(e,{recursive:!0}),await xl.writeFile(wi,`/p:${r}`)}catch{}}async function wP(){try{await R(wi)&&await xl.unlink(wi)}catch{}}var wi,Tl,kP,ki,El=k(()=>{"use strict";F();Zp();$e();nm();rm();el();ym();wm();ms();gl();Hm();cg();Pl();Jt();vl();wi=dg.join(hP.homedir(),".prjct-cli",".running");l(yP,"signalStart");l(wP,"signalEnd");Tl=class{static{l(this,"CommandExecutor")}async signalStart(e){await yP(e)}async signalEnd(){await wP()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Is.shouldEscalate(e,s)){let o=Is.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Na.load(e),i=await pt.build(n,t),a=Me.requiresPlanning(e),c=Me.isDestructive(e),u=Me.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Me.startPlanning(i.projectId,e,t):u&&(d=Me.getActivePlan(i.projectId));let m=null;if(ci.requiresVerification(e)){let C=await pt.loadStateForCommand(i,e);m=await ci.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(ci.formatWarnings(m))}let p=null;if(ai.requiresReasoning(e)){let C=await pt.loadStateForCommand(i,e);p=await ai.reason(e,i,C),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(ai.formatPlan(p)))}let g=t.task||t.description||"",f=await yi.buildContext(e,g,n),w=yi.buildAgenticPrompt(f),S=null;if(yi.requiresOrchestration(e)&&g)try{S=await pi.execute(e,g,n),S.detectedDomains.length>0&&ii.orchestrate(S.detectedDomains);for(let C of S.agents){let j=C.domain||C.name.replace(".md","");ii.startAgent(C.name,j,`Loading ${j} specialist...`),ii.endAgent(!0)}if(S.requiresFragmentation&&S.subtasks){let C=S.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));tm(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},D=await pt.loadState(i),B=null,be=null;i.projectId&&(B={commit_footer:await Ne.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ne.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ne.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ne.getSmartDecision(i.projectId,`preferred_agent_${e}`)},be=await Ne.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let je={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Me.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},Ve=await ag.build(o,A,D,null,B,null,be,je,S);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),w.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Is.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:A,state:D,prompt:Ve,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:w.prompt,requiresOrchestration:w.requiresOrchestration,agentsPath:A.agentsPath,agentRoutingPath:A.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:B,relevantMemories:be,orchestratorContext:S,memory:{create:l(C=>Ne.createMemory(i.projectId,C),"create"),autoRemember:l((C,j,Ie)=>Ne.autoRemember(i.projectId,C,j,Ie),"autoRemember"),search:l(C=>Ne.searchMemories(i.projectId,C),"search"),findByTags:l(C=>Ne.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>Ne.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>Me.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>Me.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>Me.proposePlan(i.projectId,C),"propose"),approve:l(C=>Me.approvePlan(i.projectId,C),"approve"),reject:l(C=>Me.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>Me.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Me.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Me.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>Me.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>Me.failStep(i.projectId,C),"failStep"),abort:l(C=>Me.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>Me.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Me.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Is.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Is.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(!Ye.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ye.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Na.load(e)).frontmatter["allowed-tools"]||[],i=await pt.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)}}}},kP=new Tl,ki=kP});import Si from"node:fs/promises";import SP from"node:https";import bP from"node:os";import Al from"node:path";import Nt from"chalk";var Il,pg,mg=k(()=>{"use strict";F();$e();Il=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Al.join(bP.homedir(),".prjct-cli","config"),this.cacheFile=Al.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Al.join(__dirname,"..","..","package.json");return JSON.parse(await Si.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=SP.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 R(this.cacheFile))return JSON.parse(await Si.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await R(this.cacheDir)||await Si.mkdir(this.cacheDir,{recursive:!0}),await Si.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
|
+
`+Nt.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
|
+
`+Nt.yellow("\u2502")+" "+Nt.bold("Update available!")+" "+Nt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Nt.yellow("\u2502")+`
|
|
810
|
+
`+Nt.yellow("\u2502")+" "+Nt.yellow("\u2502")+`
|
|
811
|
+
`+Nt.yellow("\u2502")+" Run: "+Nt.cyan("npm update -g prjct-cli")+" "+Nt.yellow("\u2502")+`
|
|
812
|
+
`+Nt.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
|
+
`}},pg=Il});var we,nt=k(()=>{"use strict";El();el();vl();yt();he();mg();ln();ie();$e();Hn();we=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new pg,this.updateNotificationShown=!1,this.commandExecutor=ki}get agent(){return ws.getAgent()}get agentInfo(){return ws.getInfo()}get currentAuthor(){return xn.getCurrentAuthor()}async initializeAgent(){return ws.initialize()}async ensureProjectInit(e){return xn.ensureInit(e)}async ensureAuthor(){return xn.ensureAuthor()}async getGlobalProjectPath(e){return xn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return lt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return xn.isEmptyDirectory(e)}async _detectExistingCode(e){return xn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ro.breakdownFeature(e)}_detectBugSeverity(e){return Ro.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ws.assignForTask(e,t,n)}}});var gg={};Rn(gg,{PlanningCommands:()=>Zn});import Qn from"node:path";async function CP(){if(!Rl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ci(),fg));Rl=new r}return Rl}var Rl,Zn,bi=k(()=>{"use strict";vo();Sn();Dt();Yt();Tr();F();xs();Ts();Vc();Xc();nt();Rl=null;l(CP,"getAnalysisCommands");Zn=class extends we{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 M.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 As(t).runNonInteractive());else if(a=await new As(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await ys(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await M.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
|
|
814
814
|
|
|
815
815
|
No current task. Use \`/p:now\` to set focus.
|
|
816
816
|
`,"core/next.md":`# NEXT
|
|
@@ -830,7 +830,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
830
830
|
`,"planning/roadmap.md":`# ROADMAP
|
|
831
831
|
|
|
832
832
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
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,
|
|
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,D]of Object.entries(g))await Ye.get("Write")(Qn.join(p,A),D);let f=await this._detectEmptyDirectory(t),w=await this._detectExistingCode(t);if(w||!f){h.step(3,4,"Analyzing project...");let A=await CP();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&&!w){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=Qn.join(p,"planning","architect-session.md"),D=`# Architect Session
|
|
834
834
|
|
|
835
835
|
## Idea
|
|
836
836
|
${S}
|
|
@@ -839,8 +839,8 @@ ${S}
|
|
|
839
839
|
Initialized - awaiting stack recommendation
|
|
840
840
|
|
|
841
841
|
Generated: ${new Date().toLocaleString()}
|
|
842
|
-
`;return await
|
|
843
|
-
`);let s=await this.getGlobalProjectPath(t),o=
|
|
842
|
+
`;return await Ye.get("Write")(A,D),await Ce.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:S,wizard:a}}return await Ce.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";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let 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 M.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await pt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=me(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Pe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:W.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 M.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 pt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:W.getTimestamp()}),n.md?console.log(H(le("Bug Reported",e),St({Severity:a,Priority:m,Agent:u}),ue([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(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=Qn.join(s,"planning","architect-session.md"),i;try{i=await fe.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
844
844
|
|
|
845
845
|
Create a plan first:
|
|
846
846
|
1. Run /p:init in an empty directory
|
|
@@ -861,7 +861,7 @@ The architect plan is ready. Claude will now:
|
|
|
861
861
|
4. Create starter files with boilerplate
|
|
862
862
|
`),console.log(`
|
|
863
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.
|
|
864
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
864
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:W.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 M.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=Qn.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
865
865
|
|
|
866
866
|
## Idea
|
|
867
867
|
${e}
|
|
@@ -876,14 +876,14 @@ Initialized - awaiting architecture design
|
|
|
876
876
|
4. Generate roadmap
|
|
877
877
|
|
|
878
878
|
Generated: ${new Date().toLocaleString()}
|
|
879
|
-
`;return await
|
|
879
|
+
`;return await Ye.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(H(le("Idea Captured",e),St({Mode:"architecture"}),ue([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
880
880
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
881
|
-
`)),{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 qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(H(le("Idea Captured",e),St({Mode:"capture"}),ue([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(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 M.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=Qn.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(w=>w.endsWith(".md")&&w!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
882
882
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
883
883
|
`),{success:!0,specs:[]}):(console.log(`
|
|
884
884
|
\u{1F4CB} SPECIFICATIONS
|
|
885
|
-
`),console.log("\u2550".repeat(50)),f.forEach((
|
|
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=
|
|
885
|
+
`),console.log("\u2550".repeat(50)),f.forEach((w,S)=>{let A=w.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=Qn.join(o,"planning","specs");await fe.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Qn.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
887
887
|
|
|
888
888
|
## Overview
|
|
889
889
|
[Brief description of the feature]
|
|
@@ -913,28 +913,64 @@ Generated: ${new Date().toLocaleString()}
|
|
|
913
913
|
---
|
|
914
914
|
Created: ${new Date().toLocaleString()}
|
|
915
915
|
Status: Draft
|
|
916
|
-
`;return await
|
|
916
|
+
`;return await Ye.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:W.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
917
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
|
|
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
|
|
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 ei(t),s=0;ve.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&&ve.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&&ve.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 Pi,xn,hg=k(()=>{"use strict";rn();vo();yt();he();F();$e();Hn();Pi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await M.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(bi(),gg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await M.getProjectId(e);if(!t)throw po.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 ys();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 sn(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 sn(e)).some(s=>t.includes(s))}catch(t){return P(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await M.isConfigured(e)}async needsMigration(e){return await M.needsMigration(e)}},xn=new Pi});var PP,yg,wg,Dl,kg,Sg=k(()=>{"use strict";se();ie();PP=1800*1e3,yg=50,wg=200,Dl=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:PP}}}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>yg&&(s.current.commands=s.current.commands.slice(-yg)),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>wg&&(s.current.files=s.current.files.slice(-wg)),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:nn(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:nn(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}},kg=new Dl});import{exec as vP}from"node:child_process";import{promisify as xP}from"node:util";var jl,TP,vi,Or,bg=k(()=>{"use strict";se();F();Sg();jl=xP(vP),TP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},vi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...TP,...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 jl("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([jl(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),jl(`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(`
|
|
919
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(`
|
|
920
|
-
`)}async getSessionInfo(e){return
|
|
920
|
+
`)}async getSessionInfo(e){return kg.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
921
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(`
|
|
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}},
|
|
923
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
924
|
-
|
|
925
|
-
`)}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}},Or=l((r,e)=>new vi(r,e),"createStalenessChecker")});import Cg from"node:fs/promises";import xi from"node:path";function Fr(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 RP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...Fr(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(...Fr(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(...Fr(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(...Fr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...Fr(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&&!AP.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function Pg(r,e){let t=[],n=await Cg.readdir(r,{withFileTypes:!0});for(let s of n){if(IP.has(s.name))continue;let o=xi.join(r,s.name);if(s.isDirectory())t.push(...await Pg(o,e));else if(s.isFile()){let i=xi.extname(s.name).toLowerCase();EP.has(i)&&t.push(xi.relative(e,o))}}return t}async function DP(r){let e=await Pg(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 Cg.readFile(xi.join(r,d),"utf-8"),p=RP(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 $P(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]))};N.setDoc(r,jP,t)}async function vg(r,e){let t=await DP(r);return $P(e,t),t}var EP,AP,IP,jP,xg=k(()=>{"use strict";se();EP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),AP=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]),IP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(Fr,"splitIdentifier");l(RP,"tokenizeFile");l(Pg,"listFiles");l(DP,"buildIndex");jP="bm25-index";l($P,"saveIndex");l(vg,"indexProject")});import $l from"node:fs/promises";import un from"node:path";function NP(r){let e=[],t,n=new RegExp(_P.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function LP(r,e,t){let n;if(r.startsWith("@/"))n=un.join(t,"src",r.slice(2));else{let s=un.dirname(un.join(t,e));n=un.resolve(s,r)}for(let s of FP){let o=n+s;try{if((await $l.stat(o)).isFile())return un.relative(t,o)}catch{}}return null}async function Tg(r,e){let t=[],n=await $l.readdir(r,{withFileTypes:!0});for(let s of n){if(OP.has(s.name))continue;let o=un.join(r,s.name);if(s.isDirectory())t.push(...await Tg(o,e));else if(s.isFile()){let i=un.extname(s.name).toLowerCase();MP.has(i)&&t.push(un.relative(e,o))}}return t}async function UP(r){let e=await Tg(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 $l.readFile(un.join(r,u),"utf-8"),m=NP(d),p=[];for(let g of m){let f=await LP(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 HP(r,e){N.setDoc(r,Eg,e)}function Ag(r){return N.getDoc(r,Eg)}async function Ig(r,e){let t=await UP(r);return HP(e,t),t}var MP,OP,FP,_P,Eg,Ml=k(()=>{"use strict";se();MP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),OP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),FP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],_P=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(NP,"extractImportSources");l(LP,"resolveImport");l(Tg,"listFiles");l(UP,"buildGraph");Eg="import-graph";l(HP,"saveGraph");l(Ag,"loadGraph");l(Ig,"indexImports")});function Rg(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Ag(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 Dg(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 jg=k(()=>{"use strict";Ml();l(Rg,"propagateChanges");l(Dg,"affectedDomains")});import Ol from"node:fs/promises";import Ti from"node:path";async function $g(r,e){let t=[],n=await Ol.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(WP.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Ti.join(r,o);if(s.isDirectory())t.push(...await $g(i,e));else if(s.isFile()){let a=Ti.extname(o).toLowerCase();GP.has(a)&&t.push(Ti.relative(e,i))}}return t}function zP(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 VP(r){let e=await $g(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=Ti.join(r,a),[u,d]=await Promise.all([Ol.readFile(c,"utf-8"),Ol.stat(c)]);return{path:a,hash:zP(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 BP(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 Fl(r,e){let t=N.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)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function JP(r){let e=new Map;try{let t=N.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 _l(r,e){let[t,n]=await Promise.all([VP(r),Promise.resolve(JP(e))]);return{diff:BP(t,n),currentHashes:t}}function Mg(r){return N.hasDoc(r,"file-hashes-meta")}var GP,WP,Og=k(()=>{"use strict";se();GP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),WP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l($g,"listProjectFiles");l(zP,"hashContent");l(VP,"computeHashes");l(BP,"diffHashes");l(Fl,"saveHashes");l(JP,"loadHashes");l(_l,"detectChanges");l(Mg,"hasHashRegistry")});import{exec as qP}from"node:child_process";import{promisify as KP}from"node:util";async function QP(r,e=100){try{let{stdout:t}=await YP(`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<=_g&&n.push(s),s=new Set):i&&s&&ZP(i)&&s.add(i)}return s&&s.size>0&&s.size<=_g&&n.push(s),n}catch{return[]}}function ZP(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 ev(r,e=100){let t=await QP(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=tv(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<Fg||m<Fg)continue;let p=d+m-a,g=p>0?a/p:0;g<XP||(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 tv(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function sv(r,e){N.setDoc(r,nv,e)}async function Ng(r,e,t=100){let n=await ev(r,t);return sv(e,n),n}var YP,XP,Fg,_g,nv,Lg=k(()=>{"use strict";se();YP=KP(qP),XP=.1,Fg=2,_g=30;l(QP,"parseGitLog");l(ZP,"isSourceFile");l(ev,"buildMatrix");l(tv,"pairKey");nv="cochange-index";l(sv,"saveMatrix");l(Ng,"indexCoChanges")});import Rs from"node:fs/promises";import rv from"node:os";import Ug from"node:path";var Nl,ov,Hg,Gg=k(()=>{"use strict";F();Nl=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=rv.homedir(),this.configDir=Ug.join(this.homeDir,".prjct-cli","config"),this.configFile=Ug.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Rs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Rs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await Rs.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",y(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await Rs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await Rs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Rs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},ov=new Nl,Hg=ov});var Ul={};Rn(Ul,{installAntigravitySkill:()=>Jg,installCodexSkill:()=>Ll,needsAntigravityInstallation:()=>dv,run:()=>Bg,verifyCodexPRouterReady:()=>Ai});import{execSync as iv}from"node:child_process";import{createHash as av}from"node:crypto";import V from"node:fs/promises";import es from"node:os";import Z from"node:path";import de from"chalk";async function cv(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Cs.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),iv(`npm install -g ${e}`,{stdio:"inherit",timeout:bs("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Bg(){let r=await sr(),e=await pa(),t=ot[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let a of s){let c=ot[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await cv(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ce.detectClaude()){let p=await Ce.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ce.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ce.installDocs(),await fv(),await on.ensureReady()}}else if(a==="gemini"){await lv()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await uv();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await so()).installed&&(await Jg()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await jn()).installed){if(!(await Ll()).success)throw new Error("Codex skill installation failed");let c=await Ai({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await Hg.saveConfig(We,await Ce.getInstallPath(),e.provider),await gv();for(let a of n.providers)hv(a,ot[a.provider]);return n}async function lv(){try{let r=Z.join(es.homedir(),".gemini","commands"),e=Z.join(r,"p.toml");await V.mkdir(r,{recursive:!0});let t=ce("commands/p.toml");if(t)return await V.writeFile(e,t,"utf-8"),!0;let n=Z.join(ae,"templates","commands","p.toml");return await R(n)?(await V.copyFile(n,e),!0):!1}catch(r){return L.warn(`Gemini router warning: ${y(r)}`),!1}}async function uv(){try{let r=Z.join(es.homedir(),".gemini"),e=Z.join(r,"GEMINI.md");await V.mkdir(r,{recursive:!0});let t=ce("global/GEMINI.md");if(!t){let p=Z.join(ae,"templates","global","GEMINI.md");t=await V.readFile(p,"utf-8")}let n="",s=!1;try{n=await V.readFile(e,"utf-8"),s=!0}catch(p){if(P(p))s=!1;else throw p}if(!s)return await V.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
|
|
924
|
+
|
|
925
|
+
${t}`;return await V.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await V.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return L.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function Jg(){try{let r=Z.join(es.homedir(),".gemini","antigravity","skills"),e=Z.join(r,"prjct"),t=Z.join(e,"SKILL.md");await V.mkdir(e,{recursive:!0});let n=await R(t),s=ce("antigravity/SKILL.md");if(!s){let o=Z.join(ae,"templates","antigravity","SKILL.md");if(!await R(o))return L.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await V.readFile(o,"utf-8")}return await V.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return L.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function dv(){let r=await so();return r.installed&&!r.skillInstalled}function Kg(){return Z.join(es.homedir(),".codex","skills","prjct","SKILL.md")}function pv(r){return`<!-- ${qg}: ${JSON.stringify({version:We,templateHash:r})} -->`}function Wg(r){let e=r.match(new RegExp(`<!--\\s*${qg}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function mv(r){return av("sha256").update(r).digest("hex")}async function Yg(){let r=ce("codex/SKILL.md");if(r)return r;let e=Z.join(ae,"templates","codex","SKILL.md");return await R(e)?V.readFile(e,"utf-8"):null}function Xg(r){let e=r.trimEnd(),t=mv(e),n=pv(t);return{content:`${e}
|
|
926
|
+
|
|
927
|
+
${n}
|
|
928
|
+
`,templateHash:t}}async function Ll(){try{let r=Kg(),e=Z.dirname(r);await V.mkdir(e,{recursive:!0});let t=await R(r),n=await Yg();if(!n)return L.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=Xg(n);return t&&await V.readFile(r,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await V.writeFile(r,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return L.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ai(r={}){let e=Kg();if(!(await jn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let n=await Yg();if(!n)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=Xg(n),o=l(async()=>r.autoRepair?(await Ll()).success:!1,"maybeRepair"),i="";if(!await R(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await V.readFile(e,"utf-8").catch(()=>"");let a=Wg(i);if(!(a?.version===We&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await V.readFile(e,"utf-8").catch(()=>""),a=Wg(i),!(a?.version===We&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await fc.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=gc(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function gv(){try{let r=Z.join(es.homedir(),".prjct-cli","projects");if(!await R(r))return;let e=(await V.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=I.getDoc(n,"project");if(!s)continue;s.cliVersion!==We&&(s.cliVersion=We,I.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${We}`)}catch(r){P(r)||L.warn(`Migration warning: ${y(r)}`)}}async function zg(r,e){let t={};if(await R(r))try{t=JSON.parse(await V.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await V.writeFile(r,JSON.stringify(t,null,2))}async function fv(){try{let r=Z.join(es.homedir(),".claude"),e=Z.join(r,"settings.json"),t=Z.join(r,"prjct-statusline.sh"),n=Z.join(es.homedir(),".prjct-cli","statusline"),s=Z.join(n,"statusline.sh"),o=Z.join(n,"themes"),i=Z.join(n,"lib"),a=Z.join(n,"components"),c=Z.join(n,"config.json"),u=Z.join(ae,"assets","statusline"),d=Z.join(u,"statusline.sh"),m=Z.join(u,"themes"),p=Z.join(u,"lib"),g=Z.join(u,"components"),f=Z.join(u,"default-config.json");if(await R(r)||await V.mkdir(r,{recursive:!0}),await R(n)||await V.mkdir(n,{recursive:!0}),await R(o)||await V.mkdir(o,{recursive:!0}),await R(i)||await V.mkdir(i,{recursive:!0}),await R(a)||await V.mkdir(a,{recursive:!0}),await R(s)){let w=await V.readFile(s,"utf8");if(w.includes("CLI_VERSION=")){let S=w.match(/CLI_VERSION="([^"]*)"/);if(S&&S[1]!==We){let A=w.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${We}"`);await V.writeFile(s,A,{mode:493})}await Ei(p,i),await Ei(g,a),await Vg(t,s),await zg(e,t);return}}if(await R(d)){let w=await V.readFile(d,"utf8");if(w=w.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${We}"`),await V.writeFile(s,w,{mode:493}),await Ei(p,i),await Ei(g,a),await R(m)){let S=await V.readdir(m);for(let A of S){let D=Z.join(m,A),B=Z.join(o,A);await V.copyFile(D,B)}}!await R(c)&&await R(f)&&await V.copyFile(f,c)}else{let w=`#!/bin/bash
|
|
929
|
+
# prjct Status Line for Claude Code
|
|
930
|
+
CLI_VERSION="${We}"
|
|
931
|
+
input=$(cat)
|
|
932
|
+
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
933
|
+
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
934
|
+
if [ -f "$CONFIG" ]; then
|
|
935
|
+
PROJECT_ID=$(jq -r '.projectId // ""' "$CONFIG" 2>/dev/null)
|
|
936
|
+
if [ -n "$PROJECT_ID" ]; then
|
|
937
|
+
PROJECT_JSON="$HOME/.prjct-cli/projects/$PROJECT_ID/project.json"
|
|
938
|
+
if [ -f "$PROJECT_JSON" ]; then
|
|
939
|
+
PROJECT_VERSION=$(jq -r '.cliVersion // ""' "$PROJECT_JSON" 2>/dev/null)
|
|
940
|
+
if [ -z "$PROJECT_VERSION" ] || [ "$PROJECT_VERSION" != "$CLI_VERSION" ]; then
|
|
941
|
+
echo "prjct v$CLI_VERSION - run p. sync"
|
|
942
|
+
exit 0
|
|
943
|
+
fi
|
|
944
|
+
else
|
|
945
|
+
echo "prjct v$CLI_VERSION - run p. sync"
|
|
946
|
+
exit 0
|
|
947
|
+
fi
|
|
948
|
+
STATE="$HOME/.prjct-cli/projects/$PROJECT_ID/storage/state.json"
|
|
949
|
+
if [ -f "$STATE" ]; then
|
|
950
|
+
TASK=$(jq -r '.currentTask.description // ""' "$STATE" 2>/dev/null)
|
|
951
|
+
if [ -n "$TASK" ]; then
|
|
952
|
+
echo "$TASK"
|
|
953
|
+
exit 0
|
|
954
|
+
fi
|
|
955
|
+
fi
|
|
956
|
+
fi
|
|
957
|
+
fi
|
|
958
|
+
echo "prjct"
|
|
959
|
+
`;await V.writeFile(s,w,{mode:493})}await Vg(t,s),await zg(e,t)}catch(r){P(r)||L.warn(`Status line warning: ${y(r)}`)}}async function Ei(r,e){if(!await R(r))return;let t=await V.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=Z.join(r,n),o=Z.join(e,n);await V.copyFile(s,o),await V.chmod(o,493)}}async function Vg(r,e){try{if(await R(r)){if((await V.lstat(r)).isSymbolicLink()&&await V.readlink(r)===e)return;await V.unlink(r)}await V.symlink(e,r)}catch{try{await R(e)&&(await V.copyFile(e,r),await V.chmod(r,493))}catch(n){P(n)||L.warn(`Symlink fallback warning: ${n.message}`)}}}function hv(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${de.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var qg,yv,Ii=k(()=>{"use strict";Jt();Ss();Uo();hc();se();F();an();$e();Gn();Bt();Ze();Sn();Gg();l(cv,"installAICLI");l(Bg,"run");l(lv,"installGeminiRouter");l(uv,"installGeminiGlobalConfig");l(Jg,"installAntigravitySkill");l(dv,"needsAntigravityInstallation");qg="prjct-codex-router";l(Kg,"getCodexSkillPath");l(pv,"getCodexSkillMetadata");l(Wg,"parseCodexSkillMetadata");l(mv,"hashContent");l(Yg,"loadCodexSkillTemplate");l(Xg,"buildCodexSkillContent");l(Ll,"installCodexSkill");l(Ai,"verifyCodexPRouterReady");l(gv,"migrateProjectsCliVersion");l(zg,"ensureStatusLineSettings");l(fv,"installStatusLine");l(Ei,"installStatusLineModules");l(Vg,"ensureStatusLineSymlink");l(hv,"showResults");yv=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");yv&&Bg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});function Tt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function ts(){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 Hl=k(()=>{"use strict";l(Tt,"cite");l(ts,"defaultSources")});function _r(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
|
|
960
|
+
`)}function Nr(r,e){return(e?r.slice(0,e):r).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
|
|
961
|
+
`)}function Qg(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?`
|
|
926
962
|
### Project Structure
|
|
927
963
|
|
|
928
964
|
${e.join(`
|
|
929
965
|
`)}
|
|
930
|
-
`:""}function
|
|
966
|
+
`:""}function wv(r){let e=[];return r.patterns?.length>0&&e.push(`
|
|
931
967
|
### Code Patterns (Follow These)
|
|
932
968
|
|
|
933
|
-
${
|
|
969
|
+
${_r(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
|
|
934
970
|
### Anti-Patterns (Avoid These)
|
|
935
971
|
|
|
936
|
-
${
|
|
937
|
-
`)}function
|
|
972
|
+
${Nr(r.antiPatterns)}`),e.push(Qg(r)),e.join(`
|
|
973
|
+
`)}function kv(r,e){let t=r.sources||ts();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
|
|
938
974
|
# ${r.name} - Project Rules
|
|
939
975
|
<!-- projectId: ${r.projectId} -->
|
|
940
976
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
@@ -942,13 +978,13 @@ ${Cr(r.antiPatterns)}`),e.push(Ym(r)),e.join(`
|
|
|
942
978
|
|
|
943
979
|
## THIS PROJECT (${r.ecosystem})
|
|
944
980
|
|
|
945
|
-
${
|
|
981
|
+
${Tt(t.ecosystem)}
|
|
946
982
|
**Type:** ${r.projectType}
|
|
947
983
|
**Path:** ${r.repoPath}
|
|
948
984
|
|
|
949
985
|
### Commands (USE THESE, NOT OTHERS)
|
|
950
986
|
|
|
951
|
-
${
|
|
987
|
+
${Tt(t.commands)}
|
|
952
988
|
| Action | Command |
|
|
953
989
|
|--------|---------|
|
|
954
990
|
| Install dependencies | \`${r.commands.install}\` |
|
|
@@ -960,11 +996,11 @@ ${St(t.commands)}
|
|
|
960
996
|
|
|
961
997
|
### Code Conventions
|
|
962
998
|
|
|
963
|
-
${
|
|
999
|
+
${Tt(t.languages)}
|
|
964
1000
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
965
|
-
${
|
|
1001
|
+
${Tt(t.frameworks)}
|
|
966
1002
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
967
|
-
${r.analysis?
|
|
1003
|
+
${r.analysis?wv(r.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
|
|
968
1004
|
---
|
|
969
1005
|
|
|
970
1006
|
## PRJCT RULES
|
|
@@ -990,7 +1026,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
990
1026
|
|
|
991
1027
|
## PROJECT STATE
|
|
992
1028
|
|
|
993
|
-
${
|
|
1029
|
+
${Tt(t.name)}
|
|
994
1030
|
| Field | Value |
|
|
995
1031
|
|-------|-------|
|
|
996
1032
|
| Name | ${r.name} |
|
|
@@ -1027,14 +1063,16 @@ ${r.learnings.shippedFeatures.length>0?r.learnings.shippedFeatures.map(n=>`- **$
|
|
|
1027
1063
|
`):"_(No shipped features yet)_"}
|
|
1028
1064
|
`:"> Run `p. sync` to populate learnings from task history"}
|
|
1029
1065
|
<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
|
|
1030
|
-
`}function
|
|
1031
|
-
`)}function
|
|
1032
|
-
`)}function
|
|
1033
|
-
`)}function
|
|
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
|
|
1035
|
-
`)}function
|
|
1036
|
-
|
|
1037
|
-
|
|
1066
|
+
`}function Sv(r,e){let t=r.sources||ts(),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(Tt(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(Tt(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(_r(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Nr(r.analysis.antiPatterns)),n.push(""));let s=Qg(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
1067
|
+
`)}function bv(r,e){let t=r.sources||ts(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(Tt(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(_r(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(Nr(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(Tt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
1068
|
+
`)}function Cv(r,e){let t=r.sources||ts(),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(Tt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(Tt(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(_r(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(Nr(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
1069
|
+
`)}function Pv(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(`
|
|
1070
|
+
`),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 vv(r,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${r.name} \u2014 Project Context`),t.push(`<!-- projectId: ${r.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),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(_r(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(Nr(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.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
|
|
1071
|
+
`)}function Zg(r){return{claude:kv,cursor:Sv,copilot:bv,windsurf:Cv,continue:Pv,codex:vv}[r]||null}var Gl=k(()=>{"use strict";Hl();l(_r,"formatPatterns");l(Nr,"formatAntiPatterns");l(Qg,"formatStructure");l(wv,"formatAnalysisForClaude");l(kv,"formatForClaude");l(Sv,"formatForCursor");l(bv,"formatForCopilot");l(Cv,"formatForWindsurf");l(Pv,"formatForContinue");l(vv,"formatForCodex");l(Zg,"getFormatter")});import{exec as xv}from"node:child_process";import ef from"node:os";import Zt from"node:path";import{promisify as Tv}from"node:util";function tf(r){return Di[r]||null}function nf(r){let e=ef.homedir();switch(r){case"claude":return Zt.join(e,".claude","CLAUDE.md");case"gemini":return Zt.join(e,".gemini","GEMINI.md");case"codex":return Zt.join(e,".codex","CODEX.md");case"aider":return Zt.join(e,".aider","AIDER.md");default:return""}}async function Ri(r){try{return await Ev(`which ${r}`),!0}catch{return!1}}async function ji(r=process.cwd()){let e=[];return await Ri("claude")&&e.push("claude"),(await Ri("cursor")||await R(Zt.join(r,".cursor")))&&e.push("cursor"),await R(Zt.join(r,".github"))&&e.push("copilot"),(await Ri("windsurf")||await R(Zt.join(r,".windsurf")))&&e.push("windsurf"),(await R(Zt.join(r,".continue"))||await R(Zt.join(ef.homedir(),".continue")))&&e.push("continue"),(await Ri("codex")||await R(Zt.join(r,".agents")))&&e.push("codex"),e}async function sf(r,e=process.cwd()){if(r==="auto"){let t=await ji(e);return t.length>0?t:["claude"]}return r==="all"?Av:r.filter(t=>Di[t])}var Ev,Di,Ds,Av,Wl=k(()=>{"use strict";$e();Ev=Tv(xv),Di={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"}},Ds=["claude"],Av=Object.keys(Di);l(tf,"getAIToolConfig");l(nf,"getGlobalConfigPath");l(Ri,"commandExists");l(ji,"detectInstalledTools");l(sf,"resolveToolIds")});import Lr from"node:fs/promises";import Iv from"node:path";function of(r){let e=r.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function Rv(r){let e=[],t="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",n="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->",s=0;for(;;){let o=r.indexOf(t,s);if(o===-1)break;let i=r.indexOf(n,o);if(i===-1){console.warn("\u26A0\uFE0F Found project section without end marker, skipping...");break}let a=r.substring(o,i+n.length),c=of(a);c&&e.push({projectId:c,startIndex:o,endIndex:i+n.length,content:a}),s=i+n.length}return e}function Dv(r){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n=r.indexOf(e),s=r.indexOf(t);return n!==-1&&s!==-1&&s>n?r.substring(n,s+t.length):null}async function af(r,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let n=of(t);if(n!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${n||"none"}`);await Lr.mkdir(Iv.dirname(r),{recursive:!0});let s="";try{s=await Lr.readFile(r,"utf-8")}catch(d){if(d.code!=="ENOENT")throw d}if(!s.trim()){await rf(r,t);return}let o=Dv(s),i=Rv(s),a=i.findIndex(d=>d.projectId===e),c;a!==-1?(c=[...i],c[a]={projectId:e,startIndex:0,endIndex:0,content:t}):c=[...i,{projectId:e,startIndex:0,endIndex:0,content:t}];let u="";o&&(u+=o+`
|
|
1072
|
+
|
|
1073
|
+
`);for(let d of c)u+=d.content,d!==c[c.length-1]&&(u+=`
|
|
1074
|
+
|
|
1075
|
+
`);await rf(r,u)}async function rf(r,e){let t=`${r}.tmp.${Date.now()}`;try{await Lr.writeFile(t,e,"utf-8"),await Lr.rename(t,r)}catch(n){try{await Lr.unlink(t)}catch{}throw n}}var cf=k(()=>{"use strict";l(of,"extractProjectId");l(Rv,"findProjectSections");l(Dv,"extractGlobalSection");l(af,"updateProjectSection");l(rf,"writeFileAtomic")});import zl from"node:fs/promises";import Vl from"node:path";async function lf(r,e,t,n=Ds){let s=[];for(let o of n){let i=tf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await jv(r,i,e,t);s.push(a)}return s}async function jv(r,e,t,n){let s=Zg(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=Vl.join(n,e.outputFile);else{let a=nf(e.id);a?i=a:i=Vl.join(t,"context",e.outputFile)}if(await zl.mkdir(Vl.dirname(i),{recursive:!0}),e.outputPath==="global")await af(i,r.projectId,o);else{try{let a=await zl.readFile(i,"utf-8"),c=Wa(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Ga(o,a)}catch{}await zl.writeFile(i,o,"utf-8")}return{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 uf=k(()=>{"use strict";F();za();Gl();Wl();cf();l(lf,"generateAIToolContexts");l(jv,"generateForTool")});var df=k(()=>{"use strict";Gl();uf();Wl()});async function pf(r){try{let e=I.getDb(r),t=e.prepare(`
|
|
1038
1076
|
SELECT description, completed_at, branch
|
|
1039
1077
|
FROM tasks
|
|
1040
1078
|
WHERE status = 'done' OR status = 'shipped'
|
|
@@ -1052,8 +1090,8 @@ ${r}`;let i=e.substring(0,e.indexOf(n)),a=e.substring(e.indexOf(s)+s.length),c=r
|
|
|
1052
1090
|
FROM shipped_features
|
|
1053
1091
|
ORDER BY shipped_at DESC
|
|
1054
1092
|
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
|
|
1056
|
-
`)}},
|
|
1093
|
+
`).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 mf=k(()=>{"use strict";se();l(pf,"extractLearningsFromDB")});import Ur from"node:fs/promises";import Hr from"node:path";var Bl,gf,Jl,ff,hf=k(()=>{"use strict";F();Bl=".prjct/.prjct-state.md",gf=".prjct-state.md",Jl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Hr.join(e,Bl);await Ur.mkdir(Hr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await Ur.writeFile(n,s,"utf-8");try{let o=Hr.join(e,gf);await Ur.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[Bl,gf])try{await Ur.unlink(Hr.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=Hr.join(e,Bl);try{return await Ur.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(`
|
|
1094
|
+
`)}},ff=new Jl});import ql from"node:fs/promises";import $v from"node:os";import yf from"node:path";function Kl(){return yf.join($v.homedir(),".prjct-cli","skills",Mv)}function Ov(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Gr(){try{let r=await ql.readFile(Kl(),"utf-8");return JSON.parse(r)}catch{return Ov()}}async function Yl(r){let e=Kl();await ql.mkdir(yf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await ql.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Fv(r){let e=await Gr();e.skills[r.name]=r,await Yl(e)}async function _v(r){let e=await Gr();return r in e.skills?(delete e.skills[r],await Yl(e),!0):!1}async function Nv(r){return(await Gr()).skills[r]||null}async function Lv(){return(await Gr()).skills}function Uv(){return Kl()}var Mv,Wr,wf=k(()=>{"use strict";Mv=".skill-lock.json";l(Kl,"getLockFilePath");l(Ov,"createEmptyLockFile");l(Gr,"read");l(Yl,"write");l(Fv,"addEntry");l(_v,"removeEntry");l(Nv,"getEntry");l(Lv,"getAll");l(Uv,"getPath");Wr={read:Gr,write:Yl,addEntry:Fv,removeEntry:_v,getEntry:Nv,getAll:Lv,getPath:Uv}});import{exec as Hv}from"node:child_process";import dn from"node:fs/promises";import Ql from"node:os";import st from"node:path";import{promisify as Gv}from"node:util";import{glob as kf}from"glob";function bf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?st.join(Ql.homedir(),r.slice(1)):st.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 Cf(r){let e=[];try{let s=st.join(r,"SKILL.md");await dn.access(s);let o=st.basename(r);e.push({name:o,filePath:s})}catch{}let t=await kf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=st.basename(st.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await kf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=st.basename(st.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function Wv(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()}
|
|
1057
1095
|
${s.join(`
|
|
1058
1096
|
`)}`;return r.replace(o,`---
|
|
1059
1097
|
${c}
|
|
@@ -1062,10 +1100,10 @@ ${s.join(`
|
|
|
1062
1100
|
`)}
|
|
1063
1101
|
---
|
|
1064
1102
|
|
|
1065
|
-
${r}`}function
|
|
1103
|
+
${r}`}function Zl(){return st.join(Ql.homedir(),".claude","skills")}async function Xl(r,e,t,n){let s=Zl(),o=st.join(s,e),i=st.join(o,"SKILL.md"),a=await dn.readFile(r,"utf-8"),c=Wv(a,t,n);return await dn.mkdir(o,{recursive:!0}),await dn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function zv(r){let e={installed:[],skipped:[],errors:[]};if(!Cs.isAvailable("git")){let n=Cs.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=st.join(Ql.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await Sf(`git clone --depth 1 ${n} ${t}`,{timeout:bs("GIT_CLONE")});let s;try{let{stdout:a}=await Sf("git rev-parse HEAD",{cwd:t,timeout:bs("TOOL_CHECK")});s=a.trim()}catch{}let o=await Cf(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 Xl(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 Wr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await dn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function Vv(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await dn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await dn.stat(t)).isFile()){let s=st.basename(st.dirname(t));try{let o=await Xl(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Wr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await Cf(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 Xl(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Wr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function Bv(r){let e=Zl(),t=st.join(e,r);try{await dn.rm(t,{recursive:!0,force:!0})}catch{}let n=st.join(e,`${r}.md`);try{await dn.rm(n,{force:!0})}catch{}return Wr.removeEntry(r)}async function Jv(r){let e=bf(r);switch(e.type){case"github":return zv(e);case"local":return Vv(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Sf,Pf,vf=k(()=>{"use strict";F();an();Uo();wf();Sf=Gv(Hv);l(bf,"parseSource");l(Cf,"discoverSkills");l(Wv,"injectSourceMetadata");l(Zl,"getInstallDir");l(Xl,"installSkillFile");l(zv,"installFromGitHub");l(Vv,"installFromLocal");l(Bv,"remove");l(Jv,"install");Pf={install:Jv,remove:Bv,parseSource:bf,getInstallDir:Zl}});import Et from"node:fs/promises";import qv from"node:os";import Ct from"node:path";async function xf(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Et.readdir(o);for(let u of c)u.endsWith(".md")&&await Et.unlink(Ct.join(o,u))}catch(c){L.debug("Failed to purge old agents",{path:o,error:X(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>Kv(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=>Yv(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 Tf(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Et.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 Ef(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=ce(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Et.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 Kv(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Et.readFile(n,"utf-8"),t=await Ef(t)}catch(n){L.debug("Workflow agent template not found, generating minimal",{name:r,error:X(n)}),t=Qv(r)}await Et.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function Yv(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Et.readFile(i,"utf-8"),o=await Ef(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){L.debug("Domain agent template not found, generating minimal",{name:r,error:X(i)}),o=Zv(r,t,n)}o=Xv(o,r,s),await Et.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function Xv(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=[`
|
|
1066
1104
|
## Recent Learnings (from completed tasks)
|
|
1067
1105
|
`];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(`
|
|
1068
|
-
`)}function
|
|
1106
|
+
`)}function Qv(r){return`---
|
|
1069
1107
|
name: ${r}
|
|
1070
1108
|
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"}
|
|
1071
1109
|
tools: Read, Write, Glob
|
|
@@ -1081,7 +1119,7 @@ When invoked:
|
|
|
1081
1119
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
1082
1120
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
1083
1121
|
3. Execute requested operation
|
|
1084
|
-
`}function
|
|
1122
|
+
`}function Zv(r,e,t){return`---
|
|
1085
1123
|
name: ${r}
|
|
1086
1124
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
1087
1125
|
tools: Read, Write, Glob, Grep
|
|
@@ -1101,20 +1139,20 @@ Domain specialist for ${r} tasks.
|
|
|
1101
1139
|
## Your Role
|
|
1102
1140
|
|
|
1103
1141
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1104
|
-
`}function
|
|
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
|
|
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(
|
|
1108
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1109
|
-
`);break}}async writeJsonVersion(e,t){let n=await
|
|
1142
|
+
`}function Af(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 Et.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{L.debug("Failed to write skills.json",{error:X(o)})}),n}async function If(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Et.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(qv.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Et.access(m),g=!0}catch{try{await Et.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),w;f.length===3?w=`${f[0]}/${f[1]}@${f[2]}`:w=c;let S=await Pf.install(w);S.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),L.info(`Installed skill: ${d} for agent: ${u}`)):S.errors.length>0?(e.push({name:d,agent:u,status:"error"}),L.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"}),L.debug(`Skill install error for ${d}`,{error:X(f)})}}}catch(t){L.debug("Skill auto-installation failed (non-critical)",{error:X(t)})}return e}var Rf=k(()=>{"use strict";Jt();rn();ie();Gn();vf();l(xf,"generateAgents");l(Tf,"loadExistingAgents");l(Ef,"resolveTemplateIncludes");l(Kv,"generateWorkflowAgent");l(Yv,"generateDomainAgent");l(Xv,"injectFeedbackSection");l(Qv,"generateMinimalWorkflowAgent");l(Zv,"generateMinimalDomainAgent");l(Af,"configureSkills");l(If,"autoInstallSkills")});import Df from"node:fs/promises";import jf from"node:path";var $i,$f=k(()=>{"use strict";$i=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=jf.join(this.projectPath,"package.json"),t=await Df.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Df.access(jf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as ex}from"node:child_process";import Mf from"node:fs/promises";import eu from"node:path";import{promisify as tx}from"node:util";async function Of(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ns("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await ns("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await ns("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await ns("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
1143
|
+
`).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 ns('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
1144
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ns('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){L.debug("Git analysis failed (not a git repo?)",{error:X(t)})}return e}async function en(r,e){try{return await Mf.access(eu.join(r,e)),!0}catch(t){return L.debug("File not found",{filename:e,error:X(t)}),!1}}async function Ff(r){let e={fileCount:0,version:"0.0.0",name:eu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ns('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){L.debug("File count failed",{path:r,error:X(t)}),e.fileCount=0}try{let t=eu.join(r,"package.json"),n=JSON.parse(await Mf.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 en(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){L.debug("No package.json found",{path:r,error:X(t)})}return await en(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await en(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await en(r,"requirements.txt")||await en(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 _f(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 en(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 en(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 en(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 en(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 en(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 Nf(r,e){let t=ts(),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 Lf(r){return new $i(r).detect()}var ns,Uf=k(()=>{"use strict";rn();Hl();Gn();$f();ns=tx(ex);l(Of,"analyzeGit");l(en,"fileExists");l(Ff,"gatherStats");l(_f,"detectCommands");l(Nf,"buildSources");l(Lf,"detectStack")});import{exec as nx}from"node:child_process";import tu from"node:fs/promises";import Mi from"node:path";import{promisify as sx}from"node:util";var rx,nu,su,Hf,Gf=k(()=>{"use strict";Yt();F();rx=sx(nx),nu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Mi.join(r,s);try{await tu.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=Mi.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=Mi.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 tu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await tu.readFile(Mi.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}}},su=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[nu.contextFilesExist(t),nu.jsonFilesValid(t),nu.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(w=>w.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 rx(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}}}},Hf=new su});import Oi from"node:fs/promises";import Fi from"node:path";var _i,ss,ru=k(()=>{"use strict";ms();xg();jg();Og();Lg();Ml();rn();Ze();Sn();yt();he();Ii();Ko();Cn();se();Sr();Yo();Qo();Cr();Pr();xr();df();mf();ie();Gn();Kc();Yc();Ss();hf();pc();kc();Rf();Uf();Gf();_i=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 i=await ji(e),a=i.filter(u=>Ds.includes(u)||u==="codex"),c=i.filter(u=>!Ds.includes(u)&&u!=="codex");s=[...a.length>0?a:Ds,...c],s=Array.from(new Set(s))}else t.aiTools[0]==="auto"?(s=await ji(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await sf("all",e):s=t.aiTools;let o={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await M.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if((await jn()).installed){let O=await Ai();if(!O.verified)return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:!1,verified:!1},error:`Codex p. router is required but not ready: ${O.message||"verification failed"}. Run 'prjct start' or 'prjct setup' to repair.`}}try{o=await on.ensureReady()}catch(O){return{success:!1,projectId:this.projectId,cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:X(O)},error:`Context7 MCP is required but not ready: ${X(O)}. Run 'prjct start' to repair.`}}this.globalPath=x.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await br(this.projectId);try{let O=await Xo(this.projectId);O>0&&L.info("Swept legacy JSON files into SQLite",{swept:O})}catch(O){L.debug("Legacy JSON sweep failed (non-critical)",{error:X(O)})}let[c,u,d,m]=await Promise.all([Of(this.projectPath),Ff(this.projectPath),_f(this.projectPath),Lf(this.projectPath)]),p=t.full===!0,g,f=!0,w=!0,S=new Set;if(!p&&Mg(this.projectId))try{let{diff:O,currentHashes:_h}=await _l(this.projectPath,this.projectId),Iu=O.added.length+O.modified.length+O.deleted.length;if(Iu===0&&!t.changedFiles?.length)f=!1,w=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:O.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let sa=Rg(O,this.projectId);S=Dg(sa.allAffected);let Nh=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=sa.allAffected.some(An=>{let Lh=An.substring(An.lastIndexOf("."));return Nh.has(Lh)}),w=sa.directlyChanged.some(An=>An==="package.json"||An==="tsconfig.json"||An.includes("Dockerfile")||An.includes("docker-compose")),g={isIncremental:!0,filesChanged:Iu,filesUnchanged:O.unchanged.length,indexesRebuilt:f,agentsRegenerated:w,affectedDomains:Array.from(S)}}Fl(this.projectId,_h)}catch(O){L.debug("Incremental detection failed, falling back to full sync",{error:X(O)})}else try{let{currentHashes:O}=await _l(this.projectPath,this.projectId);Fl(this.projectId,O)}catch(O){L.debug("Hash computation failed (non-critical)",{error:X(O)})}if(f)try{await Promise.all([vg(this.projectPath,this.projectId),Ig(this.projectPath,this.projectId),Ng(this.projectPath,this.projectId)])}catch(O){L.debug("File ranking index build failed (non-critical)",{error:X(O)})}let A;if(w)try{let O=await _.getAggregatedFeedback(this.projectId);(O.patternsDiscovered.length>0||O.knownGotchas.length>0||O.agentAccuracy.length>0)&&(A=O)}catch{}let D=w?await xf(this.globalPath,m,u,A):await Tf(this.globalPath),B=Af(D,this.projectId,this.globalPath),be=w?await If(D):[],je=Nf(u,d),Ve=[],C;try{let O=await Je.getActive(this.projectId);(O?.patterns?.length||O?.antiPatterns?.length)&&(C={patterns:O.patterns??[],antiPatterns:O.antiPatterns??[],packageManager:O.packageManager,sourceDir:O.sourceDir,testDir:O.testDir})}catch{}let j;try{j=await pf(this.projectId)}catch{}let Ie={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:D.filter(O=>O.type==="workflow").map(O=>O.name),domain:D.filter(O=>O.type==="domain").map(O=>O.name)},sources:je,analysis:C,learnings:j},Qs=await lf(Ie,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let Zs=await Je.getActive(this.projectId),Ht={patterns:Zs?.patterns?.length||0,antiPatterns:Zs?.antiPatterns?.length||0,criticalAntiPatterns:Zs?.antiPatterns?.filter(O=>O.severity==="high").length||0},Oh=Date.now()-n,Fh=await this.recordSyncMetrics(u,Ve,D,Oh);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ce.installGlobalConfig(),await Ce.syncCommands();let Au;try{let O=await M.readConfig(this.projectPath);Au=await Hf.verify(this.projectPath,this.globalPath,O?.verification)}catch(O){L.debug("Verification failed (non-critical)",{error:X(O)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:D,skills:B,skillsInstalled:be,contextFiles:Ve,aiTools:Qs.map(O=>({toolId:O.toolId,outputFile:O.outputFile,success:O.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Ht,syncMetrics:Fh,verification:Au,incremental:g}}catch(i){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:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:X(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Oi.mkdir(Fi.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 _.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 ff.generate(this.projectPath,s)}catch(o){L.debug("Local state generation failed (optional)",{error:X(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=Fi.join(this.globalPath,m),g=await Oi.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Context file not found for metrics",{file:m,error:X(p)})}for(let m of n)try{let p=Fi.join(this.globalPath,"agents",`${m.name}.md`),g=await Oi.readFile(p,"utf-8");i+=g.length}catch(p){L.debug("Agent file not found for metrics",{agent:m.name,error:X(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Wn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){L.debug("Failed to record sync metrics",{error:X(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,s){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Ap.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:s});i=u.patterns,a=u.antiPatterns,await Je.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){L.debug("Failed to save draft analysis (non-critical)",{error:X(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([ut.archiveOldShipped(this.projectId).catch(()=>0),qe.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),lt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){L.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=wt.getStats(this.projectId);L.debug("Archive stats",a)}}catch(e){L.debug("Archival failed (non-critical)",{error:X(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Mn,n=await qc.learnFromTaskHistory(this.projectId,e,t);try{let s=await Xp.getFeatureOutcomes(this.projectId);s.length>0&&await qc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&L.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){L.debug("Auto-learning failed (non-critical)",{error:X(e)})}}async getCliVersion(){try{let e=Fi.join(__dirname,"..","..","package.json");return JSON.parse(await Oi.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return L.debug("Failed to read CLI version",{error:X(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:[]}}},ss=new _i});import{exec as ox}from"node:child_process";import js from"node:path";import{promisify as ix}from"node:util";function zf(r){return/^\d+\.\d+\.\d+/.test(r)}function $s(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,n,s]=e;return`${t}.${n}.${Number(s)+1}`}function ax(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function cx(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 lx(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Wf,zr,Vf=k(()=>{"use strict";$e();Wf=ix(ox),zr=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=js.join(this.projectPath,"package.json"),t=await Gt(e,null);return t?.version?{current:t.version,next:$s(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=js.join(this.projectPath,"Cargo.toml"),t=await Qe(e,"");if(!t)return null;let n=ax(t);return n?{current:n,next:$s(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=js.join(this.projectPath,"pyproject.toml"),t=await Qe(e,"");if(!t)return null;let n=cx(t);return n?{current:n,next:$s(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await sn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=js.join(this.projectPath,e[0]),n=await Qe(t,"");if(!n)return null;let s=lx(n);return s?{current:s,next:$s(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=js.join(this.projectPath,e),n=await Qe(t,"");if(!n)return null;let s=n.trim();return zf(s)?{current:s,next:$s(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Wf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1145
|
+
`);for(let n of t){let s=n.trim().replace(/^v/,"");if(zf(s))return{current:s,next:$s(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=js.join(this.projectPath,"VERSION");return await Wt(e,`0.1.0
|
|
1146
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Wf(`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 Wt(e.file,`${e.next}
|
|
1147
|
+
`);break}}async writeJsonVersion(e,t){let n=await Gt(e,{});n&&(n.version=t,await Dn(e,n))}async writeTomlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Wt(e,s)}async writeXmlVersion(e,t){let n=await Qe(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wt(e,s)}};l(zf,"isSemver");l($s,"bumpPatch");l(ax,"parseTomlVersion");l(cx,"parsePyprojectVersion");l(lx,"parseCsprojVersion")});var ln=k(()=>{"use strict";Xd();ip();ap();lp();mp();Ss();Sp();oc();Pp();pc();vp();hc();kc();Ip();hg();bg();ru();Vf()});import pn from"chalk";function Bf(r){return Math.ceil(r.length/ux)}function Jf(r){let e=r.split(`
|
|
1110
1148
|
`),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+=`
|
|
1111
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
1112
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
1149
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function ou(r){return r.includes("<!-- prjct:preserve")}function qf(r,e){let t=Jf(r),n=Jf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Bf(r),tokensAfter:Bf(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)ou(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
1150
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ou(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1113
1151
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1114
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
1115
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
1152
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ou(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
1153
|
+
`).length}),s.hasChanges=!0)}return s}function Kf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?pn.green:p=>p,o=t?pn.red:p=>p,i=t?pn.yellow:p=>p,a=t?pn.dim:p=>p,c=t?pn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1116
1154
|
`);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(`
|
|
1117
|
-
`)}function
|
|
1155
|
+
`)}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?pn.green:c=>c,o=t?pn.red:c=>c,i=t?pn.cyan:c=>c,a=t?pn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1118
1156
|
`))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(`
|
|
1119
1157
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1120
1158
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -1125,11 +1163,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.incl
|
|
|
1125
1163
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1126
1164
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
1127
1165
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
1128
|
-
`)}var
|
|
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
|
|
1130
|
-
`)}function
|
|
1166
|
+
`)}var ux,Xf=k(()=>{"use strict";ux=4;l(Bf,"estimateTokens");l(Jf,"parseMarkdownSections");l(ou,"isPreservedSection");l(qf,"generateSyncDiff");l(Kf,"formatDiffPreview");l(Yf,"formatFullDiff")});import dx from"node:path";async function iu(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 Ce.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(`
|
|
1167
|
+
`));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(r.context7&&u.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&u.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Qf(r){try{let e=await lt.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=W.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 Vr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function au(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Zf(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function eh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${Vr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${wo(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 | ${au(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: ${Vr(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(`
|
|
1168
|
+
`)}function th(r,e){let t=[];t.push(`# Repository Analysis
|
|
1131
1169
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1132
|
-
`);let n=
|
|
1170
|
+
`);let n=dx.basename(e);if(t.push(`## Project: ${n}
|
|
1133
1171
|
`),t.push(`## Stack Detected
|
|
1134
1172
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1135
1173
|
`),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
|
|
@@ -1145,34 +1183,34 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.incl
|
|
|
1145
1183
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1146
1184
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1147
1185
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1148
|
-
`)}var
|
|
1149
|
-
`),
|
|
1186
|
+
`)}var nh=k(()=>{"use strict";Sn();ko();ln();Ts();Hn();nt();l(iu,"showSyncResult");l(Qf,"getSessionActivity");l(Vr,"formatTokens");l(au,"formatDuration");l(Zf,"generateSparkline");l(eh,"generateStatsMarkdown");l(th,"generateAnalysisSummary")});var fg={};Rn(fg,{AnalysisCommands:()=>os});import cu from"node:fs/promises";import sh from"node:path";import*as rs from"@clack/prompts";var os,Ci=k(()=>{"use strict";ms();Ld();Sn();ko();ln();Pc();Xf();Ko();se();Yo();F();xs();Ts();Hn();nh();nt();os=class extends we{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1187
|
+
`),Ge.init(t);let n=await pt.build(t,e),s={packageJson:await Ge.readPackageJson(),cargoToml:await Ge.readCargoToml(),goMod:await Ge.readGoMod(),requirements:await Ge.readRequirements(),directories:await Ge.listDirectories(),fileCount:await Ge.countFiles(),gitStats:await Ge.getGitStats(),gitLog:await Ge.getGitLog(20),hasDockerfile:await Ge.fileExists("Dockerfile"),hasDockerCompose:await Ge.fileExists("docker-compose.yml"),hasReadme:await Ge.fileExists("README.md"),hasTsconfig:await Ge.fileExists("tsconfig.json"),hasViteConfig:await Ge.fileExists("vite.config.ts")||await Ge.fileExists("vite.config.js"),hasNextConfig:await Ge.fileExists("next.config.js")||await Ge.fileExists("next.config.mjs")},o=th(s,t),i=await M.getProjectId(t),a=n.paths.analysis||x.getFilePath(i,"analysis","repo-summary.md");await Ye.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:W.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Ze(),Pt(ft)).getActiveProvider(),d=await Ce.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${x.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1150
1188
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
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
|
|
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(`
|
|
1189
|
+
`),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 M.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(w=>w.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await ss.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(H(xe(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=sh.join(o,"context","CLAUDE.md"),c=null;try{c=await cu.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 ss.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(H("## \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 cu.readFile(a,"utf-8")}catch{p=""}let g=qf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(H(xe("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 cu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let S=[];for(let D of g.added)S.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)S.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)S.push(`Removed: ${D.name} (${D.lineCount} lines)`);let A=H("## \u26A1 Sync Preview",S.length>0?le("Changes",ze(S)):"No section changes.",St({"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(Kf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let w=await rs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rs.isCancel(w)||w==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(w==="diff"){console.log(`
|
|
1190
|
+
${Yf(g)}`);let S=await rs.confirm({message:"Apply these changes?",initialValue:!0});if(rs.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"),iu(m,i)}t.md||h.spin("Syncing project...");let d=await ss.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(H("## \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 Je.diff(s);A?.hasChanges&&(f=Cc(A))}catch{}let w=Zo("sync"),S=H(xe("Sync Complete"),St({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?zp("Uncommitted changes detected"):null,ue(w.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 iu(d,i)}catch(n){return t.md?console.log(H("## \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 M.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Wn.getSummary(s),i=await Wn.getDailyStats(s,30),a=await Qf(s),c=await Ne.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 Wn.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: ${Vr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${wo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${au(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=Zf(i);if(console.log(` ${p} ${Vr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=eh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",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 M.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=Or(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Je.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=sh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=H(`## \u26A1 Status: ${u}`,St({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?le("Analysis",ze(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 M.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 Je.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(H("## 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(H(Cc(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log($p(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(H("## \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 M.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 Je.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 M.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 Je.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(H(xe("Analysis Rolled Back"),St({"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(H("## \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(H("## \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 M.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Je.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 M.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 Je.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 Tx}from"node:child_process";import{promisify as Ex}from"node:util";async function Ji(r){if(process.platform!=="darwin")return gh(r);try{let{stdout:e}=await Ax(`security find-generic-password -s "${Ix}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return gh(r)}}function gh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var Ax,Ix,bu=k(()=>{"use strict";F();Ax=Ex(Tx),Ix="prjct-cli";l(Ji,"getCredential");l(gh,"getEnvFallback")});import It from"node:fs";import{createServer as ET}from"node:net";oa();Ci();ln();Yt();F();xs();nt();import px from"node:path";yt();he();F();ie();var Ni=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 M.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()}},z=new Ni;var Ms=class extends we{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 M.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=px.basename(t),a=await _.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await ut.getRecent(o,5),d=await qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=W.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(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1153
1191
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
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
|
|
1155
|
-
Activity: ${
|
|
1156
|
-
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await
|
|
1192
|
+
`),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 w=this._generateSparkline(g,m);return console.log(`
|
|
1193
|
+
Activity: ${w}
|
|
1194
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await pt.build(t),p=await Ye.get("Read")(m.paths.roadmap);if(console.log(`
|
|
1157
1195
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1158
1196
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1159
|
-
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,
|
|
1160
|
-
`)[0].trim();console.log(` ${
|
|
1161
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
1197
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,w)=>{let S=f.split(`
|
|
1198
|
+
`)[0].trim();console.log(` ${w+1}. ${S}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1199
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${W.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(w=>{let S=w.priority?` [${w.priority}]`:"";return`${w.description}${S}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(w=>{let S=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";return`${w.name}${S?` (${S})`:""}`}):["Nothing shipped yet"],f=H(`## \u26A1 Dashboard: ${i}`,le("Current Focus",m),le(`Queue (${c.length})`,ze(p,!0)),le("Recent Ships",ze(g)),le("Ideas",`${d.length} pending`),ue([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1162
1200
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1163
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1201
|
+
`),console.log("\u2550".repeat(50));let m=Or(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1164
1202
|
${g}`),console.log(`
|
|
1165
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=
|
|
1166
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,
|
|
1167
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let
|
|
1203
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=W.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1204
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,w)=>{let S=f.priority?`[${f.priority}]`:"";console.log(` ${w+1}. ${f.description.slice(0,40)} ${S}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1205
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let w=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${w?`(${w})`:""}`)}),console.log(`
|
|
1168
1206
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1169
1207
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1170
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1208
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:W.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(`
|
|
1171
1209
|
PRJCT COMMANDS
|
|
1172
|
-
`),console.log("=".repeat(50));let i=
|
|
1210
|
+
`),console.log("=".repeat(50));let i=z.getAllCategories(),a=z.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(`
|
|
1173
1211
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1174
1212
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1175
|
-
`),{success:!0,topic:"overview"}}let n=
|
|
1213
|
+
`),{success:!0,topic:"overview"}}let n=z.getByName(e);if(n){if(console.log(`
|
|
1176
1214
|
\u{1F4DA} HELP: /p:${n.name}
|
|
1177
1215
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
|
|
1178
1216
|
Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
|
|
@@ -1182,7 +1220,7 @@ ${"\u2550".repeat(50)}
|
|
|
1182
1220
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1183
1221
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1184
1222
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
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("")}};
|
|
1223
|
+
`),{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("")}};gl();yt();he();Yt();F();import mx from"node:fs/promises";import gx from"node:path";var is=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 M.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=x.getGlobalProjectPath(a),u=await _.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await pi.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=gx.join(e,"analysis","repo-analysis.json"),n=await mx.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}}},OG=new is;nt();ln();Yt();se();F();nt();async function Li(r){let e=await M.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(Li,"cleanupMemory");async function Ui(r){let e=await M.getProjectId(r);if(!e)return;let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}l(Ui,"cleanupMemoryInternal");async function lu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await Li(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await M.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=N.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.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 qe.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 Pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${y(a)}`)}return await Ui(e),await lt.log(e,"cleanup_performed",{items:s.length,timestamp:W.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(lu,"cleanup");ln();F();nt();import rh from"node:path";async function uu(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 M.getProjectId(t),a=rh.join(x.getGlobalProjectPath(i),"planning","designs");await fe.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1186
1224
|
|
|
1187
1225
|
*Use templates/design/architecture.md for full design*
|
|
1188
1226
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1197,12 +1235,12 @@ ${"\u2550".repeat(50)}
|
|
|
1197
1235
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1198
1236
|
|
|
1199
1237
|
*Use templates/design/flow.md for full design*
|
|
1200
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1238
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=rh.join(a,u);return await fe.writeFile(d,c),await lt.log(t,"design_created",{type:n,target:o,timestamp:W.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(uu,"design");ln();F();nt();import Os from"node:path";async function du(r=process.cwd()){try{let e=await M.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 fe.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(`
|
|
1201
1239
|
Found abandoned session:
|
|
1202
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let s=
|
|
1240
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let s=W.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1203
1241
|
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
|
|
1204
|
-
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
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
|
|
1242
|
+
`),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(du,"recover");async function pu(r=process.cwd()){try{h.spin("creating undo point...");let e=await M.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(x.getGlobalProjectPath(e),"snapshots");await fe.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=Os.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await fe.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 fe.writeFile(a,JSON.stringify(c,null,2)),await lt.log(r,"undo_performed",{snapshotId:i,timestamp:W.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(pu,"undo");async function mu(r=process.cwd()){try{h.spin("restoring changes...");let e=await M.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(x.getGlobalProjectPath(e),"snapshots"),n=Os.join(t,"history.json"),s;try{let i=await fe.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(`
|
|
1243
|
+
`).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 fe.writeFile(n,JSON.stringify(s,null,2)),await lt.log(r,"redo_performed",{timestamp:W.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(mu,"redo");async function gu(r=process.cwd()){try{let e=await M.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Os.join(x.getGlobalProjectPath(e),"snapshots"),n=Os.join(t,"history.json"),s;try{let o=await fe.readFile(n);s=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
|
|
1206
1244
|
SNAPSHOT HISTORY
|
|
1207
1245
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1208
1246
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1210,32 +1248,58 @@ ${"\u2550".repeat(50)}
|
|
|
1210
1248
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1211
1249
|
`)):(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
|
|
1212
1250
|
`)),console.log(`${"=".repeat(50)}
|
|
1213
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1214
|
-
${
|
|
1251
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(gu,"history");var Fs=class extends we{static{l(this,"MaintenanceCommands")}_cleanupMemory=Li;_cleanupMemoryInternal=Ui;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?lu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?uu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?du(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?pu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?mu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?gu(e):t}};import Ee from"chalk";se();var fu=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){N.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)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return N.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(w=>Math.round(w/1048576*10)/10,"toMB"),g=a.map(w=>w.value),f=c.map(w=>w.value);o.memory={avgHeapMB:p(g.reduce((w,S)=>w+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((w,S)=>w+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((w,S)=>w+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},fx=new fu,oh=fx;F();nt();var Tn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Hi(r,e,t){return t==="below"?r<=e?Ee.green("\u2713"):Ee.yellow("\u26A0"):r>=e?Ee.green("\u2713"):Ee.yellow("\u26A0")}l(Hi,"statusIcon");var _s=class extends we{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 M.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 oh.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1252
|
+
${Ee.dim("No performance data yet.")}`),console.log(`${Ee.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1215
1253
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1216
|
-
${
|
|
1217
|
-
${
|
|
1218
|
-
`),!
|
|
1219
|
-
|
|
1220
|
-
Please install
|
|
1221
|
-
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
\
|
|
1254
|
+
${Ee.cyan("Performance Report")} ${Ee.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Hi(i.startup.avg,Tn.startup.max,"below");console.log(` Startup: avg ${Ee.bold(`${i.startup.avg}ms`)} ${Ee.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ee.dim(`target: <${Tn.startup.max}ms`)}`)}if(i.memory){let c=Hi(i.memory.peakHeapMB,Tn.heapMB.max,"below");console.log(` Memory: avg ${Ee.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ee.dim(`target: <${Tn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Hi(i.contextCorrectness.rate,Tn.contextRate.min,"above");console.log(` Context: ${Ee.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ee.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ee.dim(`target: ${Tn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Hi(i.subtaskHandoff.rate,Tn.handoffRate.min,"above");console.log(` Handoff: ${Ee.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ee.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ee.dim(`target: ${Tn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1255
|
+
${Ee.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ee.bold(`${u.avg}ms`)} ${Ee.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)}}}};bi();Sn();he();Ss();F();$e();Bt();nt();import hu from"node:fs/promises";import hx from"node:path";import oe from"chalk";var Ns=class extends we{static{l(this,"SetupCommands")}async start(){let e=await Ce.checkInstallation(),t=(Ze(),Pt(ft)),n=await t.detectCodex(),s=e.claudeDetected,o=s?await t.getActiveProvider():null,i=s?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1256
|
+
`),!s&&!n.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1257
|
+
|
|
1258
|
+
Please install one first:
|
|
1259
|
+
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1260
|
+
- Gemini CLI: https://geminicli.com/docs
|
|
1261
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(s){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ce.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1262
|
+
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1263
|
+
${x.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1264
|
+
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(n.installed){let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Ii(),Ul));await a();let u=await c({autoRepair:!0});if(!u.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
|
|
1265
|
+
|
|
1266
|
+
${u.message||"router verification failed"}
|
|
1267
|
+
|
|
1268
|
+
Fix:
|
|
1269
|
+
1. Run: prjct setup
|
|
1270
|
+
2. Re-run: prjct start`};console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")}try{await on.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(a){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
|
|
1271
|
+
|
|
1272
|
+
${y(a)}
|
|
1273
|
+
|
|
1274
|
+
Fix:
|
|
1275
|
+
1. Ensure Node+npx is installed
|
|
1276
|
+
2. Re-run: prjct start`}}return console.log(`
|
|
1225
1277
|
\u{1F389} Setup complete!`),console.log(`
|
|
1226
|
-
Next steps:`),console.log(` 1. Open ${
|
|
1227
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1278
|
+
Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1279
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ce.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ce.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1228
1280
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1229
|
-
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let
|
|
1230
|
-
\u{1F4DD} Installing global configuration...`);let n=await
|
|
1231
|
-
\u26A1 Installing status line...`);let
|
|
1281
|
+
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1282
|
+
\u{1F4DD} Installing global configuration...`);let n=await Ce.installGlobalConfig(),s=n.path?x.getDisplayPath(n.path):"global config";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}`);let o=(Ze(),Pt(ft)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1283
|
+
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed){let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Ii(),Ul));await c();let d=await u({autoRepair:!0});if(!d.verified)return{success:!1,message:`\u274C Codex p. router is required but not ready.
|
|
1284
|
+
|
|
1285
|
+
${d.message||"router verification failed"}
|
|
1286
|
+
|
|
1287
|
+
Fix:
|
|
1288
|
+
1. Run: prjct start
|
|
1289
|
+
2. Re-run: prjct setup`};console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")}try{await on.ensureReady(),console.log("\u2705 Context7 MCP ready")}catch(c){return{success:!1,message:`\u274C Context7 MCP is required but not ready.
|
|
1290
|
+
|
|
1291
|
+
${y(c)}
|
|
1292
|
+
|
|
1293
|
+
Fix:
|
|
1294
|
+
1. Ensure Node+npx is installed
|
|
1295
|
+
2. Re-run: prjct setup`}}return console.log(`
|
|
1232
1296
|
\u{1F389} Setup complete!
|
|
1233
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=
|
|
1297
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=x.getClaudeDir(),t=x.getClaudeSettingsPath(),n=hx.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1234
1298
|
# prjct Status Line for Claude Code
|
|
1235
1299
|
# Shows version update notifications and current task
|
|
1236
1300
|
|
|
1237
1301
|
# Current CLI version (embedded at install time)
|
|
1238
|
-
CLI_VERSION="${
|
|
1302
|
+
CLI_VERSION="${We}"
|
|
1239
1303
|
|
|
1240
1304
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1241
1305
|
read -r json
|
|
@@ -1286,27 +1350,27 @@ fi
|
|
|
1286
1350
|
|
|
1287
1351
|
# Default: show prjct branding
|
|
1288
1352
|
echo "\u26A1 prjct"
|
|
1289
|
-
`;await
|
|
1290
|
-
${
|
|
1353
|
+
`;await hu.writeFile(n,s,{mode:493});let o={};if(await R(t))try{o=JSON.parse(await hu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await hu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(oe.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(oe.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(oe.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(oe.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(oe.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(oe.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(oe.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(` ${oe.bold.cyan("prjct")}${oe.magenta("/")}${oe.green("cli")} ${oe.dim.white(`v${We} installed`)}`),console.log(""),console.log(` ${oe.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${oe.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${oe.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(oe.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(oe.bold.cyan("\u{1F680} Quick Start")),console.log(oe.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(` ${oe.bold("1.")} Initialize your project:`),console.log(` ${oe.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${oe.bold("2.")} Start your first task:`),console.log(` ${oe.green('prjct task "build auth"')}`),console.log(""),console.log(` ${oe.bold("3.")} Ship & celebrate:`),console.log(` ${oe.green('prjct ship "user login"')}`),console.log(""),console.log(oe.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(` ${oe.dim("Documentation:")} ${oe.cyan("https://prjct.app")}`),console.log(` ${oe.dim("Report issues:")} ${oe.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(oe.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ms();ln();ru();Yt();F();xs();Ts();Tr();F();import{exec as kx}from"node:child_process";import{promisify as Sx}from"node:util";import rt from"chalk";ms();F();an();import{exec as yx}from"node:child_process";import{promisify as wx}from"node:util";import _W from"chalk";var HW=wx(yx),ih=new Map,ah=new Map;function ch(r,e){return`workflow:${r}_${e}`}l(ch,"prefKey");async function lh(r,e){let t={};for(let n of["before","after","skip"]){let s=ch(n,e),o=ah.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ih.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Ne.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(lh,"getWorkflowPreferences");async function uh(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=ch(o,s),a=ah.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ih.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Ne.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(uh,"listWorkflowPreferences");var Gi=Sx(kx);async function Lt(r,e,t,n={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],output:""};if(n.skipRules)return s;let i=ve.getRulesForCommand(r,e).filter(p=>p.position===t),a=await lh(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(`
|
|
1354
|
+
${rt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let f=Date.now();await Gi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-f,S=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`gate passed (${S})`)}`)}catch(f){return console.log(`${rt.red("\u2717")} gate failed: ${g}`),s.gatesFailed.push(g),s.success=!1,s.output+=`Gate failed: ${g}
|
|
1291
1355
|
${y(f)}
|
|
1292
1356
|
`,s}}let d=i.filter(p=>p.type==="hook");for(let p of d){console.log(`
|
|
1293
|
-
${
|
|
1357
|
+
${rt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await Gi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,w=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`(${w})`)}`)}catch(g){console.log(`${rt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),s.hooksFailed.push(p.description||p.action),s.output+=`Hook failed: ${p.action}
|
|
1294
1358
|
${y(g)}
|
|
1295
1359
|
`}}if(c){console.log(`
|
|
1296
|
-
${
|
|
1360
|
+
${rt.dim(`[legacy] ${t}-${e}: ${c}`)}`);try{let p=Date.now();await Gi(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(`${rt.green("\u2713")} ${rt.dim(`(${f})`)}`)}catch(p){console.log(`${rt.yellow("\u26A0")} legacy hook failed: ${c}`),s.hooksFailed.push(c),s.output+=`Legacy hook failed: ${c}
|
|
1297
1361
|
${y(p)}
|
|
1298
1362
|
`}}let m=i.filter(p=>p.type==="step");for(let p of m){console.log(`
|
|
1299
|
-
${
|
|
1363
|
+
${rt.dim(`[step] ${e}: ${p.action}`)}`);try{let g=Date.now();await Gi(p.action,{timeout:p.timeoutMs,cwd:n.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,w=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${rt.green("\u2713")} ${rt.dim(`step passed (${w})`)}`),s.stepsRun.push(p.description||p.action)}catch(g){return console.log(`${rt.red("\u2717")} step failed: ${p.action}`),s.gatesFailed.push(p.description||p.action),s.success=!1,s.output+=`Step failed: ${p.action}
|
|
1300
1364
|
${y(g)}
|
|
1301
|
-
`,s}}return s}l(
|
|
1302
|
-
|
|
1303
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1304
|
-
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${
|
|
1305
|
-
${
|
|
1306
|
-
`),{success:!0,message:"No data"};let a=
|
|
1307
|
-
${
|
|
1308
|
-
${
|
|
1309
|
-
${
|
|
1365
|
+
`,s}}return s}l(Lt,"executeWorkflowRules");nt();var Ls=class extends we{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 M.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Lt(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 zr(t).bump();n.md||h.step(2,4,"Updating changelog..."),await new hr(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 ut.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:W.getTimestamp()}),await Ne.learnDecision(o,"commit_footer","prjct","ship"),await Ne.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d}),await Lt(o,"ship","after",{projectPath:t,skipRules:n.skipHooks});try{n.md||h.step(4,4,"Updating AI context..."),await ss.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=Zo("ship"),w=H(xe(`Shipped: ${i}`,`Version: ${d}`),le("Results",ze([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),ue(f.map(S=>({label:S.desc,command:S.cmd}))));console.log(w)}else h.done(`v${d} shipped`),bt("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 Ye.get("Bash")("git add .");let n=`feat: ${e}
|
|
1366
|
+
|
|
1367
|
+
Generated with [p/](https://www.prjct.app/)`;return await Ye.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 Ye.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)"}}}};yt();he();Qo();F();Hn();nt();import bx from"node:fs/promises";import Cx from"node:path";import Us from"chalk";var Hs=class extends we{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(Us.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1368
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Us.dim("would update")} ${m}`);continue}try{let p=await br(d),g=await Xo(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Us.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Us.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let w of p.errors)console.log(` ${Us.yellow("\u26A0")} ${w.file}: ${w.error}`);c+=p.errors.length}}catch(p){console.log(` ${Us.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 M.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=Cx.join(x.getGlobalBasePath(),"projects");try{return(await bx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}};il();ps();Nc();F();Jn();nt();import Ae from"chalk";var Gs=class extends we{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 M.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 dt.getAll(s);if(i.length===0)return console.log(`
|
|
1369
|
+
${Ae.dim("No velocity data yet.")}`),console.log(`${Ae.dim("Complete tasks with estimates to build velocity history.")}
|
|
1370
|
+
`),{success:!0,message:"No data"};let a=li(i,o);await _c.saveMetrics(s,a),console.log(`
|
|
1371
|
+
${Ae.cyan("Sprint Velocity")} ${Ae.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?Ae.green:m.estimationAccuracy>=60?Ae.yellow:Ae.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ae.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ae.green("\u2191"):a.velocityTrend==="declining"?Ae.red("\u2193"):Ae.dim("\u2192");if(console.log(` Average: ${Ae.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ae.bold(`${a.estimationAccuracy}%`)} ${Ae.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1372
|
+
${Ae.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ae.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ae.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ae.green("\u2713")} ${m.category} tasks estimated within ${Ae.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Sm(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1373
|
+
${Ae.dim("Projection:")}`),console.log(` Backlog: ${Ae.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ae.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await M.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...wn,...n.velocity}}catch{}return wn}};El();Pl();import Ux from"node:fs/promises";import Hx from"node:path";Jn();var Px=[1,2,3,5,8,13,21],vx={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}},ph=l(r=>Px.includes(r),"isValidPoint"),Wi=l(r=>vx[r],"pointsToMinutes"),dh=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"),mh=l(r=>{let e=Wi(r);return`${dh(e.min)}\u2013${dh(e.max)}`},"pointsToTimeRange");he();F();import zi from"node:fs/promises";import xx from"node:os";import Vi from"node:path";var yu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Vi.join(xx.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await zi.mkdir(this.commandsPath,{recursive:!0});let n=Vi.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await zi.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:y(n)}}}async deleteWorkflowTemplate(e){try{let t=Vi.join(this.commandsPath,`${e}.md`);return await zi.unlink(t),{success:!0}}catch(t){return P(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Vi.join(this.commandsPath,`${e}.md`);return await zi.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
|
|
1310
1374
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1311
1375
|
---
|
|
1312
1376
|
|
|
@@ -1342,34 +1406,35 @@ Suggest relevant actions based on the workflow results:
|
|
|
1342
1406
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1343
1407
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1344
1408
|
- 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 ${
|
|
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,
|
|
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=
|
|
1351
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1352
|
-
`)))}console.log(
|
|
1409
|
+
`}},wu=new yu;qo();var Bi=300*1e3,Xe=new Ft({ttl:Bi,maxSize:100}),Ut=new Ft({ttl:Bi,maxSize:10}),Ws=new Ft({ttl:Bi,maxSize:5}),zs=new Ft({ttl:Bi,maxSize:5});function ku(){Xe.clear(),Ut.clear(),Ws.clear(),zs.clear()}l(ku,"clearLinearCache");function Su(){return{issues:Xe.stats(),assignedIssues:Ut.stats(),teams:Ws.stats(),projects:zs.stats()}}l(Su,"getLinearCacheStats");F();bu();var Rx={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},Dx={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},fh={none:0,urgent:1,high:2,medium:3,low:4},qi=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 Ji("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?fh[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=fh[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:Rx[t?.type||"backlog"]||"backlog",priority:Dx[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},mt=new qi;var Ki=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&mt.isConfigured()}async initialize(e){this.initialized||(await mt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Ut.get(t);if(n)return n;let s=await mt.fetchAssignedIssues(e);Ut.set(t,s);for(let o of s)Xe.set(`issue:${o.id}`,o),Xe.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Ut.get(n);if(s)return s;let o=await mt.fetchTeamIssues(e,t);Ut.set(n,o);for(let i of o)Xe.set(`issue:${i.id}`,i),Xe.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Xe.get(t);if(n)return n;let s=await mt.fetchIssue(e);return s&&(Xe.set(`issue:${s.id}`,s),Xe.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await mt.createIssue(e);return Xe.set(`issue:${t.id}`,t),Xe.set(`issue:${t.externalId}`,t),Ut.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await mt.updateIssue(e,t);return Xe.set(`issue:${n.id}`,n),Xe.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await mt.markInProgress(e),Xe.delete(`issue:${e}`),Ut.clear()}async markDone(e){this.ensureInitialized(),await mt.markDone(e),Xe.delete(`issue:${e}`),Ut.clear()}async addComment(e,t){this.ensureInitialized(),await mt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Ws.get("teams");if(e)return e;let t=await mt.getTeams();return Ws.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=zs.get("projects");if(e)return e;let t=await mt.getProjects();return zs.set("projects",t),t}clearCache(){ku()}getCacheStats(){return Su()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},At=new Ki;va();se();F();var hh=1800*1e3,Yi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await At.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:hh,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 At.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 At.markInProgress(t):n==="done"&&await At.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||hh;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=ud("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}}},jx=new Yi;Dt();Ss();he();se();ie();import{exec as $x}from"node:child_process";import{promisify as Mx}from"node:util";var yh=Mx($x),Vs="session-snapshot",Ox=30,Cu=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,Vs,u),u}getSnapshot(e){try{return I.getDoc(e,Vs)}catch{return null}}clearSnapshot(e){try{I.deleteDoc(e,Vs)}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,Vs);s&&t.push(s)}catch{}return t.sort((n,s)=>new Date(s.timestamp).getTime()-new Date(n.timestamp).getTime()),t}async cleanup(e=Ox){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,Vs);i&&new Date(i.timestamp).getTime()<n&&(I.deleteDoc(o,Vs),s++)}catch{}return s}formatContinuityContext(e){let n=["Session Continuity",`- Last session: ${nn(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: ${nn(e.durationWorkedSec*1e3)}`),n.push(`- Resume hint: ${e.resumeHint}`),n.join(`
|
|
1410
|
+
`)}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 ${nn(t*1e3)} of work`),n.join(" ")}async getGitBranch(e){try{let{stdout:t}=await yh("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await yh("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
|
|
1411
|
+
`).filter(n=>n.length>0).slice(0,20)}catch{return[]}}},En=new Cu;Yt();Uc();Tr();al();F();xs();Ts();Vc();F();$e();bu();import Fx from"node:fs/promises";import _x from"node:os";import Nx from"node:path";function Lx(r){return Nx.join(_x.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(Lx,"getCredentialsPath");async function Xi(r){let e=Lx(r);if(!await R(e))return{};try{return JSON.parse(await Fx.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(Xi,"getProjectCredentials");async function Pu(r){let e=await Xi(r);return e.linear?.apiKey?e.linear.apiKey:Ji("linear-api-key")}l(Pu,"getLinearApiKey");Jn();nt();var Gx=[{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}],Bs=class extends we{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 M.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 Lt(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 Xi(o),w=await Pu(o);if(w&&f.linear?.teamId){await At.initializeFromApiKey(w,f.linear.teamId);let S=await At.fetchIssue(e);S&&(a=e,c=`${e}: ${S.title}`,await At.markInProgress(e))}}catch{}if(n.md){try{await on.ensureReady()}catch(Ht){return vt("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Ht)}),{success:!1,error:y(Ht)}}let f=await _.getCurrentTask(o);if(f)return vt("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:me(),description:c,sessionId:me(),linearId:a});let w=x.getGlobalProjectPath(o),[S,A,D,B]=await Promise.all([Wx(),Je.getActive(o).catch(()=>null),zx(w),di(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),be=null;try{let Ht=En.getSnapshot(o);Ht&&(be=En.formatContinuityContext(Ht),En.clearSnapshot(o))}catch{}let je=zc({description:c,branch:S,linearId:a}),Ve=Vx(A,D),C=Gp(B.files.map(Ht=>({path:Ht.path,description:Ht.reasons.join(", ")}))),j=Bx(D),Ie=Jx(A),Qs=qx(c,B.files,A),Zs=ue([{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(H(be,je,Qs,Ve,C,j,Ie,Zs)),await this.logToMemory(t,"task_started",{task:e,timestamp:W.getTimestamp()}),await Lt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await ki.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:me(),description:c,sessionId:me(),linearId:a});let m=await Cl.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}),Ar("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:W.getTimestamp()}),await Lt(o,"task","after",{projectPath:t,skipRules:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:ph,pointsToMinutes:Wi,pointsToTimeRange:mh,storeEstimate:l(async f=>{let w=Wi(f);return await _.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:w.typical}),w},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return n.md?vt("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?W.calculateDuration(new Date(i.startedAt)):void 0,c=zc({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?Hp(u,d):"",p=ue([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(H(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")?vt("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 M.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?vt("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 Lt(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=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await dt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?wh(d):"0m",actualDuration:c||"0m",variance:d?Yx(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,w=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${wh(d)}) \u2192 ${S}${w}%`}await _.completeTask(s,t.feedback);try{En.clearSnapshot(s)}catch{}let g=o.linearId;if(g)try{let f=await Xi(s),w=await Pu(s);w&&f.linear?.teamId&&(await At.initializeFromApiKey(w,f.linear.teamId),await At.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(H(xe("Completed",`${a}${f}`),St({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),ue([{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}`),Ar("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.getTimestamp()}),await Lt(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 M.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?vt("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(H(le("Queue",`${o.length} task${o.length!==1?"s":""}`),ze(i,!0),ue([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(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 M.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?vt("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=W.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await En.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(H(xe("Task Paused",`**Paused:** ${i.description}`),St({Reason:e||void 0,"Duration worked":a||void 0}),ue([{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})`:""}`),Ar("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:W.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 M.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?vt("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(H(xe("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Ar("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:W.getTimestamp()}),{success:!0,task:a.description}):(n.md?vt("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 M.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 Gx){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=ct.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=ct.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=ve.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(H(xe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${s}\``),ue([{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=ct.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=ct.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=ve.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(H(xe("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{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(!ve.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(H(xe("Rule Removed",`Removed rule #${s}`))):h.done(`removed rule #${s}`),{success:!0}}async _workflowReset(e,t){let n=ve.resetRules(e);return t.md?console.log(H(xe("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=ve.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 ve.updateRule(t,o,{enabled:!1}),n.md?console.log(H(xe("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{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=ve.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 ve.updateRule(t,c.id,{enabled:!1}),n.md?console.log(H(xe("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(H(le("Multiple matches",`${a.length} rules match "${s}"`),ze(c),ue(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(H(le("Workflow Help","Manage hooks, gates, and steps for your workflow"),le("Commands",ze(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate',"`prjct workflow 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"])),le("Natural Language (EN/ES)",ze(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(" prjct workflow 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=ve.getRulesForCommand(t,e):o=ve.getAllRules(t);let i=await uh(t);if(o.length===0&&i.length===0)return n.md?console.log(H(le("Workflow Rules","No rules configured"),ue([{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(Kx(p,g))}let u=null;if(i.length>0){let p=i.map(g=>`[legacy] ${g.key} \u2192 \`${g.action}\` (${g.scope})`);u=le("Legacy Preferences",ze(p))}let d=e?`Workflow: ${e}`:"Workflow Rules",m=`${o.length} rule${o.length!==1?"s":""}`;console.log(H(le(d,m),c.length>0?Up(c.join(`
|
|
1412
|
+
|
|
1413
|
+
`),""):null,u,ue([{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=ve.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 ei(t),i=0,a=[],c=ve.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=ve.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=ve.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(H(xe("Workflow Initialized",`Added ${a.length} default ship rules`),ze(a),ue([{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(!ct.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(ct.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(ct.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=ct.createWorkflow(t,{name:i,description:a}),d=await wu.generateWorkflowTemplate(i,a);if(!d.success){ct.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(H(xe("Workflow Created",`Created workflow: ${i}`),le("Description",a),le("Template",`Installed at ${d.path}`),ue([{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(`
|
|
1414
|
+
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=ct.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(le("Built-in Workflows",a.join(`
|
|
1415
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(le("Custom Workflows",a.join(`
|
|
1416
|
+
`)))}console.log(H(...i,ue([{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
1417
|
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(!
|
|
1355
|
-
${
|
|
1418
|
+
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(!ct.deleteWorkflow(t,s)){let i=`Workflow '${s}' not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await wu.deleteWorkflowTemplate(s),n.md?console.log(H(xe("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 M.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=ct.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 Lt(o,i,"before",{projectPath:t});if(!c.success){if(n.md)vt("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 Lt(o,i,"after",{projectPath:t}),n.md?console.log(H(xe(`Workflow: ${i}`,a.description||""),ue([{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 En.cleanup();return t.md?console.log(xe("Cleanup",`Removed ${s} stale snapshot${s!==1?"s":""}`)):h.done(`cleaned ${s} stale snapshot${s!==1?"s":""}`),{success:!0,cleaned:s}}let n=await En.listAllSnapshots();if(n.length===0)return t.md?vt("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=W.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(H(le("Recent Sessions",`${n.length} session${n.length!==1?"s":""} across projects`),ze(s),ue([{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=W.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 wh(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(wh,"formatMinutesToDuration");async function Wx(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(Wx,"getGitBranch");async function zx(r){try{let e=Hx.join(r,"analysis","repo-analysis.json"),t=await Ux.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}l(zx,"loadRepoAnalysis");function Vx(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=St(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,w])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${w}\``);m=`### Commands
|
|
1419
|
+
${ze(g)}`}return[u?`### Project
|
|
1356
1420
|
${u}`:null,m].filter(Boolean).join(`
|
|
1357
1421
|
|
|
1358
|
-
`)||null}l(
|
|
1359
|
-
${s.join(`
|
|
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)
|
|
1422
|
+
`)||null}l(Vx,"buildProjectContext");function Bx(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 Wp(e)}l(Bx,"buildRules");function Jx(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.slice(0,8).map(o=>{let i=o.location?` \u2014 \`${o.location}\``:"",a=o.source?` [${o.source}]`:"";return`- **${o.name}**${a}: ${o.description}${i}`});e.push(`### Patterns (follow these)
|
|
1361
1423
|
${s.join(`
|
|
1424
|
+
`)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s={high:0,medium:1,low:2},i=[...n].sort((a,c)=>{let u=s[a.severity||"low"]??2,d=s[c.severity||"low"]??2;return u-d}).slice(0,8).map(a=>{let c=(a.severity||"low").toUpperCase(),u=a.source?` [${a.source}]`:"";return`- **[${c}] ${a.issue}**${u} \u2014 \`${a.file}\` \u2192 ${a.suggestion}`});e.push(`### Anti-patterns (avoid these)
|
|
1425
|
+
${i.join(`
|
|
1362
1426
|
`)}`)}return e.length>0?e.join(`
|
|
1363
1427
|
|
|
1364
|
-
`):null}l(
|
|
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,`
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
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
|
-
`))
|
|
1428
|
+
`):null}l(Jx,"buildPatterns");function qx(r,e,t){let n=e.slice(0,4).map(c=>`\`${c.path}\``),s=(t?.patterns||[]).slice(0,3).map(c=>c.name),o=l(c=>c==="high"?0:c==="medium"?1:2,"severityWeight"),i=(t?.antiPatterns||[]).sort((c,u)=>o(c.severity)-o(u.severity)).slice(0,3).map(c=>`${c.issue} (${c.file})`);return["### Context Contract",`- Goal: ${r}`,`- Key files: ${n.length>0?n.join(", "):"Run `prjct sync` to improve file targeting"}`,`- Patterns: ${s.length>0?s.join(" | "):"No patterns yet (run `prjct sync`)"}`,`- Must avoid: ${i.length>0?i.join(" | "):"No anti-patterns yet (run `prjct sync`)"}`,"- Do now: confirm approach, follow patterns, avoid anti-patterns before editing"].join(`
|
|
1429
|
+
`)}l(qx,"buildContextContract");function Kx(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(`
|
|
1430
|
+
`)}l(Kx,"buildFlowDiagram");function Yx(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(Yx,"formatVariance");var as=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Bs,this.planning=new Zn,this.shipping=new Ls,this.analytics=new Ms,this.performanceCmds=new _s,this.maintenance=new Fs,this.analysis=new os,this.setupCmds=new Ns,this.updateCmds=new Hs,this.velocityCmds=new Gs,this.contextCmds=new is,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)}},lB=new as;Ci();var kh={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}},Sh=[{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"]}];bi();Sn();he();F();$e();nt();import{execSync as Qi}from"node:child_process";import gt from"node:fs/promises";import Xx from"node:os";import mn from"node:path";import Qx from"node:readline";import ke from"chalk";var Zi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Br="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function vu(r){let e=0;try{let t=await gt.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name);if(n.isDirectory())e+=await vu(s);else try{let o=await gt.stat(s);e+=o.size}catch{}}}catch{}return e}l(vu,"getDirectorySize");function bh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(bh,"formatSize");async function Zx(r){try{return(await gt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(Zx,"countDirectoryItems");function eT(){let r={homebrew:!1,npm:!1};try{Qi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Qi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(eT,"detectInstallation");async function tT(){let r=[],e=Wd(),t=x.getGlobalBasePath(),n=await R(t),s=n?await Zx(mn.join(t,"projects")):0,o=n?await vu(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=mn.join(e.claude.config,"CLAUDE.md"),a=await R(i),c=!1;if(a)try{let je=await gt.readFile(i,"utf-8");c=je.includes(Zi)&&je.includes(Br)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await R(u),m=d?await vu(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await R(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=mn.join(e.claude.config,"prjct-statusline.sh"),w=await R(f);r.push({path:f,type:"file",description:"Status line script",exists:w});let S=e.gemini.router,A=await R(S);r.push({path:S,type:"file",description:"Gemini router",exists:A});let D=mn.join(e.gemini.config,"GEMINI.md"),B=await R(D),be=!1;if(B)try{let je=await gt.readFile(D,"utf-8");be=je.includes(Zi)&&je.includes(Br)}catch{}return B&&be&&r.push({path:D,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(tT,"gatherUninstallItems");async function nT(r){try{let e=await gt.readFile(r,"utf-8");if(!e.includes(Zi)||!e.includes(Br))return!1;let t=e.indexOf(Zi),n=e.indexOf(Br)+Br.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1431
|
+
|
|
1432
|
+
`).trim(),!s||s.trim().length===0?await gt.unlink(r):await gt.writeFile(r,`${s}
|
|
1433
|
+
`,"utf-8"),!0}catch{return!1}}l(nT,"removePrjctSection");async function sT(){let r=Xx.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=mn.join(r,`.prjct-backup-${e}`);try{await gt.mkdir(t,{recursive:!0});let n=x.getGlobalBasePath();return await R(n)&&await Ch(n,mn.join(t,".prjct-cli")),t}catch{return null}}l(sT,"createBackup");async function Ch(r,e){await gt.mkdir(e,{recursive:!0});let t=await gt.readdir(r,{withFileTypes:!0});for(let n of t){let s=mn.join(r,n.name),o=mn.join(e,n.name);n.isDirectory()?await Ch(s,o):await gt.copyFile(s,o)}}l(Ch,"copyDirectory");async function rT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await nT(o.path)&&n.push(o.path):o.type==="directory"?(await gt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await gt.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||Qi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Qi("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(rT,"performUninstall");async function oT(r){let e=Qx.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(oT,"promptConfirmation");async function iT(r={},e=process.cwd()){let t=await tT(),n=eT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ke.yellow(`
|
|
1434
|
+
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(ke.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ke.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=ke.dim("(section only)"):c.size&&(d=ke.dim(`(${bh(c.size)})`)),console.log(` ${ke.cyan(u.padEnd(35))} ${d}`),console.log(` ${ke.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ke.cyan("Homebrew".padEnd(35))} ${ke.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ke.cyan("npm global".padEnd(35))} ${ke.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ke.dim(` Total size: ${bh(o)}`)),console.log("")),r.dryRun)return console.log(ke.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ke.blue("Creating backup..."));let c=await sT();c?(console.log(ke.green(`Backup created: ${x.getDisplayPath(c)}`)),console.log("")):console.log(ke.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ke.yellow('Type "uninstall" to confirm:')),!await oT("> ")))return console.log(ke.yellow(`
|
|
1435
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ke.blue("Removing prjct..."));let{deleted:i,errors:a}=await rT(t,n,r);if(console.log(""),i.length>0&&console.log(ke.green(`Removed ${i.length} items`)),a.length>0){console.log(ke.yellow(`
|
|
1436
|
+
${a.length} errors:`));for(let c of a)console.log(ke.red(` - ${c}`))}return console.log(""),console.log(ke.green("prjct has been uninstalled.")),console.log(ke.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(iT,"uninstall");var ea=class extends we{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return iT(e,t)}};var cs=new Bs,ta=new Zn,aT=new Ls,Ph=new Ms,cT=new _s,Js=new Fs,qs=new os,vh=new Ns,lT=new is,uT=new Gs,dT=new ea,pT=new Hs;function mT(){for(let[r,e]of Object.entries(kh))z.registerCategory(r,e)}l(mT,"registerCategories");function xh(){if(z.has("work"))return;mT();let r=l(e=>Sh.find(t=>t.name===e),"getMeta");z.registerMethod("task",cs,"now",r("task")),z.registerMethod("done",cs,"done",r("done")),z.registerMethod("next",cs,"next",r("next")),z.registerMethod("pause",cs,"pause",r("pause")),z.registerMethod("resume",cs,"resume",r("resume")),z.registerMethod("workflow",cs,"workflow",r("workflow")),z.registerMethod("sessions",cs,"sessions",r("sessions")),z.registerMethod("init",ta,"init",r("init")),z.registerMethod("bug",ta,"bug",r("bug")),z.registerMethod("idea",ta,"idea",r("idea")),z.registerMethod("spec",ta,"spec",r("spec")),z.registerMethod("ship",aT,"ship",r("ship")),z.registerMethod("dash",Ph,"dash",r("dash")),z.registerMethod("help",Ph,"help",r("help")),z.registerMethod("perf",cT,"perf",r("perf")),z.registerMethod("velocity",uT,"velocity",r("velocity")),z.registerMethod("cleanup",Js,"cleanup",r("cleanup")),z.registerMethod("design",Js,"design",r("design")),z.registerMethod("recover",Js,"recover",r("recover")),z.registerMethod("undo",Js,"undo",r("undo")),z.registerMethod("redo",Js,"redo",r("redo")),z.registerMethod("history",Js,"history",r("history")),z.registerMethod("analyze",qs,"analyze",r("analyze")),z.registerMethod("sync",qs,"sync",r("sync")),z.registerMethod("stats",qs,"stats",r("stats")),z.registerMethod("status",qs,"status",r("status")),z.registerMethod("seal",qs,"seal",r("seal")),z.registerMethod("verify",qs,"verify",r("verify")),z.registerMethod("start",vh,"start",r("start")),z.registerMethod("setup",vh,"setup",r("setup")),z.registerMethod("uninstall",dT,"uninstall",r("uninstall")),z.registerMethod("update",pT,"update",r("update")),z.registerMethod("context",lT,"context",r("context"))}l(xh,"registerAllCommands");xh();yt();fa();import{Hono as vT}from"hono";import{cors as xT}from"hono/cors";import{logger as TT}from"hono/logger";he();se();Sr();Cr();Pr();xr();F();Gn();import gT from"node:fs/promises";import fT from"node:path";import{Hono as hT}from"hono";function yT(r){return x.getGlobalProjectPath(r)}l(yT,"getProjectDataPath");function Th(r,e){let t=new hT,n=yT(r);return t.get("/state",async s=>{let o=await _.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await qe.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 ut.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([_.read(r),Pe.read(r),qe.read(r),ut.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 _.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=fT.join(n,"context",`${o}.md`),c=await gT.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||L.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Th,"createRoutes");he();se();Sr();Cr();Pr();xr();import Ks from"node:fs/promises";import wT from"node:path";import{Hono as kT}from"hono";var ST=x.getGlobalBasePath(),Ys=wT.join(ST,"projects");function na(r){return I.getDoc(r,"project")}l(na,"getProjectConfig");async function xu(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(xu,"calculateDuration");function Eh(){let r=new kT;return r.get("/projects",async e=>{try{await Ks.mkdir(Ys,{recursive:!0});let n=(await Ks.readdir(Ys,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=na(o),a=await _.read(o),c=await Pe.read(o),u=await qe.read(o),d=await ut.read(o),m=a?.currentTask,p=await xu(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(na(t)),_.read(t),Pe.read(t),qe.read(t),ut.read(t)]),c=I.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await xu(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),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.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 qe.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 Ks.mkdir(Ys,{recursive:!0});let n=(await Ks.readdir(Ys,{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 Pe.read(c),m=await qe.read(c),p=await ut.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 Ks.mkdir(Ys,{recursive:!0});let s=(await Ks.readdir(Ys,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=na(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=na(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await xu(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(Eh,"createExtendedRoutes");ra();import{streamSSE as bT}from"hono/streaming";var Ah=3600*1e3,CT=300*1e3,PT=3e4;function Ih(){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()>Ah&&t(i)},CT),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 bT(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)}},PT),p=setTimeout(()=>{t(a)},Ah);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(Ih,"createSSEManager");function Rh(r){let e=new vT,t=Ih();r.enableCors!==!1&&e.use("*",xT({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",TT()),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=Th(r.projectId,r.projectPath);e.route("/api",n);let s=Eh();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(rr())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: ${rr()?"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(Rh,"createServer");var Dh=3478;var tn={runDir:l(()=>`${process.env.HOME||In("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${tn.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${tn.runDir()}/daemon.pid`,"pid"),log:l(()=>`${tn.runDir()}/daemon.log`,"log")},jh=1800*1e3;function Tu(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1437
|
+
`)}l(Tu,"encodeMessage");var Xs=null,Jr=null,Se=null,Ue=null;async function $h(r){let e=tn.socket(),t=tn.pid(),n=tn.runDir();if(It.mkdirSync(n,{recursive:!0}),It.existsSync(t)){let s=parseInt(It.readFileSync(t,"utf-8").trim(),10);jT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),It.unlinkSync(t)}if(It.existsSync(e)&&It.unlinkSync(e),Ue={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:jh,idleTimer:null},Se=new as,Xs=ET(s=>AT(s)),Xs.listen(e,()=>{It.chmodSync(e,384),It.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Mh()}),Xs.on("error",s=>{console.error("Daemon socket error:",s.message),qr(1)}),!r.noHttp)try{let s=process.cwd(),o=await M.getProjectId(s);if(o){let i=r.port||Dh;Jr=Rh({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Jr.start()}}catch{}if(process.on("SIGTERM",()=>qr(0)),process.on("SIGINT",()=>qr(0)),process.on("SIGHUP",()=>{Se=new as,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l($h,"startDaemon");function AT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1438
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await IT(o);r.write(Tu(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Tu(i))}}}),r.on("error",()=>{})}l(AT,"handleConnection");async function IT(r){if(!Ue||!Se)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Mh(),Ue.commandsServed++,Ue.lastActivity=Date.now(),r.command==="daemon")return DT(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 RT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1374
1439
|
`)||o.message||void 0,stderr:t.join(`
|
|
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(
|
|
1440
|
+
`)||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(IT,"handleRequest");async function RT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Se.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 Se.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Se.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return Se.diff(r.cwd,{json:t.json===!0,md:n});case"seal":return Se.seal(r.cwd,{json:t.json===!0});case"rollback":return Se.rollback(r.cwd,{json:t.json===!0,md:n});case"verify":return Se.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Se.task(e,r.cwd,{md:n});case"done":return Se.done(r.cwd,{md:n});case"next":return Se.next(r.cwd,{md:n});case"pause":return Se.pause(e||"",r.cwd,{md:n});case"resume":return Se.resume(e,r.cwd,{md:n});case"bug":return Se.bug(e||"",r.cwd,{md:n});case"idea":return Se.idea(e||"",r.cwd,{md:n});case"ship":return Se.ship(e,r.cwd,{md:n});case"dash":return Se.dash(e||"default",r.cwd,{md:n});case"workflow":return Se.workflowPrefs(e,r.cwd,{md:n});case"sessions":return Se.sessions(r.cwd,{md:n,cleanup:t.cleanup===!0});case"design":return Se.design(e||"",t);case"analyze":return Se.analyze(t);case"cleanup":return Se.cleanup(t);default:return z.execute(r.command,e,r.cwd)}}l(RT,"executeCommand");function DT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:tn.socket(),uptime:Ue?Date.now()-Ue.startedAt:0,commandsServed:Ue?.commandsServed??0,lastActivity:Ue?new Date(Ue.lastActivity).toISOString():null,registeredCommands:z.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>qr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(DT,"handleDaemonCommand");function Mh(){Ue&&(Ue.idleTimer&&clearTimeout(Ue.idleTimer),Ue.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ue.idleTimeoutMs/1e3/60} minutes, shutting down`),qr(0)},Ue.idleTimeoutMs),Ue.idleTimer.unref&&Ue.idleTimer.unref())}l(Mh,"resetIdleTimer");function qr(r){console.log("Daemon shutting down..."),Ue?.idleTimer&&clearTimeout(Ue.idleTimer),Jr&&(Jr.stop(),Jr=null),Xs&&(Xs.close(),Xs=null);let e=tn.socket(),t=tn.pid();try{It.existsSync(e)&&It.unlinkSync(e)}catch{}try{It.existsSync(t)&&It.unlinkSync(t)}catch{}process.exit(r)}l(qr,"shutdown");function jT(r){try{return process.kill(r,0),!0}catch{return!1}}l(jT,"isProcessRunning");var Eu=process.argv.slice(2),$T=parseInt(Eu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,MT=Eu.includes("--no-http"),OT=Eu.includes("--foreground");$h({port:$T,noHttp:MT,foreground:OT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|