prjct-cli 1.27.1 → 1.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/bin/prjct-core.mjs +309 -296
- package/dist/cli/linear.mjs +4 -2
- package/dist/daemon/entry.mjs +207 -193
- package/dist/templates.json +1 -1
- package/package.json +1 -1
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'module';
|
|
1
2
|
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
3
|
import { dirname as __pathDirname } from 'path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
`)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`);await vd(r,t)}function Jy(r){return gs.extname(r)}function qy(r){return gs.basename(r,gs.extname(r))}var xe=y(()=>{"use strict";Cd();_();l(_n,"readJson");l(kr,"writeJson");l(fs,"readFile");l(vd,"writeFile");l(Fy,"atomicWrite");l(_y,"appendToFile");l(Ia,"appendLine");l(Ny,"prependToFile");l(P,"fileExists");l(So,"dirExists");l(Mt,"ensureDir");l(Ly,"deleteFile");l(Hy,"deleteDir");l(hs,"listFiles");l(Uy,"getFileSize");l(Gy,"getFileModifiedTime");l(zy,"copyFile");l(Wy,"moveFile");l(By,"readLines");l(Vy,"writeLines");l(Jy,"getFileExtension");l(qy,"getFileNameWithoutExtension")});var Td={};ge(Td,{invalidateProviderCache:()=>Xy,readProviderCache:()=>ja,writeProviderCache:()=>Da});import ko from"node:fs/promises";import Ky from"node:os";import xd from"node:path";async function ja(){try{let r=await ko.readFile(Aa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Yy?null:e.detection}catch{return null}}async function Da(r){let e={timestamp:new Date().toISOString(),detection:r};await ko.mkdir(Pd,{recursive:!0}),await ko.writeFile(Aa,JSON.stringify(e,null,2))}async function Xy(){try{await ko.unlink(Aa)}catch{}}var Pd,Aa,Yy,Ra=y(()=>{"use strict";Pd=xd.join(Ky.homedir(),".prjct-cli","cache"),Aa=xd.join(Pd,"providers.json"),Yy=600*1e3;l(ja,"readProviderCache");l(Da,"writeProviderCache");l(Xy,"invalidateProviderCache")});var ut={};ge(ut,{AntigravityProvider:()=>Ma,ClaudeProvider:()=>bo,CursorProvider:()=>Ad,GeminiProvider:()=>$a,Providers:()=>Fe,WindsurfProvider:()=>jd,detectAllProviders:()=>an,detectAntigravity:()=>ws,detectCursorProject:()=>Rd,detectProvider:()=>Co,detectWindsurfProject:()=>$d,getActiveProvider:()=>nw,getCommandsDir:()=>lw,getGlobalContextPath:()=>iw,getGlobalSettingsPath:()=>aw,getProjectCommandsPath:()=>uw,getProviderBranding:()=>vo,getSkillsPath:()=>cw,hasProviderConfig:()=>sw,needsCursorRouterRegeneration:()=>rw,needsWindsurfRouterRegeneration:()=>ow,selectProvider:()=>Oa,validateCliVersion:()=>Dd});import{exec as Qy}from"node:child_process";import ys from"node:os";import nt from"node:path";import{promisify as Zy}from"node:util";async function ew(r){try{let{stdout:e}=await Ed(`which ${r}`,{timeout:Id});return e.trim()}catch{return null}}async function tw(r){try{let{stdout:e}=await Ed(`${r} --version`,{timeout:Id}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Fe[r];if(!e.cliCommand)return{installed:!1};let t=await ew(e.cliCommand);if(!t)return{installed:!1};let n=await tw(e.cliCommand),s=Dd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Dd(r,e){let t=Fe[r];return!t.minCliVersion||!e?null:hd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function an(r=!1){if(!r){let s=await ja();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Da(n).catch(()=>{}),n}async function nw(r){if(r&&Fe[r])return Fe[r];let e=await an();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?$a:bo}async function sw(r){let e=Fe[r];return e.configDir?P(e.configDir):!1}function vo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf"}[r]||"\u26A1 prjct"}}async function Rd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function rw(r){let e=await Rd(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ow(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function ws(){let r=Ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function iw(r){let e=Fe[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function aw(r){let e=Fe[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function cw(r){return Fe[r].skillsDir}function lw(r){return Fe[r].commandsDir}function uw(r,e){let t=Fe[r];return nt.join(e,t.commandsDir)}async function Oa(){let r=await an(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var Ed,Id,bo,$a,Ma,Ad,jd,Fe,Be=y(()=>{"use strict";Sr();xe();Ra();Ed=Zy(Qy),Id=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ys.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ys.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0"},$a={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ys.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ys.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0"},Ma={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ys.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ys.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null},Ad={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null},jd={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null},Fe={claude:bo,gemini:$a,cursor:Ad,antigravity:Ma,windsurf:jd};l(ew,"whichCommand");l(tw,"getCliVersion");l(Co,"detectProvider");l(Dd,"validateCliVersion");l(an,"detectAllProviders");l(nw,"getActiveProvider");l(sw,"hasProviderConfig");l(vo,"getProviderBranding");l(Rd,"detectCursorProject");l(rw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(ow,"needsWindsurfRouterRegeneration");l(ws,"detectAntigravity");l(iw,"getGlobalContextPath");l(aw,"getGlobalSettingsPath");l(cw,"getSkillsPath");l(lw,"getCommandsDir");l(uw,"getProjectCommandsPath");l(Oa,"selectProvider")});import{z as we}from"zod";function dw(r){return r instanceof Ss}function ne(r){return dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var ks,bI,CI,vI,xI,PI,TI,Ss,xo,Po,br,cn=y(()=>{"use strict";ks={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},bI=ks.create("FileError",we.object({path:we.string(),operation:we.enum(["read","write","delete","create","copy"]),reason:we.string().optional()})),CI=ks.create("ValidationError",we.object({field:we.string(),expected:we.string(),received:we.string().optional(),message:we.string().optional()})),vI=ks.create("PermissionError",we.object({action:we.string(),resource:we.string(),reason:we.string().optional()})),xI=ks.create("TaskError",we.object({taskId:we.string().optional(),operation:we.enum(["create","update","complete","pause","resume","delete"]),reason:we.string()})),PI=ks.create("SessionError",we.object({sessionId:we.string().optional(),reason:we.string()})),TI=ks.create("SyncError",we.object({projectId:we.string().optional(),operation:we.enum(["push","pull","auth","connect"]),reason:we.string()})),Ss=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},xo=class r extends Ss{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Po=class r extends Ss{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},br=class r extends Ss{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(dw,"isPrjctError");l(ne,"getErrorMessage")});var B={};ge(B,{calculateDuration:()=>kw,formatDate:()=>To,formatDuration:()=>Cr,formatMonth:()=>mw,getDateKey:()=>gw,getDateRange:()=>yw,getDaysAgo:()=>yn,getDaysFromNow:()=>hw,getEndOfDay:()=>Cw,getStartOfDay:()=>bw,getTimestamp:()=>C,getTodayKey:()=>Md,getYearMonthDay:()=>Fa,isToday:()=>ww,isWithinLastDays:()=>Sw,parseDate:()=>fw,toRelative:()=>vw});import{formatDistanceToNowStrict as pw}from"date-fns";function To(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function mw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Md(){return To(new Date)}function gw(r){return To(r)}function Fa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function fw(r){return new Date(r)}function C(){return new Date().toISOString()}function yn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function hw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function yw(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function ww(r){return To(r)===Md()}function Sw(r,e){let t=yn(e);return r>=t}function Cr(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function kw(r,e=new Date){let t=e.getTime()-r.getTime();return Cr(t)}function bw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Cw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function vw(r){let e=typeof r=="string"?new Date(r):r;return pw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(mw,"formatMonth");l(Md,"getTodayKey");l(gw,"getDateKey");l(Fa,"getYearMonthDay");l(fw,"parseDate");l(C,"getTimestamp");l(yn,"getDaysAgo");l(hw,"getDaysFromNow");l(yw,"getDateRange");l(ww,"isToday");l(Sw,"isWithinLastDays");l(Cr,"formatDuration");l(kw,"calculateDuration");l(bw,"getStartOfDay");l(Cw,"getEndOfDay");l(vw,"toRelative")});var Ao={};ge(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>fe,compareVersions:()=>Od,getPackageInfo:()=>xw,getPackageRoot:()=>La,getVersion:()=>xr,isCompatible:()=>Pw,needsMigration:()=>Tw});import _a from"node:fs";import Io from"node:path";function La(){if(vr)return vr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(_a.existsSync(t))try{if(JSON.parse(_a.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=r,r}catch{}r=Io.dirname(r)}return vr=Io.join(__dirname,"..","..",".."),vr}function xr(){if(Eo)return Eo;try{let r=Io.join(La(),"package.json"),e=JSON.parse(_a.readFileSync(r,"utf-8"));return Eo=e.version,Na=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function xw(){return Na||xr(),Na}function Od(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Pw(r){let e=xr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Tw(r,e=null){let t=e||xr();return Od(r,t)<0}var Eo,Na,vr,fe,pe,dt=y(()=>{"use strict";_();Eo=null,Na=null,vr=null;l(La,"getPackageRoot");l(xr,"getVersion");l(xw,"getPackageInfo");l(Od,"compareVersions");l(Pw,"isCompatible");l(Tw,"needsMigration");fe=xr(),pe=La()});import{exec as Ew}from"node:child_process";import{promisify as Iw}from"node:util";async function jo(r){try{let{stdout:e}=await Aw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function jw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Rw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function bs(){let[r,e,t]=await Promise.all([jw(),Dw(),Rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Aw,Do=y(()=>{"use strict";Aw=Iw(Ew);l(jo,"execCommand");l(jw,"detectGitHubUsername");l(Dw,"detectGitName");l(Rw,"detectGitEmail");l(bs,"detect")});import $w from"node:crypto";import Yt from"node:fs/promises";import Ua from"node:os";import U from"node:path";import{globSync as Mw}from"glob";var Ga,Ow,A,Ce=y(()=>{"use strict";le();xe();Ga=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(Ua.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return $w.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await So(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Mt(this.globalBaseDir),await Mt(this.globalProjectsDir),await Mt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Mt(U.join(t,s));return await Mt(U.join(t,"planning","tasks")),await Mt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Fa(t);return U.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Mt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Yt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Yt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Yt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Yt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await So(t)}getDisplayPath(e){let t=Ua.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ua.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Yt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await Yt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
11
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await P(c)){let u=await Yt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Mw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Yt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},Ow=new Ga,A=Ow});var _d={};ge(_d,{default:()=>R});import Nn from"node:fs/promises";import Fw from"node:path";import*as Ro from"jsonc-parser";function Fd(r){let e=[],t=Ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ro.printParseErrorCode(n.error)}`)}return t}var za,_w,R,Ve=y(()=>{"use strict";cn();_();le();dt();Do();Ce();l(Fd,"parseJsonc");za=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${ne(t)}`),null}}async writeConfig(e,t){let n=A.getLocalConfigPath(e),s=A.getLegacyPrjctPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
|
|
12
|
-
|
|
13
|
-
`,"utf-8")}async
|
|
4
|
+
var require = __createRequire(import.meta.url);
|
|
5
|
+
var __filename = __fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = __pathDirname(__filename);
|
|
7
|
+
var Py=Object.create;var hr=Object.defineProperty;var Ty=Object.getOwnPropertyDescriptor;var Ey=Object.getOwnPropertyNames;var Iy=Object.getPrototypeOf,Ay=Object.prototype.hasOwnProperty;var l=(r,e)=>hr(r,"name",{value:e,configurable:!0}),yr=(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')}),ld=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var jy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),fe=(r,e)=>{for(var t in e)hr(r,t,{get:e[t],enumerable:!0})},ud=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ey(e))!Ay.call(r,s)&&s!==t&&hr(r,s,{get:()=>e[s],enumerable:!(n=Ty(e,s))||n.enumerable});return r};var Dy=(r,e,t)=>(t=r!=null?Py(Iy(r)):{},ud(e||!r||!r.__esModule?hr(t,"default",{value:r,enumerable:!0}):t,r)),xt=r=>ud(hr({},"__esModule",{value:!0}),r);var dd={};fe(dd,{DAEMON_PATHS:()=>Ue,IDLE_TIMEOUT_MS:()=>Ia,decodeMessage:()=>Ry,encodeMessage:()=>ms});function ms(r){return Buffer.from(`${JSON.stringify(r)}
|
|
8
|
+
`)}function Ry(r){return JSON.parse(r.trim())}var Ue,Ia,ho=y(()=>{"use strict";Ue={runDir:l(()=>`${process.env.HOME||yr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ue.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ue.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ue.runDir()}/daemon.log`,"log")},Ia=1800*1e3;l(ms,"encodeMessage");l(Ry,"decodeMessage")});var gs={};fe(gs,{executeViaDaemon:()=>Oy,getDaemonStatus:()=>My,isDaemonRunning:()=>pd,sendRequest:()=>wr,spawnDaemon:()=>md,stopDaemon:()=>Fy});import yo from"node:crypto";import Pt from"node:fs";import{connect as $y}from"node:net";async function pd(){let r=Ue.socket();if(!Pt.existsSync(r))return!1;try{return(await wr({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Pt.unlinkSync(r)}catch{}return!1}}async function My(){let r=Ue.socket(),e=Ue.pid();if(!Pt.existsSync(r))return{running:!1};try{let t=await wr({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Pt.existsSync(e)?{running:!1,pid:parseInt(Pt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function wr(r){return new Promise((e,t)=>{let n=Ue.socket(),s=$y(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(ms(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
9
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Oy(r,e,t,n,s,o=!0){let i=Ue.socket();if(!Pt.existsSync(i))return o&&md().catch(()=>{}),null;try{return await wr({id:yo.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function Fy(){try{return(await wr({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function md(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Pt.existsSync(t))o=t,i="bun";else if(Pt.existsSync(n))o=n,i="node";else if(Pt.existsSync(s))o=s,i="node";else return!1;let a=Ue.runDir();Pt.mkdirSync(a,{recursive:!0});let c=Ue.log(),u=Pt.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Pt.closeSync(u),await new Promise(m=>setTimeout(m,500)),pd()}var fs=y(()=>{"use strict";ho();l(pd,"isDaemonRunning");l(My,"getDaemonStatus");l(wr,"sendRequest");l(Oy,"executeViaDaemon");l(Fy,"stopDaemon");l(md,"spawnDaemon")});import{z as Xt}from"zod";function gd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var tI,nI,sI,kr,rI,Sr=y(()=>{"use strict";tI=Xt.enum(["opus","sonnet","haiku"]),nI=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),sI=Xt.string().min(1),kr=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),rI=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:kr.optional()});l(gd,"compareSemver")});function fd(r){return r instanceof Error&&"code"in r}function v(r){return fd(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function wo(r){if(r instanceof Error)return r.stack}var _=y(()=>{"use strict";l(fd,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(wo,"getErrorStack")});import wd from"node:fs/promises";async function kd(r,e){let t;try{t=await wd.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await hd(r,t),yd(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await hd(r,t),yd(r,_y(s.error)),null)}async function hd(r,e){let t=`${r}.backup`;try{await wd.writeFile(t,e,"utf-8")}catch{}}function yd(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 _y(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Sd=y(()=>{"use strict";_();l(kd,"safeRead");l(hd,"createBackup");l(yd,"logCorruption");l(_y,"formatZodError")});var ce={};fe(ce,{appendLine:()=>Aa,appendToFile:()=>Ly,atomicWrite:()=>Ny,copyFile:()=>By,deleteDir:()=>Gy,deleteFile:()=>Uy,dirExists:()=>ko,ensureDir:()=>Nt,fileExists:()=>P,getFileExtension:()=>Ky,getFileModifiedTime:()=>Wy,getFileNameWithoutExtension:()=>Yy,getFileSize:()=>zy,listFiles:()=>ws,moveFile:()=>Vy,prependToFile:()=>Hy,readFile:()=>ys,readJson:()=>Ln,readLines:()=>Jy,writeFile:()=>bd,writeJson:()=>br,writeLines:()=>qy});import we from"node:fs/promises";import hs from"node:path";async function Ln(r,e=null,t){if(t)return await kd(r,t)??e;try{let n=await we.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function br(r,e,t=2){let n=JSON.stringify(e,null,t);await we.writeFile(r,n,"utf-8")}async function ys(r,e=""){try{return await we.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function bd(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0}),await we.writeFile(r,e,"utf-8")}async function Ny(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await we.writeFile(n,e,"utf-8"),await we.rename(n,r)}async function Ly(r,e){await we.appendFile(r,e,"utf-8")}async function Aa(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0}),await we.appendFile(r,`${e}
|
|
10
|
+
`,"utf-8")}async function Hy(r,e){try{let t=await we.readFile(r,"utf-8");await we.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await we.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await we.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function ko(r){try{return(await we.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Nt(r){await we.mkdir(r,{recursive:!0})}async function Uy(r){try{return await we.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function Gy(r){try{return await we.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function ws(r,e={}){try{let n=await we.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function zy(r){return(await we.stat(r)).size}async function Wy(r){return(await we.stat(r)).mtime}async function By(r,e){await we.copyFile(r,e)}async function Vy(r,e){await we.rename(r,e)}async function Jy(r){return(await ys(r,"")).split(`
|
|
11
|
+
`)}async function qy(r,e){let t=e.join(`
|
|
12
|
+
`);await bd(r,t)}function Ky(r){return hs.extname(r)}function Yy(r){return hs.basename(r,hs.extname(r))}var xe=y(()=>{"use strict";Sd();_();l(Ln,"readJson");l(br,"writeJson");l(ys,"readFile");l(bd,"writeFile");l(Ny,"atomicWrite");l(Ly,"appendToFile");l(Aa,"appendLine");l(Hy,"prependToFile");l(P,"fileExists");l(ko,"dirExists");l(Nt,"ensureDir");l(Uy,"deleteFile");l(Gy,"deleteDir");l(ws,"listFiles");l(zy,"getFileSize");l(Wy,"getFileModifiedTime");l(By,"copyFile");l(Vy,"moveFile");l(Jy,"readLines");l(qy,"writeLines");l(Ky,"getFileExtension");l(Yy,"getFileNameWithoutExtension")});var xd={};fe(xd,{invalidateProviderCache:()=>Zy,readProviderCache:()=>Da,writeProviderCache:()=>Ra});import So from"node:fs/promises";import Xy from"node:os";import Cd from"node:path";async function Da(){try{let r=await So.readFile(ja,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Qy?null:e.detection}catch{return null}}async function Ra(r){let e={timestamp:new Date().toISOString(),detection:r};await So.mkdir(vd,{recursive:!0}),await So.writeFile(ja,JSON.stringify(e,null,2))}async function Zy(){try{await So.unlink(ja)}catch{}}var vd,ja,Qy,$a=y(()=>{"use strict";vd=Cd.join(Xy.homedir(),".prjct-cli","cache"),ja=Cd.join(vd,"providers.json"),Qy=600*1e3;l(Da,"readProviderCache");l(Ra,"writeProviderCache");l(Zy,"invalidateProviderCache")});var ut={};fe(ut,{AntigravityProvider:()=>Oa,ClaudeProvider:()=>bo,CursorProvider:()=>Ed,GeminiProvider:()=>Ma,Providers:()=>Me,WindsurfProvider:()=>Id,detectAllProviders:()=>cn,detectAntigravity:()=>Ss,detectCursorProject:()=>jd,detectProvider:()=>Co,detectWindsurfProject:()=>Dd,getActiveProvider:()=>rw,getCommandsDir:()=>dw,getGlobalContextPath:()=>cw,getGlobalSettingsPath:()=>lw,getProjectCommandsPath:()=>pw,getProviderBranding:()=>vo,getSkillsPath:()=>uw,hasProviderConfig:()=>ow,needsCursorRouterRegeneration:()=>iw,needsWindsurfRouterRegeneration:()=>aw,selectProvider:()=>Fa,validateCliVersion:()=>Ad});import{exec as ew}from"node:child_process";import ks from"node:os";import nt from"node:path";import{promisify as tw}from"node:util";async function nw(r){try{let{stdout:e}=await Pd(`which ${r}`,{timeout:Td});return e.trim()}catch{return null}}async function sw(r){try{let{stdout:e}=await Pd(`${r} --version`,{timeout:Td}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Me[r];if(!e.cliCommand)return{installed:!1};let t=await nw(e.cliCommand);if(!t)return{installed:!1};let n=await sw(e.cliCommand),s=Ad(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Ad(r,e){let t=Me[r];return!t.minCliVersion||!e?null:gd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function cn(r=!1){if(!r){let s=await Da();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Ra(n).catch(()=>{}),n}async function rw(r){if(r&&Me[r])return Me[r];let e=await cn();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?Ma:bo}async function ow(r){let e=Me[r];return e.configDir?P(e.configDir):!1}function vo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf"}[r]||"\u26A1 prjct"}}async function jd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function iw(r){let e=await jd(r);return e.detected&&!e.routerInstalled}async function Dd(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function aw(r){let e=await Dd(r);return e.detected&&!e.routerInstalled}async function Ss(){let r=Oa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function cw(r){let e=Me[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function lw(r){let e=Me[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function uw(r){return Me[r].skillsDir}function dw(r){return Me[r].commandsDir}function pw(r,e){let t=Me[r];return nt.join(e,t.commandsDir)}async function Fa(){let r=await cn(),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 Pd,Td,bo,Ma,Oa,Ed,Id,Me,Be=y(()=>{"use strict";Sr();xe();$a();Pd=tw(ew),Td=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ks.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ks.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"},Ma={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ks.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ks.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"},Oa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ks.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ks.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},Ed={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},Id={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},Me={claude:bo,gemini:Ma,cursor:Ed,antigravity:Oa,windsurf:Id};l(nw,"whichCommand");l(sw,"getCliVersion");l(Co,"detectProvider");l(Ad,"validateCliVersion");l(cn,"detectAllProviders");l(rw,"getActiveProvider");l(ow,"hasProviderConfig");l(vo,"getProviderBranding");l(jd,"detectCursorProject");l(iw,"needsCursorRouterRegeneration");l(Dd,"detectWindsurfProject");l(aw,"needsWindsurfRouterRegeneration");l(Ss,"detectAntigravity");l(cw,"getGlobalContextPath");l(lw,"getGlobalSettingsPath");l(uw,"getSkillsPath");l(dw,"getCommandsDir");l(pw,"getProjectCommandsPath");l(Fa,"selectProvider")});import{z as ke}from"zod";function mw(r){return r instanceof bs}function se(r){return mw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Cs,DI,RI,$I,MI,OI,FI,bs,xo,Po,Cr,ln=y(()=>{"use strict";Cs={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}},DI=Cs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),RI=Cs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),$I=Cs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),MI=Cs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),OI=Cs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),FI=Cs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),bs=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},xo=class r extends bs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Po=class r extends bs{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")}},Cr=class r extends bs{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(mw,"isPrjctError");l(se,"getErrorMessage")});var W={};fe(W,{calculateDuration:()=>Cw,formatDate:()=>To,formatDuration:()=>vr,formatMonth:()=>fw,getDateKey:()=>hw,getDateRange:()=>kw,getDaysAgo:()=>kn,getDaysFromNow:()=>ww,getEndOfDay:()=>xw,getStartOfDay:()=>vw,getTimestamp:()=>C,getTodayKey:()=>Rd,getYearMonthDay:()=>_a,isToday:()=>Sw,isWithinLastDays:()=>bw,parseDate:()=>yw,toRelative:()=>Pw});import{formatDistanceToNowStrict as gw}from"date-fns";function To(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function fw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Rd(){return To(new Date)}function hw(r){return To(r)}function _a(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function yw(r){return new Date(r)}function C(){return new Date().toISOString()}function kn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ww(r){let e=new Date;return e.setDate(e.getDate()+r),e}function kw(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 Sw(r){return To(r)===Rd()}function bw(r,e){let t=kn(e);return r>=t}function vr(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 Cw(r,e=new Date){let t=e.getTime()-r.getTime();return vr(t)}function vw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function xw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Pw(r){let e=typeof r=="string"?new Date(r):r;return gw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(fw,"formatMonth");l(Rd,"getTodayKey");l(hw,"getDateKey");l(_a,"getYearMonthDay");l(yw,"parseDate");l(C,"getTimestamp");l(kn,"getDaysAgo");l(ww,"getDaysFromNow");l(kw,"getDateRange");l(Sw,"isToday");l(bw,"isWithinLastDays");l(vr,"formatDuration");l(Cw,"calculateDuration");l(vw,"getStartOfDay");l(xw,"getEndOfDay");l(Pw,"toRelative")});var Ao={};fe(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>ve,compareVersions:()=>$d,getPackageInfo:()=>Tw,getPackageRoot:()=>Ha,getVersion:()=>Pr,isCompatible:()=>Ew,needsMigration:()=>Iw});import Na from"node:fs";import Io from"node:path";function Ha(){if(xr)return xr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(Na.existsSync(t))try{if(JSON.parse(Na.readFileSync(t,"utf-8")).name==="prjct-cli")return xr=r,r}catch{}r=Io.dirname(r)}return xr=Io.join(__dirname,"..","..",".."),xr}function Pr(){if(Eo)return Eo;try{let r=Io.join(Ha(),"package.json"),e=JSON.parse(Na.readFileSync(r,"utf-8"));return Eo=e.version,La=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Tw(){return La||Pr(),La}function $d(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Ew(r){let e=Pr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Iw(r,e=null){let t=e||Pr();return $d(r,t)<0}var Eo,La,xr,ve,pe,dt=y(()=>{"use strict";_();Eo=null,La=null,xr=null;l(Ha,"getPackageRoot");l(Pr,"getVersion");l(Tw,"getPackageInfo");l($d,"compareVersions");l(Ew,"isCompatible");l(Iw,"needsMigration");ve=Pr(),pe=Ha()});import{exec as Aw}from"node:child_process";import{promisify as jw}from"node:util";async function jo(r){try{let{stdout:e}=await Dw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Rw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function $w(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Mw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function vs(){let[r,e,t]=await Promise.all([Rw(),$w(),Mw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Dw,Do=y(()=>{"use strict";Dw=jw(Aw);l(jo,"execCommand");l(Rw,"detectGitHubUsername");l($w,"detectGitName");l(Mw,"detectGitEmail");l(vs,"detect")});import Ow from"node:crypto";import Qt from"node:fs/promises";import Ga from"node:os";import U from"node:path";import{globSync as Fw}from"glob";var za,_w,I,Se=y(()=>{"use strict";le();xe();za=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(Ga.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 Ow.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 ko(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Nt(this.globalBaseDir),await Nt(this.globalProjectsDir),await Nt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Nt(U.join(t,s));return await Nt(U.join(t,"planning","tasks")),await Nt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=_a(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 Nt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.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 Qt.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 Qt.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 Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await ko(t)}getDisplayPath(e){let t=Ga.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ga.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Qt.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 Qt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
13
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await P(c)){let u=await Qt.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 Qt.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=Fw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Qt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},_w=new za,I=_w});var Od={};fe(Od,{default:()=>R});import Hn from"node:fs/promises";import Nw from"node:path";import*as Ro from"jsonc-parser";function Md(r){let e=[],t=Ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ro.printParseErrorCode(n.error)}`)}return t}var Wa,Lw,R,Ve=y(()=>{"use strict";ln();_();le();dt();Do();Se();l(Md,"parseJsonc");Wa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),n=await Hn.readFile(t,"utf-8");return Md(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${se(t)}`),null}}async writeConfig(e,t){let n=I.getLocalConfigPath(e),s=I.getLegacyPrjctPath(e);await Hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
|
|
14
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),n=await Hn.readFile(t,"utf-8");return Md(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${se(t)}`),null}}async writeGlobalConfig(e,t){let n=I.getGlobalProjectConfigPath(e),s=I.getGlobalProjectPath(e);await Hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
|
|
15
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:ve,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=I.generateProjectId(e),s=I.getGlobalProjectPath(n),o=I.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ve,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=I.getGlobalProjectPath(s.projectId);try{return(await Hn.readdir(Nw.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:I.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await vs(),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=I.generateProjectId(e);return{projectId:n,dataPath:I.getDisplayPath(I.getGlobalProjectPath(n))}}},Lw=new Wa,R=Lw});var _d={};fe(_d,{default:()=>Va});import xs from"node:fs/promises";import Hw from"node:os";import Fd from"node:path";var Ba,Uw,Va,Ja=y(()=>{"use strict";_();Ba=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Hw.homedir(),this.configDir=Fd.join(this.homeDir,".prjct-cli","config"),this.configFile=Fd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await xs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await xs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await xs.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await xs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await xs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await xs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Uw=new Ba,Va=Uw});function Gw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Tr(){return Gw()==="bun"}var qa=y(()=>{"use strict";l(Gw,"detectRuntime");l(Tr,"isBun")});import Ka from"node:fs";import Nd from"node:path";function zw(r){if(Tr()){let{Database:s}=yr("bun:sqlite");return new s(r,{create:!0})}let e=yr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Ww,$o,$,V,he=y(()=>{"use strict";Se();qa();l(zw,"openDatabase");Ww=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
14
16
|
-- =======================================================================
|
|
15
17
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
16
18
|
-- =======================================================================
|
|
@@ -241,13 +243,13 @@ var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDe
|
|
|
241
243
|
CREATE INDEX idx_archives_entity_type ON archives(entity_type);
|
|
242
244
|
CREATE INDEX idx_archives_archived_at ON archives(archived_at);
|
|
243
245
|
CREATE INDEX idx_archives_entity_id ON archives(entity_id);
|
|
244
|
-
`)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return
|
|
246
|
+
`)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Nd.join(I.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Nd.dirname(n);Ka.existsSync(s)||Ka.mkdirSync(s,{recursive:!0});let o=zw(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 Ka.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(`
|
|
245
247
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
246
248
|
version INTEGER PRIMARY KEY,
|
|
247
249
|
name TEXT NOT NULL,
|
|
248
250
|
applied_at TEXT NOT NULL
|
|
249
251
|
)
|
|
250
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Gw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new $o,V=$});var Ud=y(()=>{"use strict"});import Tr from"node:fs/promises";import wn from"node:path";import{z as ue}from"zod";async function Jw(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=wn.join(e,"package.json"),s=await Tr.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function qw(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await Qw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Vw[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Kw(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=wn.join(e,a);try{await Tr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Yw(r,e){let t=Date.now();try{let n=await Zw(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Xw(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],s=[];for(let o of r.antiPatterns){let i=wn.join(e,o.file);try{await Tr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Gd(r,e){let t=Date.now(),n=await Promise.all([Jw(r,e),qw(r,e),Kw(r,e),Yw(r,e),Xw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function Qw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=wn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Zw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var zw,Ww,Bw,Ka,wA,Vw,Ya=y(()=>{"use strict";_();Sr();zw=ue.enum(["draft","verified","sealed"]),Ww=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Bw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ka=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(Ww),antiPatterns:ue.array(Bw),analyzedAt:ue.string(),modelMetadata:wr.optional(),status:zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),wA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Vw={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(Jw,"verifyFrameworks");l(qw,"verifyLanguages");l(Kw,"verifyPatternLocations");l(Yw,"verifyFileCount");l(Xw,"verifyAntiPatternFiles");l(Gd,"semanticVerify");l(Qw,"getProjectExtensions");l(Zw,"countProjectFiles")});import{z as Me}from"zod";var Mo,Sn,eS,CA,Xa,zd,Er=y(()=>{"use strict";Mo=Me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Sn=Me.object({primaryDomain:Mo,secondaryDomains:Me.array(Mo),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),eS=Me.object({classification:Sn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),CA=Me.object({entries:Me.record(Me.string(),eS),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Sn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Xa={entries:{},confirmedPatterns:[]},zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var tS,nS,Wd,sS,rS,oS,iS,aS,Bd,PA,Qa=y(()=>{"use strict";tS=z.enum(["low","medium","high"]),nS=z.enum(["pending","converted","completed","archived","dormant"]),Wd=z.enum(["high","medium","low"]),sS=z.object({impact:Wd,effort:Wd}),rS=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),oS=z.object({name:z.string(),description:z.string()}),iS=z.object({name:z.string(),description:z.string().optional()}),aS=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:tS,status:nS,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:sS.optional(),implementationNotes:z.string().optional(),stack:rS.optional(),modules:z.array(oS).optional(),roles:z.array(iS).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Bd=z.object({ideas:z.array(aS),lastUpdated:z.string()}),PA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Jd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Vd,cS,lS,uS,dS,AA,jA,Za=y(()=>{"use strict";Vd=Y.enum(["linear","jira","github","monday","asana","none"]),cS=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),lS=Y.enum(["none","urgent","high","medium","low"]),uS=Y.enum(["feature","bug","improvement","task","chore","epic"]),dS=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:cS,priority:lS,type:uS.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),AA=Y.object({provider:Vd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),dS)}),jA=Y.object({provider:Vd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Jd,"createEmptyIssues")});var Qd={};ge(Qd,{AgentAssignmentSchema:()=>qd,OUTPUT_SCHEMAS:()=>Yd,SubtaskBreakdownSchema:()=>Kd,TaskClassificationSchema:()=>Sn,renderSchemaForPrompt:()=>ec});import{z as Je}from"zod";function ec(r){let e=Yd[r];return e?`## OUTPUT FORMAT
|
|
252
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Ww)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new $o,V=$});var Ld=y(()=>{"use strict"});import Er from"node:fs/promises";import Sn from"node:path";import{z as ue}from"zod";async function Kw(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=Sn.join(e,"package.json"),s=await Er.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Yw(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 ek(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=qw[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 Xw(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=Sn.join(e,a);try{await Er.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 Qw(r,e){let t=Date.now();try{let n=await tk(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 Zw(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=Sn.join(e,o.file);try{await Er.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 Hd(r,e){let t=Date.now(),n=await Promise.all([Kw(r,e),Yw(r,e),Xw(r,e),Qw(r,e),Zw(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 ek(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Er.readdir(s,{withFileTypes:!0});for(let i of o){let a=Sn.join(s,i.name),c=Sn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Sn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function tk(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Er.readdir(s,{withFileTypes:!0});for(let i of o){let a=Sn.join(s,i.name),c=Sn.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 Bw,Vw,Jw,Ya,IA,qw,Xa=y(()=>{"use strict";_();Sr();Bw=ue.enum(["draft","verified","sealed"]),Vw=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Jw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ya=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(Vw),antiPatterns:ue.array(Jw),analyzedAt:ue.string(),modelMetadata:kr.optional(),status:Bw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),IA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},qw={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(Kw,"verifyFrameworks");l(Yw,"verifyLanguages");l(Xw,"verifyPatternLocations");l(Qw,"verifyFileCount");l(Zw,"verifyAntiPatternFiles");l(Hd,"semanticVerify");l(ek,"getProjectExtensions");l(tk,"countProjectFiles")});import{z as Oe}from"zod";var Mo,bn,nk,RA,Qa,Ud,Ir=y(()=>{"use strict";Mo=Oe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),bn=Oe.object({primaryDomain:Mo,secondaryDomains:Oe.array(Mo),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),nk=Oe.object({classification:bn,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),RA=Oe.object({entries:Oe.record(Oe.string(),nk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:bn,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),Qa={entries:{},confirmedPatterns:[]},Ud={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var sk,rk,Gd,ok,ik,ak,ck,lk,zd,OA,Za=y(()=>{"use strict";sk=z.enum(["low","medium","high"]),rk=z.enum(["pending","converted","completed","archived","dormant"]),Gd=z.enum(["high","medium","low"]),ok=z.object({impact:Gd,effort:Gd}),ik=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),ak=z.object({name:z.string(),description:z.string()}),ck=z.object({name:z.string(),description:z.string().optional()}),lk=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:sk,status:rk,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:ok.optional(),implementationNotes:z.string().optional(),stack:ik.optional(),modules:z.array(ak).optional(),roles:z.array(ck).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),zd=z.object({ideas:z.array(lk),lastUpdated:z.string()}),OA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Bd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Wd,uk,dk,pk,mk,LA,HA,ec=y(()=>{"use strict";Wd=Y.enum(["linear","jira","github","monday","asana","none"]),uk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),dk=Y.enum(["none","urgent","high","medium","low"]),pk=Y.enum(["feature","bug","improvement","task","chore","epic"]),mk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:uk,priority:dk,type:pk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),LA=Y.object({provider:Wd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),mk)}),HA=Y.object({provider:Wd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Bd,"createEmptyIssues")});var Yd={};fe(Yd,{AgentAssignmentSchema:()=>Vd,OUTPUT_SCHEMAS:()=>qd,SubtaskBreakdownSchema:()=>Jd,TaskClassificationSchema:()=>bn,renderSchemaForPrompt:()=>tc});import{z as Je}from"zod";function tc(r){let e=qd[r];return e?`## OUTPUT FORMAT
|
|
251
253
|
|
|
252
254
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
253
255
|
|
|
@@ -256,28 +258,28 @@ ${e.example}
|
|
|
256
258
|
\`\`\`
|
|
257
259
|
|
|
258
260
|
Fields:
|
|
259
|
-
${
|
|
260
|
-
`)}return"(see example above)"}function Xd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Xd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var qd,Kd,Yd,Oo=y(()=>{"use strict";Er();Er();qd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Kd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),Yd={classification:{schema:Sn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Kd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(ec,"renderSchemaForPrompt");l(pS,"describeSchema");l(Xd,"describeField")});import{z as E}from"zod";var Zd,mS,gS,ep,fS,hS,yS,wS,SS,kS,bS,tp,CS,vS,NA,np,sp,rp,op,xS,Fo,tc=y(()=>{"use strict";Zd=E.number().min(1).max(5),mS=E.enum(["exceeded","met","partial","failed"]),gS=E.enum(["definitely","probably","maybe","no"]),ep=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),fS=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:ep.optional(),explanation:E.string().optional()})}),hS=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),yS=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),wS=E.object({metrics:E.array(hS),acceptanceCriteria:E.array(yS),overallSuccess:mS,successScore:E.number().min(0).max(100)}),SS=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),kS=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(SS)}),bS=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:gS,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),tp=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Zd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),CS=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:fS,success:wS.optional(),learnings:kS,roi:bS,rating:Zd,taskOutcomes:E.array(tp).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),vS=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:ep,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),NA=E.object({outcomes:E.array(CS),taskOutcomes:E.array(tp).optional(),aggregates:vS.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),np={outcomes:[],taskOutcomes:[],lastUpdated:""},sp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),rp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),op=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),xS=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>xS(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ge}from"zod";function jS(){let r={};for(let e of ES)r[e]="allow";for(let e of IS)r[e]="ask";for(let e of AS)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,GA,PS,nc,TS,zA,ES,IS,AS,WA,ip=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),GA=Ge.enum(["read","write","delete","create"]),PS=Ge.record(Ge.string(),_o),nc=Ge.record(Ge.string(),_o),TS=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),zA=Ge.object({bash:PS.optional(),files:Ge.object({read:nc.optional(),write:nc.optional(),delete:nc.optional()}).optional(),web:TS.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),ES=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],IS=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],AS=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(jS,"buildDefaultPermissions");WA=jS()});import{z as at}from"zod";var qA,KA,ap=y(()=>{"use strict";qA=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),KA={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as I}from"zod";var DS,RS,$S,MS,OS,FS,_S,NS,LS,HS,US,GS,zS,WS,BS,VS,JS,qS,ZA,ej,cp=y(()=>{"use strict";DS=I.enum(["planned","active","completed","shipped"]),RS=I.enum(["low","medium","high"]),$S=I.enum(["feature","breaking_change","refactor","infrastructure"]),MS=I.enum(["completed","active","planned"]),OS=I.enum(["planned","active","completed"]),FS=I.enum(["git","git-branch","manual","prd"]),_S=I.object({id:I.string(),description:I.string(),completed:I.boolean(),completedAt:I.string().optional()}),NS=I.object({id:I.string(),name:I.string(),status:MS,completedAt:I.string().optional()}),LS=I.object({goal:I.string(),phases:I.array(NS),successMetrics:I.array(I.string()).optional()}),HS=I.object({hours:I.number(),minutes:I.number(),totalMinutes:I.number(),display:I.string().optional()}),US=I.object({hash:I.string(),message:I.string(),date:I.string(),author:I.string().optional()}),GS=I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),breakdown:I.array(I.object({area:I.string(),hours:I.number()})).optional()}),zS=I.object({hours:I.number().optional(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional()}),WS=I.object({estimated:GS.nullable(),actual:zS.nullable()}),BS=I.object({totalHours:I.number(),allocatedHours:I.number(),bufferPercent:I.number().optional()}),VS=I.object({id:I.string(),name:I.string(),theme:I.string().optional(),goals:I.array(I.string()).optional(),features:I.array(I.string()),capacity:BS.optional(),status:OS,startDate:I.string().optional(),endDate:I.string().optional()}),JS=I.object({id:I.string(),name:I.string(),description:I.string().optional(),date:I.string(),status:DS,impact:RS,effort:I.string().optional(),progress:I.number(),type:$S.optional(),roi:I.number().optional(),why:I.array(I.string()).optional(),technicalNotes:I.array(I.string()).optional(),compatibility:I.string().optional(),phase:I.string().optional(),tasks:I.array(_S),createdAt:I.string(),shippedAt:I.string().optional(),version:I.string().optional(),duration:HS.optional(),taskCount:I.number().optional(),agent:I.string().optional(),sprintName:I.string().optional(),completedDate:I.string().optional(),prdId:I.string().nullable().optional(),legacy:I.boolean().optional(),inferredFrom:FS.optional(),quarter:I.string().nullable().optional(),dependencies:I.array(I.string()).optional(),blockedBy:I.array(I.string()).optional(),effortTracking:WS.optional(),valueScore:I.number().optional(),commits:I.array(US).optional(),branch:I.string().optional(),commitsAhead:I.number().optional()}),qS=I.object({id:I.string(),title:I.string(),prdId:I.string().nullable().optional(),valueScore:I.number().optional(),effortEstimate:I.number().optional(),reason:I.string().optional()}),ZA=I.object({strategy:LS.nullable().optional(),features:I.array(JS),backlog:I.array(I.union([I.string(),qS])),lastUpdated:I.string(),quarters:I.array(VS).optional(),generatedFrom:I.enum(["git-history","manual","prd"]).optional(),generatedAt:I.string().optional()}),ej={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import KS from"node:crypto";import{homedir as YS}from"node:os";import{join as XS}from"node:path";function Se(){return KS.randomUUID()}var QS,lp=y(()=>{"use strict";l(Se,"generateUUID");QS=XS(YS(),".prjct-cli","projects")});import{z as Q}from"zod";var ZS,up,ek,tk,nk,sk,rk,ok,ik,dp,sc=y(()=>{"use strict";ZS=Q.enum(["feature","fix","improvement","refactor"]),up=Q.enum(["pass","warning","fail","skipped"]),ek=Q.enum(["added","changed","fixed","removed"]),tk=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),nk=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),sk=Q.object({description:Q.string(),type:ek.optional()}),rk=Q.object({lintStatus:up.nullable().optional(),lintDetails:Q.string().optional(),testStatus:up.nullable().optional(),testDetails:Q.string().optional()}),ok=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),ik=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:ZS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(sk).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:ok.optional(),codeMetrics:nk.optional(),qualityMetrics:rk.optional(),quantitativeImpact:Q.string().optional(),duration:tk.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),dp=Q.object({shipped:Q.array(ik),lastUpdated:Q.string()})});import{z as T}from"zod";var ak,mp,ck,lk,uk,rc,gp,dk,pk,fp,pp,mk,gk,hp,yp,wp,fk,hk,mj,No=y(()=>{"use strict";Sr();ak=T.enum(["low","medium","high","critical"]),mp=T.enum(["feature","bug","improvement","chore"]),ck=T.enum(["active","backlog","previously_active"]),lk=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),uk=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),rc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),gp=T.object({output:T.string().min(1,"Subtask output is required"),summary:rc}),dk=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:lk,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:rc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),pk=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),fp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(dk).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:pk.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:wr.optional()}),pp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),mk=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),gk=T.object({taskId:T.string(),title:T.string(),classification:mp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(rc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:mk.optional()}),hp=T.object({currentTask:fp.nullable(),previousTask:pp.nullable().optional(),pausedTasks:T.array(pp).optional(),taskHistory:T.array(gk).optional(),lastUpdated:T.string()}),yp=T.object({id:T.string(),description:T.string(),priority:ak,type:mp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:ck,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),wp=T.object({tasks:T.array(yp),lastUpdated:T.string()}),fk=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),hk=T.object({type:uk,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),mj=T.object({projectId:T.string(),currentTask:fp.nullable(),queue:T.array(yp),stats:fk,recentActivity:T.array(hk),lastSync:T.string()})});import{z as ie}from"zod";var yk,wk,Sp,yj,wj,Sj,kn,kp,vs=y(()=>{"use strict";yk=ie.enum(["improving","stable","declining"]),wk=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Sp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),yj=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),wj=ie.object({sprints:ie.array(wk),averageVelocity:ie.number(),velocityTrend:yk,estimationAccuracy:ie.number(),overEstimated:ie.array(Sp),underEstimated:ie.array(Sp),lastUpdated:ie.string()}),Sj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),kn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},kp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ot=y(()=>{"use strict";Ud();Ya();Er();Qa();Za();Oo();Sr();tc();ip();ap();cp();lp();sc();No();vs()});var Xt,oc,St,bn=y(()=>{"use strict";Ot();le();he();Xt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},oc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=Se(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},St=new oc});var bp=y(()=>{"use strict"});var Lo,Cp=y(()=>{"use strict";Lo={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var xs,Ho=y(()=>{"use strict";xs={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var vp=y(()=>{"use strict"});var xp=y(()=>{"use strict";vp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Pp,Ps=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Pp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ic=y(()=>{"use strict"});var ac=y(()=>{"use strict";bp();Cp();Ho();_();xp();Ps();ic()});function Ts(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Ck[r]}var se,cc,lc,Go,Ck,Tt,Tp,Ir,ln=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ck={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ts,"getTimeout");Tt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Tp={HISTORY_MAX:100},Ir={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function xk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(vk.has(r)||r.includes("prjct"))return{level:Es.debug,name:"debug"};let e=Es[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Ep>=r?(...n)=>console[t](e,...n):Tk}var Es,vk,Ep,Pk,Tk,Ek,H,Ln=y(()=>{"use strict";Es={error:0,warn:1,info:2,debug:3},vk=new Set(["1","true","*"]);l(xk,"getLogLevel");({level:Ep,name:Pk}=xk()),Tk=l(()=>{},"noop");l(zo,"createLogMethod");Ek={error:zo(Es.error,"[prjct:error]","error"),warn:zo(Es.warn,"[prjct:warn]","warn"),info:zo(Es.info,"[prjct:info]","log"),debug:zo(Es.debug,"[prjct:debug]","log"),isEnabled:l(()=>Ep>=0,"isEnabled"),level:l(()=>Pk,"level")},H=Ek});var Wo,Ik,Ip=y(()=>{"use strict";cn();he();ac();ln();Ln();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Tp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Lo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Lo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ne(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Ik=new Wo});var Bo,Vo,Ap=y(()=>{"use strict";Ce();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await _n(t,[])??[];n.push(e),await kr(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await _n(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await kr(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:C(),success:!0};await kr(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await _n(t,null)}},Vo=new Bo});var uc=y(()=>{"use strict";Ip();Ap()});var Ft,Jo=y(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,Qt=y(()=>{"use strict";uc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Vo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var dc,Ye,Ar=y(()=>{"use strict";Ot();Qa();le();bn();Qt();dc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Bd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Se(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=yn(Xt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ye=new dc});var pc,Pe,jr=y(()=>{"use strict";Ot();No();le();bn();Qt();pc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",wp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:Se(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:Se(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=yn(Xt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Pe=new pc});var mc,pt,Dr=y(()=>{"use strict";Ot();sc();le();bn();Qt();mc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",dp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Se(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=yn(Xt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new mc});var Rr,gc,Hn,fc=y(()=>{"use strict";Rr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},gc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Rr[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Rr[e]}getPrompt(e){return Rr[e].prompt}getValidCommands(e){return Rr[e].transitions}formatNextSteps(e){return Rr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Hn=new gc});var hc,L,$r=y(()=>{"use strict";Ot();No();le();fc();bn();Qt();hc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",hp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Hn.getCurrentState(e),s=Hn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:Se()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];St.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=gp.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
261
|
+
${gk(e.schema)}`:null}function gk(r){if(r instanceof Je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Kd(n)}`).join(`
|
|
262
|
+
`)}return"(see example above)"}function Kd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Kd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var Vd,Jd,qd,Oo=y(()=>{"use strict";Ir();Ir();Vd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Jd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),qd={classification:{schema:bn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Vd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Jd,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(tc,"renderSchemaForPrompt");l(gk,"describeSchema");l(Kd,"describeField")});import{z as E}from"zod";var Xd,fk,hk,Qd,yk,wk,kk,Sk,bk,Ck,vk,Zd,xk,Pk,qA,ep,tp,np,sp,Tk,Fo,nc=y(()=>{"use strict";Xd=E.number().min(1).max(5),fk=E.enum(["exceeded","met","partial","failed"]),hk=E.enum(["definitely","probably","maybe","no"]),Qd=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),yk=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:Qd.optional(),explanation:E.string().optional()})}),wk=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),kk=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Sk=E.object({metrics:E.array(wk),acceptanceCriteria:E.array(kk),overallSuccess:fk,successScore:E.number().min(0).max(100)}),bk=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),Ck=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(bk)}),vk=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:hk,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),Zd=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Xd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),xk=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:yk,success:Sk.optional(),learnings:Ck,roi:vk,rating:Xd,taskOutcomes:E.array(Zd).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),Pk=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:Qd,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),qA=E.object({outcomes:E.array(xk),taskOutcomes:E.array(Zd).optional(),aggregates:Pk.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),ep={outcomes:[],taskOutcomes:[],lastUpdated:""},tp=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"),np=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),sp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Tk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Tk(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ge}from"zod";function Rk(){let r={};for(let e of Ak)r[e]="allow";for(let e of jk)r[e]="ask";for(let e of Dk)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,QA,Ek,sc,Ik,ZA,Ak,jk,Dk,ej,rp=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),QA=Ge.enum(["read","write","delete","create"]),Ek=Ge.record(Ge.string(),_o),sc=Ge.record(Ge.string(),_o),Ik=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),ZA=Ge.object({bash:Ek.optional(),files:Ge.object({read:sc.optional(),write:sc.optional(),delete:sc.optional()}).optional(),web:Ik.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),Ak=["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*"],jk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Dk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Rk,"buildDefaultPermissions");ej=Rk()});import{z as at}from"zod";var rj,oj,op=y(()=>{"use strict";rj=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),oj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var $k,Mk,Ok,Fk,_k,Nk,Lk,Hk,Uk,Gk,zk,Wk,Bk,Vk,Jk,qk,Kk,Yk,lj,uj,ip=y(()=>{"use strict";$k=A.enum(["planned","active","completed","shipped"]),Mk=A.enum(["low","medium","high"]),Ok=A.enum(["feature","breaking_change","refactor","infrastructure"]),Fk=A.enum(["completed","active","planned"]),_k=A.enum(["planned","active","completed"]),Nk=A.enum(["git","git-branch","manual","prd"]),Lk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),Hk=A.object({id:A.string(),name:A.string(),status:Fk,completedAt:A.string().optional()}),Uk=A.object({goal:A.string(),phases:A.array(Hk),successMetrics:A.array(A.string()).optional()}),Gk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),zk=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),Wk=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Bk=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),Vk=A.object({estimated:Wk.nullable(),actual:Bk.nullable()}),Jk=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),qk=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:Jk.optional(),status:_k,startDate:A.string().optional(),endDate:A.string().optional()}),Kk=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:$k,impact:Mk,effort:A.string().optional(),progress:A.number(),type:Ok.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(Lk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Gk.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:Nk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:Vk.optional(),valueScore:A.number().optional(),commits:A.array(zk).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),Yk=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),lj=A.object({strategy:Uk.nullable().optional(),features:A.array(Kk),backlog:A.array(A.union([A.string(),Yk])),lastUpdated:A.string(),quarters:A.array(qk).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),uj={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 Xk from"node:crypto";import{homedir as Qk}from"node:os";import{join as Zk}from"node:path";function me(){return Xk.randomUUID()}var eS,ap=y(()=>{"use strict";l(me,"generateUUID");eS=Zk(Qk(),".prjct-cli","projects")});import{z as Q}from"zod";var tS,cp,nS,sS,rS,oS,iS,aS,cS,lp,rc=y(()=>{"use strict";tS=Q.enum(["feature","fix","improvement","refactor"]),cp=Q.enum(["pass","warning","fail","skipped"]),nS=Q.enum(["added","changed","fixed","removed"]),sS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),rS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),oS=Q.object({description:Q.string(),type:nS.optional()}),iS=Q.object({lintStatus:cp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:cp.nullable().optional(),testDetails:Q.string().optional()}),aS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),cS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:tS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(oS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:aS.optional(),codeMetrics:rS.optional(),qualityMetrics:iS.optional(),quantitativeImpact:Q.string().optional(),duration:sS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),lp=Q.object({shipped:Q.array(cS),lastUpdated:Q.string()})});import{z as T}from"zod";var lS,dp,uS,dS,pS,oc,pp,mS,gS,mp,up,fS,hS,gp,fp,hp,yS,wS,vj,No=y(()=>{"use strict";Sr();lS=T.enum(["low","medium","high","critical"]),dp=T.enum(["feature","bug","improvement","chore"]),uS=T.enum(["active","backlog","previously_active"]),dS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),pS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),oc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),pp=T.object({output:T.string().min(1,"Subtask output is required"),summary:oc}),mS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:dS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:oc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),gS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),mp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(mS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:gS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:kr.optional()}),up=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),fS=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),hS=T.object({taskId:T.string(),title:T.string(),classification:dp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(oc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:fS.optional()}),gp=T.object({currentTask:mp.nullable(),previousTask:up.nullable().optional(),pausedTasks:T.array(up).optional(),taskHistory:T.array(hS).optional(),lastUpdated:T.string()}),fp=T.object({id:T.string(),description:T.string(),priority:lS,type:dp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:uS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),hp=T.object({tasks:T.array(fp),lastUpdated:T.string()}),yS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),wS=T.object({type:pS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),vj=T.object({projectId:T.string(),currentTask:mp.nullable(),queue:T.array(fp),stats:yS,recentActivity:T.array(wS),lastSync:T.string()})});import{z as ie}from"zod";var kS,SS,yp,Ej,Ij,Aj,Cn,wp,Ps=y(()=>{"use strict";kS=ie.enum(["improving","stable","declining"]),SS=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),yp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),Ej=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),Ij=ie.object({sprints:ie.array(SS),averageVelocity:ie.number(),velocityTrend:kS,estimationAccuracy:ie.number(),overEstimated:ie.array(yp),underEstimated:ie.array(yp),lastUpdated:ie.string()}),Aj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),Cn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},wp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Ld();Xa();Ir();Za();ec();Oo();Sr();nc();rp();op();ip();ap();rc();No();Ps()});var Zt,ic,kt,vn=y(()=>{"use strict";Lt();le();he();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ic=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=me(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(me(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new ic});var kp=y(()=>{"use strict"});var Lo,Sp=y(()=>{"use strict";Lo={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Ts,Ho=y(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var bp=y(()=>{"use strict"});var Cp=y(()=>{"use strict";bp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,vp,Es=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},vp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ac=y(()=>{"use strict"});var cc=y(()=>{"use strict";kp();Sp();Ho();_();Cp();Es();ac()});function Is(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 xS[r]}var re,lc,uc,Go,xS,Tt,xp,Ar,un=y(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},lc=["feature","spec","design","refactor","migrate"],uc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],xS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Is,"getTimeout");Tt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},xp={HISTORY_MAX:100},Ar={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function TS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(PS.has(r)||r.includes("prjct"))return{level:As.debug,name:"debug"};let e=As[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Pp>=r?(...n)=>console[t](e,...n):IS}var As,PS,Pp,ES,IS,AS,H,Un=y(()=>{"use strict";As={error:0,warn:1,info:2,debug:3},PS=new Set(["1","true","*"]);l(TS,"getLogLevel");({level:Pp,name:ES}=TS()),IS=l(()=>{},"noop");l(zo,"createLogMethod");AS={error:zo(As.error,"[prjct:error]","error"),warn:zo(As.warn,"[prjct:warn]","warn"),info:zo(As.info,"[prjct:info]","log"),debug:zo(As.debug,"[prjct:debug]","log"),isEnabled:l(()=>Pp>=0,"isEnabled"),level:l(()=>ES,"level")},H=AS});var Wo,jS,Tp=y(()=>{"use strict";ln();he();cc();un();Un();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=xp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Lo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Lo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",se(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())}},jS=new Wo});var Bo,Vo,Ep=y(()=>{"use strict";Se();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Ln(t,[])??[];n.push(e),await br(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Ln(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await br(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await br(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Ln(t,null)}},Vo=new Bo});var dc=y(()=>{"use strict";Tp();Ep()});var Ht,Jo=y(()=>{"use strict";Ht=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,en=y(()=>{"use strict";dc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ht({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Vo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var pc,Ye,jr=y(()=>{"use strict";Lt();Za();le();vn();en();pc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",zd)}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:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=kn(Zt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ye=new pc});var mc,Pe,Dr=y(()=>{"use strict";Lt();No();le();vn();en();mc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",hp)}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:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id: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:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=kn(Zt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Pe=new mc});var gc,pt,Rr=y(()=>{"use strict";Lt();rc();le();vn();en();gc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",lp)}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:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=kn(Zt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new gc});var $r,fc,Gn,hc=y(()=>{"use strict";$r={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},fc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=$r[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return $r[e]}getPrompt(e){return $r[e].prompt}getValidCommands(e){return $r[e].transitions}formatNextSteps(e){return $r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Gn=new fc});var yc,L,Mr=y(()=>{"use strict";Lt();No();le();hc();vn();en();yc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",gp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Gn.getCurrentState(e),s=Gn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:me()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=pp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
261
263
|
${f.join(`
|
|
262
|
-
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new hc});import jk from"node:fs/promises";import Dk from"node:path";import{Hono as Rk}from"hono";function $k(r){return A.getGlobalProjectPath(r)}function jp(r,e){let t=new Rk,n=$k(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=Dk.join(n,"context",`${o}.md`),c=await jk.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Dp=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();_();Ln();l($k,"getProjectDataPath");l(jp,"createRoutes")});import Is from"node:fs/promises";import Mk from"node:path";import{Hono as Ok}from"hono";function qo(r){return $.getDoc(r,"project")}async function yc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function Rp(){let r=new Ok;return r.get("/projects",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await yc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await yc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ye.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Pe.read(c),m=await Ye.read(c),p=await pt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Is.mkdir(As,{recursive:!0});let s=(await Is.readdir(As,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await yc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var Fk,As,$p=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();Fk=A.getGlobalBasePath(),As=Mk.join(Fk,"projects");l(qo,"getProjectConfig");l(yc,"calculateDuration");l(Rp,"createExtendedRoutes")});import{streamSSE as _k}from"hono/streaming";function Op(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Mp&&t(i)},Nk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return _k(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Lk),p=setTimeout(()=>{t(a)},Mp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Mp,Nk,Lk,Fp=y(()=>{"use strict";ic();Mp=3600*1e3,Nk=300*1e3,Lk=3e4;l(Op,"createSSEManager")});var _p={};ge(_p,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>zk});import{Hono as Hk}from"hono";import{cors as Uk}from"hono/cors";import{logger as Gk}from"hono/logger";function Ko(r){let e=new Hk,t=Op();r.enableCors!==!1&&e.use("*",Uk({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Gk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=jp(r.projectId,r.projectPath);e.route("/api",n);let s=Rp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Pr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Pr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function zk(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,wc=y(()=>{"use strict";Ja();Dp();$p();Fp();l(Ko,"createServer");Yo=3478;l(zk,"startServer")});import Un from"chalk";var Np,Wk,Bk,_t,Lp=y(()=>{"use strict";Be();Np=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Wk=80,Bk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Np,speed:Wk},cli:{header:l(()=>`${Un.cyan.bold("\u26A1")} ${Un.cyan("prjct")}`,"header"),footer:l(()=>Un.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Un.cyan("\u26A1")} ${Un.cyan("prjct")} ${Un.cyan(Np[r%10])} ${Un.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},_t=Bk});function Gn(r,e){return{...xs[r],...e}}function Mr(r,e,t){return{message:r,hint:e,...t}}var Or=y(()=>{"use strict";Ho();Ho();l(Gn,"getError");l(Mr,"createError")});var Up={};ge(Up,{ERRORS:()=>xs,ICONS:()=>Cn,OUTPUT_TIERS:()=>Hp,createError:()=>Mr,default:()=>h,formatForHuman:()=>Yk,getError:()=>Gn,getOutputTier:()=>Jk,getTierConfig:()=>Qo,isQuietMode:()=>Kk,limitLines:()=>Xo,setOutputTier:()=>Vk,setQuietMode:()=>qk});import te from"chalk";function Vk(r){Ds=r}function Jk(){return Ds}function Qo(){return Hp[Ds]}function qk(r){ct=r}function Kk(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
264
|
+
`)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new yc});import RS from"node:fs/promises";import $S from"node:path";import{Hono as MS}from"hono";function OS(r){return I.getGlobalProjectPath(r)}function Ip(r,e){let t=new MS,n=OS(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=$S.join(n,"context",`${o}.md`),c=await RS.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Ap=y(()=>{"use strict";Se();he();jr();Dr();Rr();Mr();_();Un();l(OS,"getProjectDataPath");l(Ip,"createRoutes")});import js from"node:fs/promises";import FS from"node:path";import{Hono as _S}from"hono";function qo(r){return $.getDoc(r,"project")}async function wc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function jp(){let r=new _S;return r.get("/projects",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await wc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await wc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ye.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Pe.read(c),m=await Ye.read(c),p=await pt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await js.mkdir(Ds,{recursive:!0});let s=(await js.readdir(Ds,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await wc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var NS,Ds,Dp=y(()=>{"use strict";Se();he();jr();Dr();Rr();Mr();NS=I.getGlobalBasePath(),Ds=FS.join(NS,"projects");l(qo,"getProjectConfig");l(wc,"calculateDuration");l(jp,"createExtendedRoutes")});import{streamSSE as LS}from"hono/streaming";function $p(){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()>Rp&&t(i)},HS),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 LS(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)}},US),p=setTimeout(()=>{t(a)},Rp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Rp,HS,US,Mp=y(()=>{"use strict";ac();Rp=3600*1e3,HS=300*1e3,US=3e4;l($p,"createSSEManager")});var Op={};fe(Op,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>BS});import{Hono as GS}from"hono";import{cors as zS}from"hono/cors";import{logger as WS}from"hono/logger";function Ko(r){let e=new GS,t=$p();r.enableCors!==!1&&e.use("*",zS({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",WS()),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=Ip(r.projectId,r.projectPath);e.route("/api",n);let s=jp();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(Tr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Tr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function BS(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,kc=y(()=>{"use strict";qa();Ap();Dp();Mp();l(Ko,"createServer");Yo=3478;l(BS,"startServer")});import zn from"chalk";var Fp,VS,JS,Ut,_p=y(()=>{"use strict";Be();Fp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],VS=80,JS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Fp,speed:VS},cli:{header:l(()=>`${zn.cyan.bold("\u26A1")} ${zn.cyan("prjct")}`,"header"),footer:l(()=>zn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${zn.cyan("\u26A1")} ${zn.cyan("prjct")} ${zn.cyan(Fp[r%10])} ${zn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},Ut=JS});function Wn(r,e){return{...Ts[r],...e}}function Or(r,e,t){return{message:r,hint:e,...t}}var Fr=y(()=>{"use strict";Ho();Ho();l(Wn,"getError");l(Or,"createError")});var Lp={};fe(Lp,{ERRORS:()=>Ts,ICONS:()=>xn,OUTPUT_TIERS:()=>Np,createError:()=>Or,default:()=>h,formatForHuman:()=>QS,getError:()=>Wn,getOutputTier:()=>KS,getTierConfig:()=>Qo,isQuietMode:()=>XS,limitLines:()=>Xo,setOutputTier:()=>qS,setQuietMode:()=>YS});import te from"chalk";function qS(r){$s=r}function KS(){return $s}function Qo(){return Np[$s]}function YS(r){ct=r}function XS(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
263
265
|
`);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
|
|
264
266
|
`)}
|
|
265
|
-
${te.dim(`...${o} more lines`)}`}function
|
|
267
|
+
${te.dim(`...${o} more lines`)}`}function QS(r){let e=Qo();if($s==="silent")return"";if($s==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&$s==="compact"&&o.push(te.dim(String(t.url))),Xo(o.join(`
|
|
266
268
|
`),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(te.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
267
269
|
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?Xo(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
268
|
-
`),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var
|
|
269
|
-
`),this))},done(r,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${
|
|
270
|
+
`),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var PR,Sc,Np,$s,xn,Rs,bc,ct,Et,ZS,eb,h,Gt=y(()=>{"use strict";_p();un();Fr();Fr();PR=Ut.spinner.frames,Sc=Ut.spinner.speed,Np={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}},$s="compact";l(qS,"setOutputTier");l(KS,"getOutputTier");l(Qo,"getTierConfig");xn={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")},Rs=null,bc=0,ct=!1;l(YS,"setQuietMode");l(XS,"isQuietMode");Et=l((r,e)=>{let t=e??(Qo().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Xo,"limitLines");l(QS,"formatForHuman");ZS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),eb={start(){return ct||console.log(Ut.cli.header()),this},end(){return ct||console.log(Ut.cli.footer()),this},spin(r){return ct?this:(this.stop(),process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,Et(r,Tt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
|
|
271
|
+
`),this))},done(r,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${xn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${xn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Wn(r):r;return console.error(),console.error(`${xn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ct||console.log(`${xn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),ct||console.log(`${xn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${xn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ct)return this;let t=e.bullet||xn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ct||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(te.dim(s)),console.log(te.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),ct)return this;let t=e.split(`
|
|
270
272
|
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ct?this:(console.log(`
|
|
271
|
-
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return
|
|
272
|
-
`),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(
|
|
273
|
-
`),this)}},h=Qk});var Wp={};ge(Wp,{default:()=>eb,sessionTracker:()=>vn});var Zk,Gp,zp,bc,vn,eb,Zo=y(()=>{"use strict";he();le();Zk=1800*1e3,Gp=50,zp=200,bc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Zk}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Gp&&(s.current.commands=s.current.commands.slice(-Gp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>zp&&(s.current.files=s.current.files.slice(-zp)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Cr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Cr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},vn=new bc,eb=vn});var Vp={};ge(Vp,{default:()=>zn,performanceTracker:()=>Bp});var Cc,Bp,zn,ei=y(()=>{"use strict";he();Cc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Bp=new Cc,zn=Bp});function xc(r){if(Pp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var vc,ti,Wn,Fr,_r,Nr=y(()=>{"use strict";he();Ps();le();vc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(xc,"resolveCanonicalDomains");Wn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Fr=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},_r=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Lr,Pc=y(()=>{"use strict";he();Ps();le();Nr();Lr=class r extends Wn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Uo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Uo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Uo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Bn,Tc=y(()=>{"use strict";Ot();Ps();le();Nr();Bn=class extends Wn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:Se(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=vc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return xc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
274
|
-
Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var
|
|
275
|
-
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await
|
|
276
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
277
|
-
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function
|
|
278
|
-
`)}async function
|
|
273
|
+
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return Rs&&(clearInterval(Rs),Rs=null,ZS()),this},step(r,e,t){if(ct)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
|
|
274
|
+
`),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
275
|
+
`),this)}},h=eb});var Gp={};fe(Gp,{default:()=>nb,sessionTracker:()=>Pn});var tb,Hp,Up,Cc,Pn,nb,Zo=y(()=>{"use strict";he();le();tb=1800*1e3,Hp=50,Up=200,Cc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:tb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Hp&&(s.current.commands=s.current.commands.slice(-Hp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>Up&&(s.current.files=s.current.files.slice(-Up)),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:vr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:vr(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}},Pn=new Cc,nb=Pn});var Wp={};fe(Wp,{default:()=>Bn,performanceTracker:()=>zp});var vc,zp,Bn,ei=y(()=>{"use strict";he();vc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},zp=new vc,Bn=zp});function Pc(r){if(vp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var xc,ti,Vn,_r,Nr,Lr=y(()=>{"use strict";he();Es();le();xc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Pc,"resolveCanonicalDomains");Vn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},_r=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},Nr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Hr,Tc=y(()=>{"use strict";he();Es();le();Lr();Hr=class r extends Vn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Uo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Uo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Uo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Jn,Ec=y(()=>{"use strict";Lt();Es();le();Lr();Jn=class extends Vn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id: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=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=xc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Pc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
276
|
+
Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Ic,sb,Te,Ms=y(()=>{"use strict";Lr();Tc();Ec();Lr();Tc();Ec();Ic=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Jn,this._patternStore=new Hr,this._historyStore=new Nr,this._sessionStore=new _r}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()}},sb=new Ic,Te=sb});import{exec as rb}from"node:child_process";import St from"node:fs/promises";import zt from"node:path";import{promisify as ob}from"node:util";var qn,Ac,ib,qe,Bp=y(()=>{"use strict";_();qn=ob(rb),Ac=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=zt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=zt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=zt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=zt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=zt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=zt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=zt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=zt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=zt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await qn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
|
|
277
|
+
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await St.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await qn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await qn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await qn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await qn('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 qn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await St.access(zt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=zt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await qn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
278
|
+
`).filter(Boolean)}catch{return[]}}},ib=new Ac,qe=ib});import Dc from"node:fs";import ab from"node:fs/promises";import ni from"node:path";function Rc(){if(Vp)return jc;Vp=!0;let r=ni.join(pe,"dist","templates.json");try{let e=Dc.readFileSync(r,"utf-8");return jc=JSON.parse(e),jc}catch{return null}}function lb(r){let e=Kn.indexOf(r);e>-1&&Kn.splice(e,1),Kn.push(r)}function ub(){for(;Os.size>=cb&&Kn.length>0;){let r=Kn.shift();r&&Os.delete(r)}}function si(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
|
|
279
|
+
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Jp(r){if(Os.has(r))return lb(r),Os.get(r);let e,t=Rc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ni.join(pe,"templates","commands",`${r}.md`);try{e=await ab.readFile(s,"utf-8")}catch{throw Po.notFound(r)}}let n=si(e);return ub(),Os.set(r,n),Kn.push(r),n}async function db(r){return(await Jp(r)).frontmatter["allowed-tools"]||[]}function pb(){Os.clear(),Kn.length=0}function ye(r){let e=Rc();if(e?.[r])return e[r];let t=ni.join(pe,"templates",r);try{return Dc.readFileSync(t,"utf-8")}catch{return null}}function Tn(r){let e=Rc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ni.join(pe,"templates",r);try{return Dc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var cb,Os,Kn,jc,Vp,mb,$c,En=y(()=>{"use strict";ln();dt();cb=50,Os=new Map,Kn=[],jc=null,Vp=!1;l(Rc,"loadBundle");l(lb,"updateLruOrder");l(ub,"evictLru");l(si,"parseFrontmatter");l(Jp,"load");l(db,"getAllowedTools");l(pb,"clearCache");l(ye,"getTemplateContent");l(Tn,"listTemplates");mb={load:Jp,parseFrontmatter:si,getAllowedTools:db,clearCache:pb,getTemplateContent:ye,listTemplates:Tn},$c=mb});import X from"node:fs/promises";import Oc from"node:os";import ee from"node:path";async function gb(){try{let r=ye("global/modules/module-config.json");if(r)return JSON.parse(r);let e=ee.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function fb(r){let e=await gb();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=ee.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=ee.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ee.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
|
|
280
|
+
`)}async function hb(){try{let r=ee.join(Oc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Tn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ee.basename(s);await X.writeFile(ee.join(r,i),o,"utf-8")}}return{success:!0}}let t=ee.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=ee.join(t,s),i=ee.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function yb(){let r=(Be(),xt(ut)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await X.mkdir(e.configDir,{recursive:!0});let s=ee.join(e.configDir,e.contextFile),o=ee.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await fb()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ee.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ee.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
279
281
|
|
|
280
|
-
${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function
|
|
282
|
+
${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function qp(){let r=Oc.homedir();return{claude:{commands:ee.join(r,".claude","commands","p"),config:ee.join(r,".claude"),router:ee.join(r,".claude","commands","p.md")},gemini:{commands:ee.join(r,".gemini","commands"),config:ee.join(r,".gemini"),router:ee.join(r,".gemini","commands","p.toml")}}}var Mc,wb,Ee,In=y(()=>{"use strict";En();_();dt();l(gb,"loadModuleConfig");l(fb,"composeGlobalTemplate");l(hb,"installDocs");l(yb,"installGlobalConfig");Mc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Oc.homedir(),this.templatesDir=ee.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=ee.join(t.configDir,"commands"):this.claudeCommandsPath=ee.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Tn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Be(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=ee.join(this.claudeCommandsPath,a),u=ye(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=ee.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=ee.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ye(`commands/${e}.md`))return!0;try{let n=ee.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Be(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=ee.join(t.configDir,"commands",n);await X.mkdir(ee.dirname(s),{recursive:!0});let o=ye(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=ee.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Be(),xt(ut)).getActiveProvider(),n=ee.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ee.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ee.join(this.claudeCommandsPath,o),a=n.includes(o),c=ye(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=ee.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return yb()}async installDocs(){return hb()}};l(qp,"getProviderPaths");wb=new Mc,Ee=wb});import{z as Fe}from"zod";function Qp(r,e="default"){let t=Kp[e]||Kp.default;return r/1e3*t}function ri(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var kb,Sb,Yp,Xp,Kp,oi=y(()=>{"use strict";kb=Fe.object({date:Fe.string(),tokensSaved:Fe.number(),syncs:Fe.number(),avgCompressionRate:Fe.number(),totalDuration:Fe.number()}),Sb=Fe.object({agentName:Fe.string(),usageCount:Fe.number(),tokensSaved:Fe.number()}),Yp=Fe.object({totalTokensSaved:Fe.number(),avgCompressionRate:Fe.number(),syncCount:Fe.number(),watchTriggers:Fe.number(),avgSyncDuration:Fe.number(),totalSyncDuration:Fe.number(),agentUsage:Fe.array(Sb),dailyStats:Fe.array(kb),firstSync:Fe.string(),lastUpdated:Fe.string()}),Xp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Kp={"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(Qp,"estimateCostSaved");l(ri,"formatCost")});function bb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Cb(r){let e=[],t=bb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Fc,o+i.length);if(c===-1)continue;let u=c+Fc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function _c(r,e){let t=Cb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
281
283
|
|
|
282
284
|
---
|
|
283
285
|
|
|
@@ -288,9 +290,9 @@ ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
|
|
|
288
290
|
`;for(let s of t)n+=s.content,n+=`
|
|
289
291
|
|
|
290
292
|
`;return`${n.trimEnd()}
|
|
291
|
-
`}function
|
|
292
|
-
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(
|
|
293
|
-
`;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},
|
|
293
|
+
`}function Nc(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
|
|
294
|
+
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Fc)&&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 Fc,Lc=y(()=>{"use strict";Fc="<!-- /prjct:preserve -->";l(bb,"createPreserveStartRegex");l(Cb,"extractPreservedSections");l(_c,"mergePreservedSections");l(Nc,"validatePreserveBlocks")});function Ur(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&vb.has(e.code))return!0;if(e.code&&em.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function ai(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&em.has(e.code))}function Zp(r,e,t){let n=An.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(An.delete(r),!1):!0:!1}function Hc(r,e){let t=An.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),An.set(r,t)}function xb(r){An.delete(r)}var vb,em,An,ii,tm,Gr,ci=y(()=>{"use strict";vb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),em=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Ur,"isTransientError");l(ai,"isPermanentError");An=new Map;l(Zp,"isCircuitOpen");l(Hc,"recordFailure");l(xb,"recordSuccess");ii=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(Zp(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 xb(t),o}catch(o){if(n=o,s++,ai(o))throw Hc(t,this.options.circuitBreakerThreshold),o;if(!(Ur(o)&&s<this.options.maxAttempts))throw Hc(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 Hc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Ur(e)}isCircuitOpen(e){return Zp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return An.get(e)}resetCircuit(e){An.delete(e)}resetAllCircuits(){An.clear()}},tm=new ii({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Gr=new ii({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var nm=y(()=>{"use strict";Lc();ci()});import li from"node:fs/promises";import Uc from"node:path";var Gc,sm,rm=y(()=>{"use strict";Ve();Se();_();Gc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=I.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await li.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await li.readFile(Uc.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Uc.join(this.agentsPath,`${e}.md`),n=await li.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Uc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
|
|
295
|
+
`;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},sm=Gc});import om from"node:path";async function Eb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(om.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(om.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Ib(){return{...Pb}}function Ab(){return{...Tb}}async function im(){return ui||(ui=await Eb()?Ib():Ab(),ui)}var ui,Pb,Tb,am=y(()=>{"use strict";xe();ui=null,Pb={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}},Tb={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(Eb,"isClaudeEnvironment");l(Ib,"getClaudeAgent");l(Ab,"getTerminalAgent");l(im,"detect")});var Db,zc=y(()=>{Db=ld({})});var Rb,di,Fs,cm=y(()=>{"use strict";rm();ln();am();ci();zc();Rb=["claude"],di=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new sm}async initialize(){return this.agent?this.agent:await tm.execute(async()=>{if(this.agentInfo=await im(),!this.agentInfo?.isSupported)throw Cr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Rb.includes(e))throw Cr.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Db(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
|
|
294
296
|
AGENTIC EXECUTION:
|
|
295
297
|
- Read: templates/agentic/orchestrator.md
|
|
296
298
|
- Analyze task: "${e}"
|
|
@@ -298,9 +300,9 @@ ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
|
|
|
298
300
|
- Claude decides which agent(s) to use
|
|
299
301
|
- Always prefer specialists over generalist
|
|
300
302
|
- Fragment complex tasks into subtasks
|
|
301
|
-
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Os=new di});var pi,mi,dm=y(()=>{"use strict";pi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},mi=new pi});import Db from"node:crypto";import gi from"node:fs/promises";import pm from"node:path";function mm(){return{version:Ht,lastUpdated:"",checksums:{}}}var Ht,zc,Xe,Gr=y(()=>{"use strict";Ce();_();le();he();Ht="1.0.0";l(mm,"getDefaultChecksums");zc=class{static{l(this,"IndexStorage")}getIndexPath(e){return pm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Ht?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return mm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Db.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Ht,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.unlink(pm.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Ht?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Ht?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Xe=new zc});var gm,Rb,fi,$b,fm=y(()=>{"use strict";Gr();gm=8e4,Rb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},fi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||gm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,S=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||S.length>=s)break;S.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Rb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Xe.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||gm,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},$b=new fi});import hm from"node:path";var Wc,hi,Mb,ym=y(()=>{"use strict";Gr();le();Wc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],hi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Wc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=hm.dirname(i.path);n.get(u).add(`**/${hm.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Wc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Wc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Ht,projectId:e,domains:t,discoveredAt:s};await Xe.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Ht,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Xe.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Xe.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Ht,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Mb=new hi});import Bc from"node:path";var Vc,Ob,Fb,yi,wm,Jc=y(()=>{"use strict";Vc=30,Ob=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Fb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],yi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=Vc){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=Bc.basename(e.path);for(let n of Ob)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Bc.basename(e.path);for(let s of Fb)if(s.test(t))return 15;let n=Bc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},wm=new yi});import{execSync as qc}from"node:child_process";var wi,Kc,Si,Fs,ki=y(()=>{"use strict";Or();wi={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Kc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=wi[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Si(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
302
|
-
`);throw new
|
|
303
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Mr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Mr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Si=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Fs=new Kc});import{exec as _b}from"node:child_process";import{promisify as Nb}from"node:util";var CM,Sm=y(()=>{"use strict";ln();ki();CM=Nb(_b)});var bi,mt,Yc=y(()=>{"use strict";Ve();bn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Xt.MEMORY_MAX_ENTRIES)return 0;let s=n-Xt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);St.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new bi});var km=y(()=>{"use strict";Ce();xe()});import{exec as Hb}from"node:child_process";import{promisify as Ub}from"node:util";var NM,bm=y(()=>{"use strict";Gr();le();Jc();NM=Ub(Hb)});import{createHash as Gb}from"node:crypto";var Xc,Zt,Ci=y(()=>{"use strict";Ya();le();Qt();Xc=class extends ze{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ka.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ka.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Gd(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Gb("sha256").update(JSON.stringify(t)).digest("hex")}},Zt=new Xc});var Qc,un,zr=y(()=>{"use strict";oi();le();Qt();Qc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],S=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:S,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:em(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},un=new Qc});import lt from"node:fs/promises";import de from"node:path";async function Wr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await zb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of tl){let u=de.join(s,a),d=await Kn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Cm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of el){let u=de.join(o,a),d=await Kn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),vm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Xb(r,o,t),await Qb(r,o,t),await Zb(r,i,t),await eC(r,i,t),t.errors.length===0&&await tC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function zb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await Zc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Zc(e,de.join(n,"index")),await Zc(t,de.join(n,"memory")),n}async function Zc(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Cm(r,e,t){switch(e){case"state":Wb(r,t);break;case"queue":Bb(r,t);break;case"ideas":Vb(r,t);break;case"shipped":Jb(r,t);break;case"metrics":qb(r,t);break;case"analysis":Kb(r,t);break}}function Wb(r,e){let t=$.getDb(r),n=t.prepare(`
|
|
303
|
+
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Fs=new di});var pi,mi,lm=y(()=>{"use strict";pi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},mi=new pi});import $b from"node:crypto";import gi from"node:fs/promises";import um from"node:path";function dm(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,Wc,Xe,zr=y(()=>{"use strict";Se();_();le();he();Wt="1.0.0";l(dm,"getDefaultChecksums");Wc=class{static{l(this,"IndexStorage")}getIndexPath(e){return um.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return dm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return $b.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:Wt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.unlink(um.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Xe=new Wc});var pm,Mb,fi,Ob,mm=y(()=>{"use strict";zr();pm=8e4,Mb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},fi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||pm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,k=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||k.length>=s)break;k.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Mb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Xe.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||pm,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)}},Ob=new fi});import gm from"node:path";var Bc,hi,Fb,fm=y(()=>{"use strict";zr();le();Bc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],hi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Bc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=gm.dirname(i.path);n.get(u).add(`**/${gm.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=Bc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Bc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Wt,projectId:e,domains:t,discoveredAt:s};await Xe.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Wt,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Xe.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Xe.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Wt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Fb=new hi});import Vc from"node:path";var Jc,_b,Nb,yi,hm,qc=y(()=>{"use strict";Jc=30,_b=[/^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$/],Nb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],yi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=Jc){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=Vc.basename(e.path);for(let n of _b)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Vc.basename(e.path);for(let s of Nb)if(s.test(t))return 15;let n=Vc.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}},hm=new yi});import{execSync as Kc}from"node:child_process";var wi,Yc,ki,_s,Si=y(()=>{"use strict";Fr();wi={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Yc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=wi[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new ki(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
304
|
+
`);throw new ki({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
305
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Kc(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:Or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Kc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Kc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},ki=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},_s=new Yc});import{exec as Lb}from"node:child_process";import{promisify as Hb}from"node:util";var RM,ym=y(()=>{"use strict";un();Si();RM=Hb(Lb)});var bi,mt,Xc=y(()=>{"use strict";Ve();vn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let s=n-Zt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);kt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new bi});var wm=y(()=>{"use strict";Se();xe()});import{exec as Gb}from"node:child_process";import{promisify as zb}from"node:util";var qM,km=y(()=>{"use strict";zr();le();qc();qM=zb(Gb)});import{createHash as Wb}from"node:crypto";var Qc,It,Ci=y(()=>{"use strict";Xa();le();en();Qc=class extends ze{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ya.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ya.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Hd(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 Wb("sha256").update(JSON.stringify(t)).digest("hex")}},It=new Qc});var Zc,dn,Wr=y(()=>{"use strict";oi();le();en();Zc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Yp)}getDefault(){return{...Xp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Qp(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)}},dn=new Zc});import lt from"node:fs/promises";import de from"node:path";async function Br(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=I.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await Bb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of nl){let u=de.join(s,a),d=await Yn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Sm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of tl){let u=de.join(o,a),d=await Yn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),bm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Zb(r,o,t),await eC(r,o,t),await tC(r,i,t),await nC(r,i,t),t.errors.length===0&&await sC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function Bb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await el(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await el(e,de.join(n,"index")),await el(t,de.join(n,"memory")),n}async function el(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Sm(r,e,t){switch(e){case"state":Vb(r,t);break;case"queue":Jb(r,t);break;case"ideas":qb(r,t);break;case"shipped":Kb(r,t);break;case"metrics":Yb(r,t);break;case"analysis":Xb(r,t);break}}function Vb(r,e){let t=$.getDb(r),n=t.prepare(`
|
|
304
306
|
INSERT OR REPLACE INTO tasks
|
|
305
307
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
306
308
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -311,77 +313,79 @@ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return
|
|
|
311
313
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
312
314
|
depends_on, started_at, completed_at, output, summary)
|
|
313
315
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
314
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function
|
|
316
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];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 Jb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
315
317
|
INSERT OR REPLACE INTO queue_tasks
|
|
316
318
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
317
319
|
feature_id, feature_name)
|
|
318
320
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
319
|
-
`);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function
|
|
321
|
+
`);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 qb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
320
322
|
INSERT OR REPLACE INTO ideas
|
|
321
323
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
322
324
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
323
|
-
`);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function
|
|
325
|
+
`);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 Kb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
324
326
|
INSERT OR REPLACE INTO shipped_features
|
|
325
327
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
326
328
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
327
|
-
`);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function
|
|
329
|
+
`);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 Yb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
328
330
|
INSERT OR REPLACE INTO metrics_daily
|
|
329
331
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
330
332
|
VALUES (?, ?, ?, ?, ?)
|
|
331
|
-
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function
|
|
333
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Xb(r,e){let n=$.getDb(r).prepare(`
|
|
332
334
|
INSERT OR REPLACE INTO analysis
|
|
333
335
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
334
336
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
335
|
-
`),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function
|
|
337
|
+
`),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 bm(r,e,t){e==="categories-cache"&&Qb(r,t)}function Qb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
336
338
|
INSERT OR REPLACE INTO index_files
|
|
337
339
|
(path, categories, domain, score, size, mtime, language)
|
|
338
340
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
339
|
-
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function
|
|
341
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Zb(r,e,t){let n=de.join(e,"checksums.json"),s=await Yn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function eC(r,e,t){let n=de.join(e,"file-scores.json"),s=await Yn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
|
|
340
342
|
INSERT OR REPLACE INTO index_files
|
|
341
343
|
(path, score, size, mtime, language, categories, domain)
|
|
342
344
|
VALUES (?, ?, ?, ?, NULL,
|
|
343
345
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
344
346
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
345
|
-
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function
|
|
346
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function
|
|
347
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function
|
|
348
|
-
`).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let
|
|
349
|
-
${e}`}function
|
|
350
|
-
`)}function
|
|
351
|
-
${e.join(" | ")}`:"";return
|
|
347
|
+
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function tC(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
348
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function nC(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
349
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function sC(r,e,t,n){let s=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of nl)await s(de.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Yn(r){try{let e=await lt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=I.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of nl){let m=de.join(t,u),p=await Yn(m);if(p!==null){$.setDoc(r,d,p),Sm(r,d,p);try{await lt.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Yn(s);if(o!==null){$.setDoc(r,"project",o);try{await lt.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
|
|
350
|
+
`).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,k,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...tl.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Yn(d);if(m===null)continue;let p=tl.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),bm(r,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var nl,tl,xi=y(()=>{"use strict";Se();_();he();nl=[{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"}],tl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Br,"migrateJsonToSqlite");l(Bb,"createBackup");l(el,"copyFiles");l(Sm,"populateNormalized");l(Vb,"populateTasksFromState");l(Jb,"populateQueueTasks");l(qb,"populateIdeas");l(Kb,"populateShippedFeatures");l(Yb,"populateMetricsDaily");l(Xb,"populateAnalysis");l(bm,"populateIndexTables");l(Qb,"populateCategoriesIndex");l(Zb,"migrateChecksums");l(eC,"migrateFileScores");l(tC,"migrateEventsJsonl");l(nC,"migrateLearningsJsonl");l(sC,"cleanupJsonFiles");l(Yn,"readJsonSafe");l(vi,"sweepLegacyJson")});var Cm=y(()=>{"use strict";dc();_()});var sl,rl,ol=y(()=>{"use strict";Ps();en();sl=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:wp,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}},rl=new sl});var Bt=y(()=>{"use strict";Ci();vn();he();jr();zr();Wr();xi();Dr();Rr();Mr();Cm();en();ol()});function st(r,e,t=2){return`${r}
|
|
351
|
+
${e}`}function At(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
352
|
+
`)}function il(r){let e=[];r.branch&&e.push(`Branch: ${r.branch}`),r.linearId&&e.push(`Linear: ${r.linearId}`),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
|
|
353
|
+
${e.join(" | ")}`:"";return`Task: ${r.description}${t}`}function vm(r,e){return`Subtasks
|
|
352
354
|
${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
|
|
353
|
-
`)}`}function
|
|
354
|
-
${
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
355
|
+
`)}`}function xm(r){return r.length===0?"":`Relevant files
|
|
356
|
+
${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- ${t.path}${n}${s}`}).join(`
|
|
357
|
+
`)}`}function Pm(r){return`Rules
|
|
358
|
+
${At(r)}`}function Qe(r){return`Next
|
|
359
|
+
${r.map(t=>`- ${t.label}: ${t.command}`).join(`
|
|
360
|
+
`)}`}function jt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- ${t}: ${n}`);return e.join(`
|
|
361
|
+
`)}function tn(r,e){return e?`${r}
|
|
362
|
+
${e}`:r}function Tm(r){return`> \u26A0\uFE0F ${r}`}function Ie(...r){return r.filter(Boolean).join(`
|
|
363
|
+
|
|
364
|
+
`)}function pn(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ns=y(()=>{"use strict";l(st,"mdSection");l(At,"mdList");l(il,"mdTaskHeader");l(vm,"mdSubtasks");l(xm,"mdRelevantFiles");l(Pm,"mdRules");l(Qe,"mdNextSteps");l(jt,"mdStats");l(tn,"mdDone");l(Tm,"mdWarn");l(Ie,"mdJoin");l(pn,"mdActionRequired")});import Vr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Im[r]||"idle",n=Gn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Em[o]||o}));console.log(Vr.dim(`
|
|
365
|
+
Next:`));for(let o of s){let i=Vr.cyan(o.cmd.padEnd(12));console.log(Vr.dim(` ${i} \u2192 ${o.desc}`))}}function Pi(r){let e=Im[r]||"idle";return Gn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Em[n]||n}))}function Jr(r){let e=Gn.getStateInfo(r);console.log(Vr.dim(`\u{1F4CD} State: ${Vr.white(r.toUpperCase())} - ${e.description}`))}var Em,Im,Ls=y(()=>{"use strict";hc();Em={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"},Im={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(Pi,"getNextSteps");l(Jr,"showStateInfo")});import Dt from"chalk";import Xn from"prompts";var al,Am,Hs,jm=y(()=>{"use strict";Gt();al=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Am=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"}],Hs=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e,Xn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Xn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:al.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:al.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Xn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Am.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(Dt.dim(`
|
|
362
366
|
Detected: ${e}
|
|
363
|
-
`));let t=await
|
|
367
|
+
`));let t=await Xn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Xn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Xn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(Dt.bold(" Configuration Summary")),console.log(Dt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${Dt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${Dt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${Dt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${Dt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${Dt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Xn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(Dt.bold.cyan(" Welcome to prjct-cli!")),console.log(Dt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(Dt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(Dt.yellow(`
|
|
364
368
|
Setup cancelled. Run again anytime.
|
|
365
|
-
`))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return
|
|
366
|
-
`).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},rC=new Ti,gt=rC});var Ei,oC,ll,jm=y(()=>{"use strict";Xn();Ei=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),D=this.parseDuration(S.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},oC=new Ei,ll=oC});var Jr,Ii,ul,dl=y(()=>{"use strict";Ps();le();Jr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Jr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
367
|
-
`)}},ul=new Ii});var Ai,
|
|
369
|
+
`))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Am.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import cl from"node:path";var rC,oC,Ti,iC,gt,Qn=y(()=>{"use strict";Se();Lt();xe();rC="outcomes",oC="outcomes.jsonl",Ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=I.getGlobalProjectPath(e);return cl.join(t,rC)}getOutcomesPath(e){return cl.join(this.getOutcomesDir(e),oC)}async record(e,t){let n={...t,id:me()},s=this.getOutcomesPath(e);return await Nt(cl.dirname(s)),await Aa(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await ys(t);return n.trim()?n.trim().split(`
|
|
370
|
+
`).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}},iC=new Ti,gt=iC});var Ei,aC,ll,Dm=y(()=>{"use strict";Qn();Ei=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},aC=new Ei,ll=aC});var qr,Ii,ul,dl=y(()=>{"use strict";Es();le();qr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){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}/${qr} 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>=qr){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}/${qr} 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>=qr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
371
|
+
`)}},ul=new Ii});var Ai,Rm,pl=y(()=>{"use strict";nc();en();le();Ai=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...ep,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Fo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Fo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Fo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=tp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=np(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:sp(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}},Rm=new Ai});var ml=y(()=>{"use strict";jm();Dm();dl();Qn();pl()});import nn from"chalk";function cC(r){return $m[r.toLowerCase()]||$m.default}var $m,gl,ji,Mm=y(()=>{"use strict";$m={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(cC,"getIcon");gl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
|
|
368
372
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
369
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
370
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
371
|
-
`)}function
|
|
372
|
-
`)}var
|
|
373
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=cC(t);console.log(nn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(nn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(nn.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?nn.green("\u2713"):nn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${nn.dim(`(${n})`)}
|
|
374
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${nn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(nn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ji=new gl});import Ze from"chalk";function lC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Om.length;return Om[t]}function uC(r,e,t="\u25B6"){let n=Ze.dim(String(r+1).padStart(2)),o=lC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function dC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(uC(t,r[t]));return e.push(""),e.join(`
|
|
375
|
+
`)}function Fm(r){console.log(dC(r))}var Om,_m=y(()=>{"use strict";Om=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(lC,"getDomainColor");l(uC,"formatSubtaskLine");l(dC,"renderSubtaskProgress");l(Fm,"printSubtaskProgress")});function pC(r){return Nm.includes(r)}async function mC(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 gC(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(`
|
|
376
|
+
`)}var Nm,fC,Di,Lm=y(()=>{"use strict";Nm=["ship","feature","spec","cleanup","migrate"];l(pC,"requiresReasoning");l(mC,"reason");l(gC,"formatPlan");fC={requiresReasoning:pC,reason:mC,formatPlan:gC,REASONING_REQUIRED_COMMANDS:Nm},Di=fC});import Kr from"node:fs/promises";var fl,hC,ft,hl=y(()=>{"use strict";Ve();Se();_();Jo();fl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ht({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=I.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:I.getFilePath(n,"core","now.md"),next:I.getFilePath(n,"core","next.md"),context:I.getFilePath(n,"core","context.md"),shipped:I.getFilePath(n,"progress","shipped.md"),metrics:I.getFilePath(n,"progress","metrics.md"),ideas:I.getFilePath(n,"planning","ideas.md"),roadmap:I.getFilePath(n,"planning","roadmap.md"),specs:I.getFilePath(n,"planning","specs"),memory:I.getFilePath(n,"memory","context.jsonl"),patterns:I.getFilePath(n,"memory","patterns.json"),analysis:I.getFilePath(n,"analysis","repo-summary.md"),codePatterns:I.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 Kr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Kr.readFile(d,"utf-8"),Kr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await Kr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Kr.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},hC=new fl,ft=hC});import{exec as yC}from"node:child_process";import Ae from"node:fs/promises";import Hm from"node:os";import jn from"node:path";import{promisify as wC}from"node:util";function Um(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function yl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function SC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
373
377
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
374
378
|
`}),r.recommendations.length>0&&(e+=`
|
|
375
379
|
Recommendations:
|
|
376
380
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
377
|
-
`})),e}async function
|
|
378
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=En.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${yl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function zm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Bm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=En.join(Lm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Vm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=En.join(Lm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jm(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(En.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(En.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function qm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(r,e,t){let n=Km[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function SC(r,e,t){let n=await Ym(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function kC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var yC,Km,bC,Ri,Xm=y(()=>{"use strict";_();yC=hC(fC);l(Hm,"formatDuration");l(yl,"escapeRegex");l(wC,"formatWarnings");l(Um,"verifyDone");l(Gm,"verifyShip");l(zm,"verifyFeature");l(Wm,"verifyNow");l(Bm,"verifyInit");l(Vm,"verifySync");l(Jm,"verifyAnalyze");l(qm,"verifySpec");Km={done:Um,ship:Gm,feature:zm,now:Wm,init:Bm,sync:Vm,analyze:Jm,spec:qm};l(Ym,"verify");l(SC,"prepareCommand");l(kC,"requiresVerification");bC={verify:Ym,prepareCommand:SC,requiresVerification:kC,verifiers:Km,formatWarnings:wC,formatDuration:Hm,escapeRegex:yl,verifyDone:Um,verifyShip:Gm,verifyFeature:zm,verifyNow:Wm,verifyInit:Bm,verifySync:Vm,verifyAnalyze:Jm,verifySpec:qm},Ri=bC});function vC(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function xC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of CC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:vC(t)};return{detected:!1}}function PC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function TC(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function EC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function IC(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var CC,wl,AC,Hs,Qm=y(()=>{"use strict";CC=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(vC,"getHallucinationSuggestion");l(xC,"detectHallucination");l(PC,"isSimilarError");l(TC,"analyzeErrorPattern");l(EC,"generateEscalationMessage");l(IC,"generateSuggestion");wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>PC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=TC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:EC(e,o,this.maxAttempts),suggestion:IC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return xC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},AC=new wl,Hs=AC});function Sl(r,e){let t=Kr(e),n=jC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function DC(r,e){let t=Kr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function RC(r,e,t){let n=Kr(t),s=Sl(r,t),o=Sl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=kn){let t=Kr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=$C(r,e),s=MC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=_C(o),a=OC(o),c=FC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=NC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function eg(r,e,t=kn){let n=Kr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function $C(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=RC(i,s,e);if(!t.has(a)){let c=Sl(i,e),u=DC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function MC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+LC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function OC(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function FC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function _C(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function NC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function bl(r){if(!r.variance)return 0;let e=kl(r.estimatedDuration),t=kl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function kl(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function tg(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
379
|
-
`)}function
|
|
381
|
+
`})),e}async function Gm(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Um(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ae.access(jn.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function zm(r){let e=[],t=[],n={};try{let{stdout:i}=await kC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
382
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=jn.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${yl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Bm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Vm(r){let e=[],t=[],n={},s=jn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=jn.join(Hm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jm(r){let e=[],t=[],n={},s=jn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=jn.join(Hm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function qm(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(jn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(jn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Km(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Xm(r,e,t){let n=Ym[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function bC(r,e,t){let n=await Xm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function CC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var kC,Ym,vC,Ri,Qm=y(()=>{"use strict";_();kC=wC(yC);l(Um,"formatDuration");l(yl,"escapeRegex");l(SC,"formatWarnings");l(Gm,"verifyDone");l(zm,"verifyShip");l(Wm,"verifyFeature");l(Bm,"verifyNow");l(Vm,"verifyInit");l(Jm,"verifySync");l(qm,"verifyAnalyze");l(Km,"verifySpec");Ym={done:Gm,ship:zm,feature:Wm,now:Bm,init:Vm,sync:Jm,analyze:qm,spec:Km};l(Xm,"verify");l(bC,"prepareCommand");l(CC,"requiresVerification");vC={verify:Xm,prepareCommand:bC,requiresVerification:CC,verifiers:Ym,formatWarnings:SC,formatDuration:Um,escapeRegex:yl,verifyDone:Gm,verifyShip:zm,verifyFeature:Wm,verifyNow:Bm,verifyInit:Vm,verifySync:Jm,verifyAnalyze:qm,verifySpec:Km},Ri=vC});function PC(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 TC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of xC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:PC(t)};return{detected:!1}}function EC(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 IC(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 AC(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 jC(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 xC,wl,DC,Us,Zm=y(()=>{"use strict";xC=[{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(PC,"getHallucinationSuggestion");l(TC,"detectHallucination");l(EC,"isSimilarError");l(IC,"analyzeErrorPattern");l(AC,"generateEscalationMessage");l(jC,"generateSuggestion");wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>EC(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=IC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:AC(e,o,this.maxAttempts),suggestion:jC(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 TC(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}}},DC=new wl,Us=DC});function kl(r,e){let t=Yr(e),n=RC[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 $C(r,e){let t=Yr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function MC(r,e,t){let n=Yr(t),s=kl(r,t),o=kl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=Cn){let t=Yr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=OC(r,e),s=FC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=LC(o),a=_C(o),c=NC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=HC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function tg(r,e,t=Cn){let n=Yr(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 OC(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=MC(i,s,e);if(!t.has(a)){let c=kl(i,e),u=$C(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function FC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+UC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function _C(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 NC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function LC(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 HC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function bl(r){if(!r.variance)return 0;let e=Sl(r.estimatedDuration),t=Sl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Sl(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 ng(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(`
|
|
383
|
+
`)}function UC(r){if(!r.estimatedDuration)return 0;let e=Sl(r.estimatedDuration);if(e<=0)return 0;let t=eg[0],n=Number.POSITIVE_INFINITY;for(let s of eg){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Yr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var RC,eg,Cl=y(()=>{"use strict";Ps();RC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(kl,"getSprintStart");l($C,"getSprintEnd");l(MC,"getSprintNumber");l($i,"calculateVelocity");l(tg,"projectCompletion");l(OC,"bucketBySprint");l(FC,"buildSprintVelocities");l(_C,"detectTrend");l(NC,"calculateOverallAccuracy");l(LC,"calculateAverageVelocity");l(HC,"detectEstimationPatterns");l(bl,"parseVariancePercent");l(Sl,"parseDurationMinutes");l(ng,"formatVelocityContext");eg=[{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(UC,"derivePoints");l(Yr,"resolveConfig")});import{exec as GC}from"node:child_process";import zC from"node:fs/promises";import Mi from"node:path";import{promisify as WC}from"node:util";async function Zn(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=KC(r),c=await YC(e),u=await XC(e),d=[];for(let p of c){if(!i&&ZC(p))continue;let g=QC(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 KC(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 YC(r){let e=[];async function t(n,s=""){try{let o=await zC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mi.join(n,i.name),c=Mi.join(s,i.name);if(i.isDirectory()){if(qC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mi.extname(i.name).toLowerCase();JC.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function XC(r){let e=new Map;try{let{stdout:t}=await BC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
380
384
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
381
385
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
382
386
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
383
387
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
384
|
-
`).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function
|
|
388
|
+
`).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 QC(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(VC))for(let k of f)if(c.includes(k)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Mi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function ZC(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 BC,VC,JC,qC,Oi=y(()=>{"use strict";_();BC=WC(GC),VC={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"]},JC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),qC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Zn,"findRelevantFiles");l(KC,"extractKeywords");l(YC,"getAllCodeFiles");l(XC,"getGitRecency");l(QC,"scoreFile");l(ZC,"isTestFile")});import{exec as ev}from"node:child_process";import{promisify as tv}from"node:util";async function Qr(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await rv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await sv(r,t);return o=o.filter(c=>!ov(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 sv(r,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
385
389
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
386
390
|
NF {
|
|
387
391
|
count[$0]++
|
|
@@ -391,7 +395,7 @@ Recommendations:
|
|
|
391
395
|
for (f in count) print count[f], lastmod[f], f
|
|
392
396
|
}
|
|
393
397
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
394
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),
|
|
398
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function rv(r){let{stdout:e}=await Xr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
395
399
|
`).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
396
400
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
397
401
|
NF {
|
|
@@ -402,10 +406,10 @@ Recommendations:
|
|
|
402
406
|
for (f in count) print count[f], lastmod[f], f
|
|
403
407
|
}
|
|
404
408
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
405
|
-
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),
|
|
406
|
-
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function
|
|
409
|
+
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),O=Math.max(0,1-D/14),F=g/d,J=O*.5+F*.5,ne;x<1?ne="just now":x<24?ne=`${x}h ago`:ne=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(J*100)/100,lastChanged:ne,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function ov(r){let e=r.split("/").pop()||"";for(let t of nv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,nv,vl=y(()=>{"use strict";Xr=tv(ev),nv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(sv,"getHotFilesFromCommits");l(rv,"getBranchOnlyFiles");l(ov,"shouldIgnore")});function Fi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function sg(r,e){let t=iv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Pl(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zr(r,e){let t=Fi(r),n=Fi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=sg(s,av),a=xl.map(c=>({model:c,...sg(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Pl(i.total),byModel:a}}}function es(r){let e=Fi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:xl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function _i(r){if(r.length===0)return es("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=xl.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:n},compression:s,cost:{saved:i,formatted:Pl(i),byModel:o}}}function cv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function lv(r){return`${Math.round(r*100)}%`}var iv,av,xl,eo=y(()=>{"use strict";iv={"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}},av="claude-sonnet-4.5";l(Fi,"countTokens");xl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(sg,"calculateModelCost");l(Pl,"formatCostSaved");l(Zr,"measureCompression");l(es,"noCompression");l(_i,"combineMetrics");l(cv,"formatTokenCount");l(lv,"formatCompressionRate")});import ig from"node:fs/promises";import Dn from"node:path";async function Rn(r,e=process.cwd()){let t=Dn.isAbsolute(r)?r:Dn.join(e,r),n;try{n=await ig.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:es("")};throw u}let s=Dn.extname(r).toLowerCase(),o=ag[s]||"unknown",i=mv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:es(n)};let a=gv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
410
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function Tl(r,e=process.cwd(),t={}){let n=Dn.isAbsolute(r)?r:Dn.join(e,r),s=[];async function o(i){let a=await ig.readdir(i,{withFileTypes:!0});for(let c of a){let u=Dn.join(i,c.name),d=Dn.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=Dn.extname(c.name).toLowerCase();if(ag[m]){let p=await Rn(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function gv(r,e){let t=[],n=r.split(`
|
|
407
411
|
`),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(`
|
|
408
|
-
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:
|
|
412
|
+
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:fv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function fv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ag,rg,uv,dv,pv,og,mv,Ni=y(()=>{"use strict";_();eo();ag={".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"},rg=[{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}],uv=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],dv=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],pv=[{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}],og=[{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}],mv={typescript:rg,javascript:rg,python:uv,go:dv,rust:pv,java:og,csharp:og,php:[],ruby:[],unknown:[]};l(Rn,"extractSignatures");l(Tl,"extractDirectorySignatures");l(gv,"extractFromContent");l(fv,"cleanSignature")});import{createHash as hv}from"node:crypto";import ug from"node:fs/promises";import dg from"node:path";function cg(r){return hv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function lg(r){try{let e=dg.join(r,"storage","classification-cache.json"),t=await ug.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?Qa:(console.warn("[classifier] Failed to load cache:",w(e)),Qa)}}async function El(r,e){try{let t=dg.join(r,"storage","classification-cache.json");await ug.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function wv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>yv?null:n.classification}function kv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Sv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=pg(e),s=tc("classification")||"",o=`Classify this software engineering task into a domain.
|
|
409
413
|
|
|
410
414
|
Task: "${r}"
|
|
411
415
|
|
|
@@ -413,19 +417,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
413
417
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
414
418
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
415
419
|
|
|
416
|
-
${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=
|
|
417
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([
|
|
418
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await
|
|
419
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},
|
|
420
|
-
`);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=
|
|
420
|
+
${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=bn.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 Cv(r,e){let t=pg(e),n=new Map;for(let[p,g]of Object.entries(bv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Ud;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=vv(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 pg(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 vv(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 yv,bv,Il,xv,mg,gg=y(()=>{"use strict";Ir();Oo();_();yv=3600*1e3;l(cg,"hashDescription");l(lg,"loadCache");l(El,"saveCache");l(wv,"lookupCache");l(kv,"lookupPatterns");l(Sv,"classifyWithLLM");bv={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(Cv,"classifyWithHeuristic");l(pg,"buildAvailableDomains");l(vv,"getFilePatterns");Il=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=cg(e),i=await lg(n),a=wv(i,o,t);if(a)return{classification:a,source:"cache"};let c=kv(i,o);if(c)return{classification:c,source:"history"};let u=await Sv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await El(n,i),{classification:u,source:"llm"};let d=Cv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await El(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=cg(e),o=await lg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await El(n,o))}},xv=new Il,mg=xv});import{exec as Pv}from"node:child_process";import to from"node:fs/promises";import Tv from"node:os";import ts from"node:path";import{promisify as Ev}from"node:util";var fg,hg,Al,Iv,Li,jl=y(()=>{"use strict";Cl();Ve();Se();Ps();Bt();Oi();vl();Ni();_();Qn();gg();En();fg=Ev(Pv),hg=["database","backend","frontend","testing","devops"],Al=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=I.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),[m,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),k=null;return f&&e==="task"&&(k=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:k,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Zn(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Rn(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(`
|
|
421
|
+
`);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([fg("git branch --show-current",{cwd:e}),fg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
422
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await It.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=$i(t,Cn);return n.sprints.length===0?null:ng(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ts.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await mg.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=ts.join(e,"agents");return(await to.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),s=ts.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=ts.join(s,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=si(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ts.join(Tv.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=ts.join(t,`${i}.md`),c=ts.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=hg.indexOf(a),d=hg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Iv=new Al,Li=Iv});function Av(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 Dl,jv,_e,yg=y(()=>{"use strict";Lt();le();un();un();l(Av,"generateApprovalPrompt");Dl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return lc.includes(e)}isDestructive(e){return uc.includes(e)}isToolAllowedInPlanning(e){return Go.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Go.includes(n)):t}startPlanning(e,t,n){let s={id:me(),projectId:e,command:t,params:n,status:re.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===re.APPROVED?n.approvedAt=C():t===re.EXECUTING?n.executionStartedAt=C():(t===re.COMPLETED||t===re.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=re.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=re.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!==re.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=re.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=re.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.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!==re.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=re.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=re.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Av(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
423
|
+
`)}_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`}},jv=new Dl,_e=jv});function Dv(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Hi[t]?Hi[t]:Hi[e]?Hi[e]:e}function Ui(r){let e=new Set,t=[];for(let n of r){let s=Dv(n);e.has(s)||(e.add(s),t.push(n))}return t}var Hi,Rl=y(()=>{"use strict";Hi={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(Dv,"normalizeFrameworkName");l(Ui,"deduplicateTechStack")});import{z as Ne}from"zod";function wg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
424
|
+
`);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=Ui(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])=>Rv[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(`
|
|
421
425
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
422
|
-
`)}var
|
|
423
|
-
`,"utf-8"),no=null}function
|
|
424
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
426
|
+
`)}var Y_,Rv,kg=y(()=>{"use strict";Rl();Y_=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),Rv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(wg,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var $v,Sg,bg=y(()=>{"use strict";$v=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Sg=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),$v).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function $l(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Cg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=$l(o,Mv),a=$l(o,Ov),c=$l(o,Fv);return s.some(d=>_v.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 Mv,Ov,Fv,_v,vg=y(()=>{"use strict";Mv=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Ov=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Fv=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],_v=["Write","Edit","Bash"];l($l,"countMatches");l(Cg,"classifyCommand")});import Ml from"node:fs/promises";import Nv from"node:path";async function Pg(){if(no)return no;let r=await Ml.readFile(Ol,"utf-8"),e=JSON.parse(r);return no=Sg.parse(e),no}function Lv(r){return Tg.get(r)}function Hv(r,e){Tg.set(r,e)}function Gv(r,e){let t=r,n=xg.get(t);return n&&Wv(n.entry,e)?(n.count++,n.count>=Uv):(xg.set(t,{entry:e,count:1}),!1)}async function zv(r,e){let t=await Ml.readFile(Ol,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Ml.writeFile(Ol,`${JSON.stringify(n,null,2)}
|
|
427
|
+
`,"utf-8"),no=null}function Wv(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 Eg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Lv(e);if(n)return{entry:n,source:"cache"};if(t){let s=Cg(e,t);return Hv(e,s),Gv(e,s)&&zv(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Ol,no,Tg,xg,Uv,Ig=y(()=>{"use strict";bg();dt();vg();Ol=Nv.join(pe,"core/config/command-context.config.json"),no=null;l(Pg,"loadCommandContextConfig");Tg=new Map;l(Lv,"getCachedClassification");l(Hv,"cacheClassification");xg=new Map,Uv=3;l(Gv,"trackClassification");l(zv,"persistClassification");l(Wv,"isSameEntry");l(Eg,"resolveCommandContextFull")});import Bv from"node:os";import{z as sn}from"zod";function Vv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Jv(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ag(r){let e=r.platform??Bv.platform(),t=r.runtime??Vv(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
428
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Jv(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
425
429
|
`)}
|
|
426
|
-
</env>`}var
|
|
427
|
-
... (truncated to ~${e} tokens)`}function
|
|
428
|
-
`);return
|
|
430
|
+
</env>`}var pN,jg=y(()=>{"use strict";pN=sn.object({projectName:sn.string(),projectPath:sn.string(),isGitRepo:sn.boolean().default(!0),gitBranch:sn.string().optional(),platform:sn.string().optional(),runtime:sn.string().optional(),date:sn.string().optional(),model:sn.string().optional(),provider:sn.string().optional()});l(Vv,"detectRuntime");l(Jv,"normalizePlatform");l(Ag,"buildEnvironmentBlock")});function Rg(r){let e=r.getAllocationFor("injection");return{...zi,totalPrompt:e}}function ns(r,e){let t=e*$g;return r.length<=t?r:`${r.substring(0,t)}
|
|
431
|
+
... (truncated to ~${e} tokens)`}function Dg(r){return Math.ceil(r.length/$g)}function Mg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=qv[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var zi,$g,qv,Gi,Og=y(()=>{"use strict";zi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Rg,"budgetsFromCoordinator");$g=4;l(ns,"truncateToTokenBudget");l(Dg,"estimateTokens");qv={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(Mg,"filterSkillsByDomains");Gi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...zi,...e}}addSection(e,t){let n=ns(e,t),s=Dg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ns(n,o);return this.used+=Dg(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 Fg from"node:fs/promises";import ss from"node:path";var Fl,Kv,_g,Ng=y(()=>{"use strict";Bt();_();xe();dt();ml();kg();Ig();jg();Og();Rl();En();Fl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Fg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Rg(this._coordinator):zi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let n=ss.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=Tn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ss.basename(s,".md");t[i]=o}}}else{let s=ss.join(pe,"templates","checklists");if(await P(s)){let o=(await Fg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=ss.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([L.read(e),Pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await ll.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
|
|
432
|
+
`);return ns(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=ss.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Pg();p=Eg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
429
433
|
`),s.role&&d.push(`Role: ${s.role}
|
|
430
434
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
431
435
|
`),d.push(`
|
|
@@ -434,31 +438,31 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
434
438
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
435
439
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
436
440
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
437
|
-
`);let
|
|
441
|
+
`);let k=t.projectPath;if(k){let S=u?.project?.id?ss.basename(k):ss.basename(k),j=Ag({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
438
442
|
${j}
|
|
439
|
-
`)}if(u){let
|
|
443
|
+
`)}if(u){let S=u.sealedAnalysis;if(d.push(`
|
|
440
444
|
## PROJECT ANALYSIS (Sealed)
|
|
441
445
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
442
446
|
`),d.push(`**Primary Domain**: ${u.primaryDomain}
|
|
443
447
|
`),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
444
|
-
`),
|
|
445
|
-
`),
|
|
446
|
-
`),
|
|
447
|
-
`),
|
|
448
|
-
`),
|
|
449
|
-
`),d.push(`**Files Analyzed**: ${
|
|
450
|
-
`),d.push(`**Analysis Status**: ${
|
|
451
|
-
`),
|
|
448
|
+
`),S){if(S.languages.length>0&&d.push(`**Languages**: ${S.languages.join(", ")}
|
|
449
|
+
`),S.frameworks.length>0&&d.push(`**Frameworks**: ${S.frameworks.join(", ")}
|
|
450
|
+
`),S.packageManager&&d.push(`**Package Manager**: ${S.packageManager}
|
|
451
|
+
`),S.sourceDir&&d.push(`**Source Dir**: ${S.sourceDir}
|
|
452
|
+
`),S.testDir&&d.push(`**Test Dir**: ${S.testDir}
|
|
453
|
+
`),d.push(`**Files Analyzed**: ${S.fileCount}
|
|
454
|
+
`),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
|
|
455
|
+
`),S.patterns.length>0){d.push(`
|
|
452
456
|
### Code Patterns (Follow These)
|
|
453
|
-
`);for(let j of
|
|
454
|
-
`)}if(
|
|
457
|
+
`);for(let j of S.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
458
|
+
`)}if(S.antiPatterns.length>0){d.push(`
|
|
455
459
|
### Anti-Patterns (Avoid These)
|
|
456
|
-
`);for(let j of
|
|
460
|
+
`);for(let j of S.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
457
461
|
`)}}d.push(`
|
|
458
|
-
`)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let
|
|
459
|
-
`),d.push(
|
|
462
|
+
`)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let S=this.extractPatternSummary(D);S&&(d.push(`## CODE PATTERNS
|
|
463
|
+
`),d.push(S),d.push(`
|
|
460
464
|
Full patterns: Read analysis/patterns.md
|
|
461
|
-
`))}let x=n?.analysis||"";if(b&&x&&x.trim()){let
|
|
465
|
+
`))}let x=n?.analysis||"";if(b&&x&&x.trim()){let S=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
|
|
462
466
|
## STACK
|
|
463
467
|
Stack: ${j}
|
|
464
468
|
`),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
@@ -469,18 +473,18 @@ Stack: ${j}
|
|
|
469
473
|
`),j.effort&&d.push(`Effort: ${j.effort}
|
|
470
474
|
`),j.model&&d.push(`Model: ${j.model}
|
|
471
475
|
`),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
|
|
472
|
-
`);let
|
|
473
|
-
${
|
|
476
|
+
`);let Z=ns(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
477
|
+
${Z}
|
|
474
478
|
\`\`\`
|
|
475
479
|
|
|
476
|
-
`)}}let
|
|
480
|
+
`)}}let S=Mg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
477
481
|
|
|
478
|
-
`);for(let j of
|
|
479
|
-
`);let
|
|
480
|
-
${
|
|
482
|
+
`);for(let j of S){d.push(`#### Skill: ${j.name}
|
|
483
|
+
`);let Z=ns(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
484
|
+
${Z}
|
|
481
485
|
\`\`\`
|
|
482
486
|
|
|
483
|
-
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let
|
|
487
|
+
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let j=await this.loadModule(S);j&&(d.push(`
|
|
484
488
|
`),d.push(j))}if(c?.isPlanning&&(d.push(`
|
|
485
489
|
## PLAN MODE
|
|
486
490
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
@@ -488,56 +492,56 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
|
|
|
488
492
|
`)),c?.requiresApproval&&d.push(`
|
|
489
493
|
## APPROVAL REQUIRED
|
|
490
494
|
Show changes, list affected files, ask for confirmation.
|
|
491
|
-
`),
|
|
492
|
-
${
|
|
493
|
-
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let
|
|
495
|
+
`),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Z={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:Ui(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
|
|
496
|
+
${wg(Z)}
|
|
497
|
+
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let S=u.realContext;if(d.push(`
|
|
494
498
|
### CODEBASE CONTEXT
|
|
495
499
|
|
|
496
|
-
`),d.push(`**Git State**: Branch \`${
|
|
500
|
+
`),d.push(`**Git State**: Branch \`${S.gitBranch}\` | ${S.gitStatus}
|
|
497
501
|
|
|
498
|
-
`),
|
|
502
|
+
`),S.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
499
503
|
`),d.push(`| Score | File | Why |
|
|
500
504
|
`),d.push(`|-------|------|-----|
|
|
501
|
-
`);for(let j of
|
|
505
|
+
`);for(let j of S.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
|
|
502
506
|
`);d.push(`
|
|
503
|
-
`)}if(
|
|
504
|
-
`);for(let j of
|
|
507
|
+
`)}if(S.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
508
|
+
`);for(let j of S.signatures)d.push(`\`\`\`typescript
|
|
505
509
|
// ${j.path}
|
|
506
510
|
${j.content}
|
|
507
511
|
\`\`\`
|
|
508
512
|
`);d.push(`
|
|
509
|
-
`)}if(
|
|
513
|
+
`)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let j=S.recentFiles.slice(0,5).map(Z=>`${Z.path} (${Z.lastChanged})`).join(", ");d.push(`${j}
|
|
510
514
|
|
|
511
|
-
`)}}let F=t.files||[];if(F.length>0){let
|
|
512
|
-
## FILES: ${F.length} available. Top: ${
|
|
515
|
+
`)}}let F=t.files||[];if(F.length>0){let S=F.slice(0,5).join(", ");d.push(`
|
|
516
|
+
## FILES: ${F.length} available. Top: ${S}
|
|
513
517
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
514
518
|
|
|
515
|
-
`)}else
|
|
516
|
-
## PROJECT: ${
|
|
519
|
+
`)}else k&&d.push(`
|
|
520
|
+
## PROJECT: ${k}
|
|
517
521
|
Read files before modifying.
|
|
518
522
|
|
|
519
|
-
`);let
|
|
523
|
+
`);let J=this.filterRelevantState(n);if(J&&(d.push(`
|
|
520
524
|
## PRJCT STATE (Project Management Data)
|
|
521
|
-
`),d.push(
|
|
525
|
+
`),d.push(J),d.push(`
|
|
522
526
|
`)),u?.velocityContext&&(d.push(`
|
|
523
527
|
### VELOCITY (Historical Estimation Data)
|
|
524
528
|
|
|
525
529
|
`),d.push(u.velocityContext),d.push(`
|
|
526
530
|
|
|
527
|
-
`)),o&&Object.keys(o).some(
|
|
531
|
+
`)),o&&Object.keys(o).some(S=>o[S])){d.push(`
|
|
528
532
|
## PROJECT DEFAULTS (apply automatically)
|
|
529
|
-
`);for(let[
|
|
533
|
+
`);for(let[S,j]of Object.entries(o))j&&d.push(`- ${S}: ${j}
|
|
530
534
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
531
535
|
## THINK FIRST (reasoning from analysis)
|
|
532
536
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
533
|
-
`);for(let
|
|
537
|
+
`);for(let S of i.conclusions)d.push(` \u2192 ${S}
|
|
534
538
|
`)}d.push(`Plan:
|
|
535
|
-
`);for(let
|
|
539
|
+
`);for(let S=0;S<i.plan.length;S++)d.push(` ${S+1}. ${i.plan[S]}
|
|
536
540
|
`);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
537
541
|
`)}if(a&&a.length>0){d.push(`
|
|
538
542
|
## CONTEXT (apply these)
|
|
539
|
-
`);for(let
|
|
540
|
-
`),
|
|
543
|
+
`);for(let S of a)d.push(`- **${S.title}**: ${S.content}
|
|
544
|
+
`),S.tags&&S.tags.length>0&&d.push(` Tags: ${S.tags.join(", ")}
|
|
541
545
|
`)}if(d.push(`
|
|
542
546
|
---
|
|
543
547
|
`),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
|
|
@@ -545,34 +549,34 @@ Read files before modifying.
|
|
|
545
549
|
|
|
546
550
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
547
551
|
`),d.push(`|---|--------|-------------|--------|
|
|
548
|
-
`);for(let j of u.subtasks){let
|
|
549
|
-
`)}let
|
|
550
|
-
**FOCUS ON SUBTASK #${
|
|
551
|
-
`),d.push(`Agent: ${
|
|
552
|
-
`),
|
|
553
|
-
`),
|
|
552
|
+
`);for(let j of u.subtasks){let Z=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} | ${Z} |
|
|
553
|
+
`)}let S=u.subtasks.find(j=>j.status==="in_progress");if(S&&(d.push(`
|
|
554
|
+
**FOCUS ON SUBTASK #${S.order}**: ${S.description}
|
|
555
|
+
`),d.push(`Agent: ${S.agent} | Domain: ${S.domain}
|
|
556
|
+
`),S.dependsOn.length>0&&d.push(`Dependencies: ${S.dependsOn.join(", ")}
|
|
557
|
+
`),S.handoff)){let j=S.handoff;d.push(`
|
|
554
558
|
### Previous Subtask Handoff
|
|
555
559
|
|
|
556
560
|
`),d.push(`**From:** ${j.fromSubtask}
|
|
557
561
|
|
|
558
562
|
`),d.push(`**What was done:**
|
|
559
|
-
`);for(let
|
|
563
|
+
`);for(let Z of j.whatWasDone)d.push(`- ${Z}
|
|
560
564
|
`);if(j.filesChanged.length>0){d.push(`
|
|
561
565
|
**Files changed:**
|
|
562
|
-
`);for(let
|
|
566
|
+
`);for(let Z of j.filesChanged)d.push(`- \`${Z.path}\` (${Z.action})
|
|
563
567
|
`)}d.push(`
|
|
564
568
|
**Context for this subtask:**
|
|
565
569
|
${j.outputForNextAgent}
|
|
566
570
|
`)}d.push(`
|
|
567
|
-
`)}let
|
|
571
|
+
`)}let ne=this.getSchemaTypeForCommand(m);if(ne){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Oo(),Yd)),j=S(ne);j&&d.push(`
|
|
568
572
|
${j}
|
|
569
|
-
`)}if(p.checklist){let
|
|
573
|
+
`)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
|
|
570
574
|
## QUALITY CHECKLISTS
|
|
571
575
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
572
576
|
`),d.push(`Available: ${Object.keys(j).join(", ")}
|
|
573
577
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
574
578
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
575
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new
|
|
579
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Gi({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}
|
|
576
580
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
577
581
|
|
|
578
582
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -589,7 +593,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
589
593
|
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
590
594
|
Avoid:
|
|
591
595
|
${a}`)}let o=t.join(`
|
|
592
|
-
`);return
|
|
596
|
+
`);return ns(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
593
597
|
## RULES (CRITICAL)
|
|
594
598
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
595
599
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -606,7 +610,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
606
610
|
- Prefer structured output (JSON) over free text when applicable.
|
|
607
611
|
|
|
608
612
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
609
|
-
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},
|
|
613
|
+
`}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}}}},Kv=new Fl,_g=Kv});import Lg from"node:fs/promises";import Rt from"node:path";var Yv,Xv,_l,Nl,Wi,Ll=y(()=>{"use strict";Ve();Se();_();Yv=["task","done","ship","resume","bug","enrich"],Xv=["init","sync","pause","next","dash","history","undo","redo"],_l=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Rt.dirname(yr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=I.getGlobalProjectPath(s),a=await(Be(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Rt.join(u,"templates")}catch{c=Rt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await I.getAgentSettingsPath(),paths:{orchestrator:Rt.join(c,"agentic","orchestrator.md"),agentRouting:Rt.join(c,"agentic","agent-routing.md"),taskFragmentation:Rt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Rt.join(c,"commands",`${e}.md`),repoAnalysis:Rt.join(o,"analysis","repo-analysis.json"),agentsDir:Rt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Rt.join(o,"storage","state.json")}}}requiresOrchestration(e){return Yv.includes(e)?!0:!Xv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Lg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.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:`
|
|
610
614
|
## Agentic Execution Mode
|
|
611
615
|
|
|
612
616
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -689,13 +693,13 @@ When fragmenting tasks:
|
|
|
689
693
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
690
694
|
3. Each completed subtask generates a summary
|
|
691
695
|
4. Pass summary to next agent for context handoff
|
|
692
|
-
`,context:e,requiresOrchestration:t}}},
|
|
693
|
-
`+
|
|
694
|
-
`+
|
|
695
|
-
`+
|
|
696
|
-
`+
|
|
697
|
-
`+
|
|
698
|
-
`}},
|
|
696
|
+
`,context:e,requiresOrchestration:t}}},Nl=new _l,Wi=Nl});import{exec as Qv}from"node:child_process";import Hg from"node:fs/promises";import{promisify as Zv}from"node:util";var ex,rs,Ke,Hl=y(()=>{"use strict";ci();ex=Zv(Qv),rs={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())}};rs.register("Read",async r=>{try{return await Gr.execute(async()=>await Hg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ai(e)||Ur(e),null}});rs.register("Write",async(r,e)=>{try{return await Gr.execute(async()=>await Hg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ai(t)||Ur(t),!1}});rs.register("Bash",async r=>{try{return await Gr.execute(async()=>await ex(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});rs.register("GetTimestamp",async()=>new Date().toISOString());rs.register("GetDate",async()=>new Date().toISOString().split("T")[0]);rs.register("GetDateTime",async()=>new Date().toISOString());Ke=rs});import Ul from"node:fs/promises";import tx from"node:os";import Ug from"node:path";async function nx(r){try{let e=Ug.dirname(Bi);await P(e)||await Ul.mkdir(e,{recursive:!0}),await Ul.writeFile(Bi,`/p:${r}`)}catch{}}async function sx(){try{await P(Bi)&&await Ul.unlink(Bi)}catch{}}var Bi,Gl,rx,Vi,zl=y(()=>{"use strict";_();Mm();xe();_m();Lm();hl();Qm();Zm();Ms();jl();yg();Ng();Ll();En();Hl();Bi=Ug.join(tx.homedir(),".prjct-cli",".running");l(nx,"signalStart");l(sx,"signalEnd");Gl=class{static{l(this,"CommandExecutor")}async signalStart(e){await nx(e)}async signalEnd(){await sx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Us.shouldEscalate(e,s)){let o=Us.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await $c.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Ri.requiresVerification(e)){let S=await ft.loadStateForCommand(i,e);m=await Ri.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Ri.formatWarnings(m))}let p=null;if(Di.requiresReasoning(e)){let S=await ft.loadStateForCommand(i,e);p=await Di.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Di.formatPlan(p)))}let g=t.task||t.description||"",f=await Wi.buildContext(e,g,n),k=Wi.buildAgenticPrompt(f),b=null;if(Wi.requiresOrchestration(e)&&g)try{b=await Li.execute(e,g,n),b.detectedDomains.length>0&&ji.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");ji.startAgent(S.name,j,`Loading ${j} specialist...`),ji.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let S=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Fm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(S)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},x=await ft.loadState(i),O=null,F=null;i.projectId&&(O={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let J={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ne=await _g.build(o,D,x,null,O,null,F,J,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Us.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:ne,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:F,orchestratorContext:b,memory:{create:l(S=>Te.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,Z)=>Te.autoRemember(i.projectId,S,j,Z),"autoRemember"),search:l(S=>Te.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Te.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>_e.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>_e.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>_e.proposePlan(i.projectId,S),"propose"),approve:l(S=>_e.approvePlan(i.projectId,S),"approve"),reject:l(S=>_e.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>_e.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>_e.failStep(i.projectId,S),"failStep"),abort:l(S=>_e.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Us.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Us.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await $c.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},rx=new Gl,Vi=rx});import Ji from"node:fs/promises";import ox from"node:https";import ix from"node:os";import Wl from"node:path";import Jt from"chalk";var Bl,Gg,zg=y(()=>{"use strict";_();xe();Bl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Wl.join(ix.homedir(),".prjct-cli","config"),this.cacheFile=Wl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Wl.join(__dirname,"..","..","package.json");return JSON.parse(await Ji.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=ox.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await Ji.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await Ji.mkdir(this.cacheDir,{recursive:!0}),await Ji.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:`
|
|
697
|
+
`+Jt.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")+`
|
|
698
|
+
`+Jt.yellow("\u2502")+" "+Jt.bold("Update available!")+" "+Jt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Jt.yellow("\u2502")+`
|
|
699
|
+
`+Jt.yellow("\u2502")+" "+Jt.yellow("\u2502")+`
|
|
700
|
+
`+Jt.yellow("\u2502")+" Run: "+Jt.cyan("npm update -g prjct-cli")+" "+Jt.yellow("\u2502")+`
|
|
701
|
+
`+Jt.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")+`
|
|
702
|
+
`}},Gg=Bl});var be,rt=y(()=>{"use strict";zl();hl();Hl();Ve();Se();zg();Mn();le();xe();Gt();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Gg,this.updateNotificationShown=!1,this.commandExecutor=Vi}get agent(){return Fs.getAgent()}get agentInfo(){return Fs.getInfo()}get currentAuthor(){return $n.getCurrentAuthor()}async initializeAgent(){return Fs.initialize()}async ensureProjectInit(e){return $n.ensureInit(e)}async ensureAuthor(){return $n.ensureAuthor()}async getGlobalProjectPath(e){return $n.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return $n.isEmptyDirectory(e)}async _detectExistingCode(e){return $n.hasExistingCode(e)}_breakdownFeatureTasks(e){return mi.breakdownFeature(e)}_detectBugSeverity(e){return mi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Fs.assignForTask(e,t,n)}}});var Wg={};fe(Wg,{PlanningCommands:()=>is});import os from"node:path";async function ax(){if(!Vl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ki(),Bg));Vl=new r}return Vl}var Vl,is,qi=y(()=>{"use strict";Do();In();Lt();Bt();_();Ns();Ls();ml();rt();Vl=null;l(ax,"getAnalysisCommands");is=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Hs(t).runNonInteractive());else if(a=await new Hs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await vs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await I.ensureProjectStructure(m);let p=I.getGlobalProjectPath(m),g={"core/now.md":`# NOW
|
|
699
703
|
|
|
700
704
|
No current task. Use \`/p:now\` to set focus.
|
|
701
705
|
`,"core/next.md":`# NEXT
|
|
@@ -715,7 +719,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
715
719
|
`,"planning/roadmap.md":`# ROADMAP
|
|
716
720
|
|
|
717
721
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
718
|
-
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,x]of Object.entries(g))await Ke.get("Write")(
|
|
722
|
+
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,x]of Object.entries(g))await Ke.get("Write")(os.join(p,D),x);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await ax();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!k){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=os.join(p,"planning","architect-session.md"),x=`# Architect Session
|
|
719
723
|
|
|
720
724
|
## Idea
|
|
721
725
|
${b}
|
|
@@ -724,8 +728,8 @@ ${b}
|
|
|
724
728
|
Initialized - awaiting stack recommendation
|
|
725
729
|
|
|
726
730
|
Generated: ${new Date().toLocaleString()}
|
|
727
|
-
`;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=
|
|
728
|
-
`);let s=await this.getGlobalProjectPath(t),o=
|
|
731
|
+
`;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=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(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Bug Reported",e),jt({Severity:a,Priority:m,Agent:u}),Qe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
732
|
+
`);let s=await this.getGlobalProjectPath(t),o=os.join(s,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
729
733
|
|
|
730
734
|
Create a plan first:
|
|
731
735
|
1. Run /p:init in an empty directory
|
|
@@ -746,7 +750,7 @@ The architect plan is ready. Claude will now:
|
|
|
746
750
|
4. Create starter files with boilerplate
|
|
747
751
|
`),console.log(`
|
|
748
752
|
\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.
|
|
749
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
753
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:W.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=I.getGlobalProjectPath(o),u=os.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
750
754
|
|
|
751
755
|
## Idea
|
|
752
756
|
${e}
|
|
@@ -761,14 +765,14 @@ Initialized - awaiting architecture design
|
|
|
761
765
|
4. Generate roadmap
|
|
762
766
|
|
|
763
767
|
Generated: ${new Date().toLocaleString()}
|
|
764
|
-
`;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:
|
|
768
|
+
`;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),jt({Mode:"architecture"}),Qe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
765
769
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
766
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:
|
|
770
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),jt({Mode:"capture"}),Qe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=I.getGlobalProjectPath(s),m=os.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
767
771
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
768
772
|
`),{success:!0,specs:[]}):(console.log(`
|
|
769
773
|
\u{1F4CB} SPECIFICATIONS
|
|
770
|
-
`),console.log("\u2550".repeat(50)),f.forEach((
|
|
771
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=
|
|
774
|
+
`),console.log("\u2550".repeat(50)),f.forEach((k,b)=>{let D=k.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
|
|
775
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=I.getGlobalProjectPath(s),i=os.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=os.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
772
776
|
|
|
773
777
|
## Overview
|
|
774
778
|
[Brief description of the feature]
|
|
@@ -798,27 +802,27 @@ Generated: ${new Date().toLocaleString()}
|
|
|
798
802
|
---
|
|
799
803
|
Created: ${new Date().toLocaleString()}
|
|
800
804
|
Status: Draft
|
|
801
|
-
`;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:
|
|
805
|
+
`;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:W.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
802
806
|
\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
|
|
803
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var
|
|
807
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Yi,$n,Vg=y(()=>{"use strict";ln();Do();Ve();Se();_();xe();Gt();Yi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(qi(),Wg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw xo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await vs();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 ws(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ws(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},$n=new Yi});import{exec as cx}from"node:child_process";import{promisify as lx}from"node:util";var Jl,ux,Xi,so,Jg=y(()=>{"use strict";he();_();Zo();Jl=lx(cx),ux={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Xi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ux,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await 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(`
|
|
804
808
|
`).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
805
|
-
`)}async getSessionInfo(e){return
|
|
809
|
+
`)}async getSessionInfo(e){return Pn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
806
810
|
`);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(`
|
|
807
|
-
`)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},so=l((r,e)=>new
|
|
808
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
811
|
+
`)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},so=l((r,e)=>new Xi(r,e),"createStalenessChecker")});import qg from"node:fs/promises";import Qi from"node:path";function ro(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function gx(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!px.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function Kg(r,e){let t=[],n=await qg.readdir(r,{withFileTypes:!0});for(let s of n){if(mx.has(s.name))continue;let o=Qi.join(r,s.name);if(s.isDirectory())t.push(...await Kg(o,e));else if(s.isFile()){let i=Qi.extname(s.name).toLowerCase();dx.has(i)&&t.push(Qi.relative(e,o))}}return t}async function fx(r){let e=await Kg(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 qg.readFile(Qi.join(r,d),"utf-8"),p=gx(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 yx(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};V.setDoc(r,hx,t)}async function Yg(r,e){let t=await fx(r);return yx(e,t),t}var dx,px,mx,hx,Xg=y(()=>{"use strict";he();dx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),px=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"]),mx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(gx,"tokenizeFile");l(Kg,"listFiles");l(fx,"buildIndex");hx="bm25-index";l(yx,"saveIndex");l(Yg,"indexProject")});import ql from"node:fs/promises";import mn from"node:path";function Cx(r){let e=[],t,n=new RegExp(bx.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function vx(r,e,t){let n;if(r.startsWith("@/"))n=mn.join(t,"src",r.slice(2));else{let s=mn.dirname(mn.join(t,e));n=mn.resolve(s,r)}for(let s of Sx){let o=n+s;try{if((await ql.stat(o)).isFile())return mn.relative(t,o)}catch{}}return null}async function Qg(r,e){let t=[],n=await ql.readdir(r,{withFileTypes:!0});for(let s of n){if(kx.has(s.name))continue;let o=mn.join(r,s.name);if(s.isDirectory())t.push(...await Qg(o,e));else if(s.isFile()){let i=mn.extname(s.name).toLowerCase();wx.has(i)&&t.push(mn.relative(e,o))}}return t}async function xx(r){let e=await Qg(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 ql.readFile(mn.join(r,u),"utf-8"),m=Cx(d),p=[];for(let g of m){let f=await vx(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 Px(r,e){V.setDoc(r,Zg,e)}function ef(r){return V.getDoc(r,Zg)}async function tf(r,e){let t=await xx(r);return Px(e,t),t}var wx,kx,Sx,bx,Zg,Kl=y(()=>{"use strict";he();wx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),kx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Sx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],bx=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Cx,"extractImportSources");l(vx,"resolveImport");l(Qg,"listFiles");l(xx,"buildGraph");Zg="import-graph";l(Px,"saveGraph");l(ef,"loadGraph");l(tf,"indexImports")});function nf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=ef(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 sf(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 rf=y(()=>{"use strict";Kl();l(nf,"propagateChanges");l(sf,"affectedDomains")});import Yl from"node:fs/promises";import Zi from"node:path";async function of(r,e){let t=[],n=await Yl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Ex.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Zi.join(r,o);if(s.isDirectory())t.push(...await of(i,e));else if(s.isFile()){let a=Zi.extname(o).toLowerCase();Tx.has(a)&&t.push(Zi.relative(e,i))}}return t}function Ix(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 Ax(r){let e=await of(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=Zi.join(r,a),[u,d]=await Promise.all([Yl.readFile(c,"utf-8"),Yl.stat(c)]);return{path:a,hash:Ix(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 jx(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 Xl(r,e){let t=V.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),V.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Dx(r){let e=new Map;try{let t=V.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Ql(r,e){let[t,n]=await Promise.all([Ax(r),Promise.resolve(Dx(e))]);return{diff:jx(t,n),currentHashes:t}}function af(r){return V.hasDoc(r,"file-hashes-meta")}var Tx,Ex,cf=y(()=>{"use strict";he();Tx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Ex=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(of,"listProjectFiles");l(Ix,"hashContent");l(Ax,"computeHashes");l(jx,"diffHashes");l(Xl,"saveHashes");l(Dx,"loadHashes");l(Ql,"detectChanges");l(af,"hasHashRegistry")});import{exec as Rx}from"node:child_process";import{promisify as $x}from"node:util";async function Fx(r,e=100){try{let{stdout:t}=await Mx(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
812
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=uf&&n.push(s),s=new Set):i&&s&&_x(i)&&s.add(i)}return s&&s.size>0&&s.size<=uf&&n.push(s),n}catch{return[]}}function _x(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 Nx(r,e=100){let t=await Fx(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=Lx(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<lf||m<lf)continue;let p=d+m-a,g=p>0?a/p:0;g<Ox||(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 Lx(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Ux(r,e){V.setDoc(r,Hx,e)}async function df(r,e,t=100){let n=await Nx(r,t);return Ux(e,n),n}var Mx,Ox,lf,uf,Hx,pf=y(()=>{"use strict";he();Mx=$x(Rx),Ox=.1,lf=2,uf=30;l(Fx,"parseGitLog");l(_x,"isSourceFile");l(Nx,"buildMatrix");l(Lx,"pairKey");Hx="cochange-index";l(Ux,"saveMatrix");l(df,"indexCoChanges")});function $t(r){return`<!-- source: ${r.file}, ${r.type} -->`}function as(){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 Zl=y(()=>{"use strict";l($t,"cite");l(as,"defaultSources")});function Gx(r,e){let t=r.sources||as();return`# ${r.name} - Project Rules
|
|
809
813
|
<!-- projectId: ${r.projectId} -->
|
|
810
814
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
811
815
|
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
812
816
|
|
|
813
817
|
## THIS PROJECT (${r.ecosystem})
|
|
814
818
|
|
|
815
|
-
${
|
|
819
|
+
${$t(t.ecosystem)}
|
|
816
820
|
**Type:** ${r.projectType}
|
|
817
821
|
**Path:** ${r.repoPath}
|
|
818
822
|
|
|
819
823
|
### Commands (USE THESE, NOT OTHERS)
|
|
820
824
|
|
|
821
|
-
${
|
|
825
|
+
${$t(t.commands)}
|
|
822
826
|
| Action | Command |
|
|
823
827
|
|--------|---------|
|
|
824
828
|
| Install dependencies | \`${r.commands.install}\` |
|
|
@@ -830,9 +834,9 @@ ${jt(t.commands)}
|
|
|
830
834
|
|
|
831
835
|
### Code Conventions
|
|
832
836
|
|
|
833
|
-
${
|
|
837
|
+
${$t(t.languages)}
|
|
834
838
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
835
|
-
${
|
|
839
|
+
${$t(t.frameworks)}
|
|
836
840
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
837
841
|
|
|
838
842
|
---
|
|
@@ -860,7 +864,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
860
864
|
|
|
861
865
|
## PROJECT STATE
|
|
862
866
|
|
|
863
|
-
${
|
|
867
|
+
${$t(t.name)}
|
|
864
868
|
| Field | Value |
|
|
865
869
|
|-------|-------|
|
|
866
870
|
| Name | ${r.name} |
|
|
@@ -878,12 +882,12 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
878
882
|
|
|
879
883
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
880
884
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
881
|
-
`}function
|
|
882
|
-
`)}function
|
|
883
|
-
`)}function
|
|
884
|
-
`)}function
|
|
885
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function
|
|
886
|
-
`)}},
|
|
885
|
+
`}function zx(r,e){let t=r.sources||as(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push($t(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($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
|
|
886
|
+
`)}function Wx(r,e){let t=r.sources||as(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
887
|
+
`)}function Bx(r,e){let t=r.sources||as(),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($t(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
|
|
888
|
+
`)}function Vx(r,e){let n={systemMessage:[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
|
|
889
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function mf(r){return{claude:Gx,cursor:zx,copilot:Wx,windsurf:Bx,continue:Vx}[r]||null}var eu=y(()=>{"use strict";Zl();l(Gx,"formatForClaude");l(zx,"formatForCursor");l(Wx,"formatForCopilot");l(Bx,"formatForWindsurf");l(Vx,"formatForContinue");l(mf,"getFormatter")});import{exec as Jx}from"node:child_process";import qx from"node:os";import oo from"node:path";import{promisify as Kx}from"node:util";function gf(r){return ea[r]||null}async function tu(r){try{return await Yx(`which ${r}`),!0}catch{return!1}}async function ta(r=process.cwd()){let e=[];return await tu("claude")&&e.push("claude"),(await tu("cursor")||await P(oo.join(r,".cursor")))&&e.push("cursor"),await P(oo.join(r,".github"))&&e.push("copilot"),(await tu("windsurf")||await P(oo.join(r,".windsurf")))&&e.push("windsurf"),(await P(oo.join(r,".continue"))||await P(oo.join(qx.homedir(),".continue")))&&e.push("continue"),e}async function ff(r,e=process.cwd()){if(r==="auto"){let t=await ta(e);return t.length>0?t:["claude"]}return r==="all"?Xx:r.filter(t=>ea[t])}var Yx,ea,io,Xx,nu=y(()=>{"use strict";xe();Yx=Kx(Jx),ea={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"}},io=["claude"],Xx=Object.keys(ea);l(gf,"getAIToolConfig");l(tu,"commandExists");l(ta,"detectInstalledTools");l(ff,"resolveToolIds")});import su from"node:fs/promises";import ru from"node:path";async function hf(r,e,t,n=io){let s=[];for(let o of n){let i=gf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Qx(r,i,e,t);s.push(a)}return s}async function Qx(r,e,t,n){let s=mf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=ru.join(n,e.outputFile):i=ru.join(t,"context",e.outputFile),await su.mkdir(ru.dirname(i),{recursive:!0});try{let a=await su.readFile(i,"utf-8"),c=Nc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=_c(o,a)}catch{}return await su.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var yf=y(()=>{"use strict";_();Lc();eu();nu();l(hf,"generateAIToolContexts");l(Qx,"generateForTool")});var wf=y(()=>{"use strict";eu();yf();nu()});import ou from"node:fs/promises";import iu from"node:path";var au,cu,kf,Sf=y(()=>{"use strict";_();au=".prjct-state.md",cu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=iu.join(e,au),s=this.toMarkdown(t);await ou.writeFile(n,s,"utf-8")}async remove(e){let t=iu.join(e,au);try{await ou.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=iu.join(e,au);try{return await ou.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(`
|
|
890
|
+
`)}},kf=new cu});import lu from"node:fs/promises";import Zx from"node:os";import bf from"node:path";function uu(){return bf.join(Zx.homedir(),".prjct-cli","skills",eP)}function tP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ao(){try{let r=await lu.readFile(uu(),"utf-8");return JSON.parse(r)}catch{return tP()}}async function du(r){let e=uu();await lu.mkdir(bf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await lu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function nP(r){let e=await ao();e.skills[r.name]=r,await du(e)}async function sP(r){let e=await ao();return r in e.skills?(delete e.skills[r],await du(e),!0):!1}async function rP(r){return(await ao()).skills[r]||null}async function oP(){return(await ao()).skills}function iP(){return uu()}var eP,co,Cf=y(()=>{"use strict";eP=".skill-lock.json";l(uu,"getLockFilePath");l(tP,"createEmptyLockFile");l(ao,"read");l(du,"write");l(nP,"addEntry");l(sP,"removeEntry");l(rP,"getEntry");l(oP,"getAll");l(iP,"getPath");co={read:ao,write:du,addEntry:nP,removeEntry:sP,getEntry:rP,getAll:oP,getPath:iP}});import{exec as aP}from"node:child_process";import gn from"node:fs/promises";import mu from"node:os";import ot from"node:path";import{promisify as cP}from"node:util";import{glob as vf}from"glob";function Pf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ot.join(mu.homedir(),r.slice(1)):ot.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Tf(r){let e=[];try{let s=ot.join(r,"SKILL.md");await gn.access(s);let o=ot.basename(r);e.push({name:o,filePath:s})}catch{}let t=await vf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await vf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function lP(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()}
|
|
887
891
|
${s.join(`
|
|
888
892
|
`)}`;return r.replace(o,`---
|
|
889
893
|
${c}
|
|
@@ -892,10 +896,10 @@ ${s.join(`
|
|
|
892
896
|
`)}
|
|
893
897
|
---
|
|
894
898
|
|
|
895
|
-
${r}`}function
|
|
899
|
+
${r}`}function gu(){return ot.join(mu.homedir(),".claude","skills")}async function pu(r,e,t,n){let s=gu(),o=ot.join(s,e),i=ot.join(o,"SKILL.md"),a=await gn.readFile(r,"utf-8"),c=lP(a,t,n);return await gn.mkdir(o,{recursive:!0}),await gn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function uP(r){let e={installed:[],skipped:[],errors:[]};if(!_s.isAvailable("git")){let n=_s.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=ot.join(mu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await xf(`git clone --depth 1 ${n} ${t}`,{timeout:Is("GIT_CLONE")});let s;try{let{stdout:a}=await xf("git rev-parse HEAD",{cwd:t,timeout:Is("TOOL_CHECK")});s=a.trim()}catch{}let o=await Tf(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 pu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await co.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await gn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function dP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await gn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await gn.stat(t)).isFile()){let s=ot.basename(ot.dirname(t));try{let o=await pu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await co.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Tf(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 pu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await co.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function pP(r){let e=gu(),t=ot.join(e,r);try{await gn.rm(t,{recursive:!0,force:!0})}catch{}let n=ot.join(e,`${r}.md`);try{await gn.rm(n,{force:!0})}catch{}return co.removeEntry(r)}async function mP(r){let e=Pf(r);switch(e.type){case"github":return uP(e);case"local":return dP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var xf,Ef,If=y(()=>{"use strict";_();un();Si();Cf();xf=cP(aP);l(Pf,"parseSource");l(Tf,"discoverSkills");l(lP,"injectSourceMetadata");l(gu,"getInstallDir");l(pu,"installSkillFile");l(uP,"installFromGitHub");l(dP,"installFromLocal");l(pP,"remove");l(mP,"install");Ef={install:mP,remove:pP,parseSource:Pf,getInstallDir:gu}});import Mt from"node:fs/promises";import gP from"node:os";import Ct from"node:path";async function Af(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Mt.readdir(o);for(let u of c)u.endsWith(".md")&&await Mt.unlink(Ct.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:se(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>fP(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=>hP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function jf(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Mt.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 Df(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ye(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Mt.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 fP(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Mt.readFile(n,"utf-8"),t=await Df(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:se(n)}),t=wP(r)}await Mt.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function hP(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Mt.readFile(i,"utf-8"),o=await Df(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:se(i)}),o=kP(r,t,n)}o=yP(o,r,s),await Mt.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function yP(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=[`
|
|
896
900
|
## Recent Learnings (from completed tasks)
|
|
897
901
|
`];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(`
|
|
898
|
-
`)}function
|
|
902
|
+
`)}function wP(r){return`---
|
|
899
903
|
name: ${r}
|
|
900
904
|
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"}
|
|
901
905
|
tools: Read, Write, Glob
|
|
@@ -911,7 +915,7 @@ When invoked:
|
|
|
911
915
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
912
916
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
913
917
|
3. Execute requested operation
|
|
914
|
-
`}function
|
|
918
|
+
`}function kP(r,e,t){return`---
|
|
915
919
|
name: ${r}
|
|
916
920
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
917
921
|
tools: Read, Write, Glob, Grep
|
|
@@ -931,17 +935,17 @@ Domain specialist for ${r} tasks.
|
|
|
931
935
|
## Your Role
|
|
932
936
|
|
|
933
937
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
934
|
-
`}function
|
|
935
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await
|
|
936
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await is('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ne(t)})}return e}async function sn(r,e){try{return await _f.access(hu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:ne(t)}),!1}}async function Lf(r){let e={fileCount:0,version:"0.0.0",name:hu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await is('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:ne(t)}),e.fileCount=0}try{let t=hu.join(r,"package.json"),n=JSON.parse(await _f.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await sn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ne(t)})}return await sn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await sn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await sn(r,"requirements.txt")||await sn(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Hf(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await sn(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await sn(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await sn(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await sn(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await sn(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Uf(r,e){let t=os(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Gf(r){return new ta(r).detect()}var is,zf=y(()=>{"use strict";cn();eu();Ln();Ff();is=SP(wP);l(Nf,"analyzeGit");l(sn,"fileExists");l(Lf,"gatherStats");l(Hf,"detectCommands");l(Uf,"buildSources");l(Gf,"detectStack")});import{exec as kP}from"node:child_process";import yu from"node:fs/promises";import na from"node:path";import{promisify as bP}from"node:util";var CP,wu,Su,Wf,Bf=y(()=>{"use strict";Ut();_();CP=bP(kP),wu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=na.join(r,s);try{await yu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=na.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=na.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await yu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await yu.readFile(na.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Su=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[wu.contextFilesExist(t),wu.jsonFilesValid(t),wu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await CP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Wf=new Su});import sa from"node:fs/promises";import ra from"node:path";var oa,as,ku=y(()=>{"use strict";Rs();Yg();sf();af();df();Yl();cn();xn();Ve();Ce();Ci();bn();he();Ar();zr();xi();jr();Dr();$r();yf();le();Ln();dl();pl();Sf();Yc();$f();zf();Bf();oa=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await ea(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ea(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Wr(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:ne(N)})}let[i,a,c,u]=await Promise.all([Nf(this.projectPath),Lf(this.projectPath),Hf(this.projectPath),Gf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&of(this.projectId))try{let{diff:N,currentHashes:it}=await Zl(this.projectPath,this.projectId),On=N.added.length+N.modified.length+N.deleted.length;if(On===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let gr=tf(N,this.projectId);f=nf(gr.allAffected);let by=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=gr.allAffected.some(Fn=>{let Cy=Fn.substring(Fn.lastIndexOf("."));return by.has(Cy)}),g=gr.directlyChanged.some(Fn=>Fn==="package.json"||Fn==="tsconfig.json"||Fn.includes("Dockerfile")||Fn.includes("docker-compose")),m={isIncremental:!0,filesChanged:On,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Ql(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:ne(N)})}else try{let{currentHashes:N}=await Zl(this.projectPath,this.projectId);Ql(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:ne(N)})}if(p)try{await Promise.all([Kg(this.projectPath,this.projectId),ef(this.projectPath,this.projectId),uf(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:ne(N)})}let S;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(S=N)}catch{}let b=g?await If(this.globalPath,u,a,S):await Af(this.globalPath),D=Df(b,this.projectId,this.globalPath),x=g?await Rf(b):[],O=Uf(a,c),F=[],K={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},oe=await ff(K,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let k=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,k);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let ee;try{let N=await R.readConfig(this.projectPath);ee=await Wf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:ne(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:oe.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:ee,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:ne(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>sa.mkdir(ra.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await wf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:ne(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ra.join(this.globalPath,m),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:ne(p)})}for(let m of n)try{let p=ra.join(this.globalPath,"agents",`${m.name}.md`),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:ne(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await un.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:ne(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await Zt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:ne(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=St.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ne(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Bn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Dm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:ne(e)})}}async getCliVersion(){try{let e=ra.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ne(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},as=new oa});var Dn=y(()=>{"use strict";rm();um();dm();fm();ym();Jc();Sm();Yc();km();bm();Bg();Vg();ku()});import mn from"chalk";function Vf(r){return Math.ceil(r.length/vP)}function Jf(r){let e=r.split(`
|
|
938
|
+
`}function Rf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Mt.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:se(o)})}),n}async function $f(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Mt.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(gP.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 Mt.access(m),g=!0}catch{try{await Mt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Ef.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:se(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:se(t)})}return e}var Mf=y(()=>{"use strict";En();ln();le();Un();If();l(Af,"generateAgents");l(jf,"loadExistingAgents");l(Df,"resolveTemplateIncludes");l(fP,"generateWorkflowAgent");l(hP,"generateDomainAgent");l(yP,"injectFeedbackSection");l(wP,"generateMinimalWorkflowAgent");l(kP,"generateMinimalDomainAgent");l(Rf,"configureSkills");l($f,"autoInstallSkills")});import Of from"node:fs/promises";import Ff from"node:path";var na,_f=y(()=>{"use strict";na=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=Ff.join(this.projectPath,"package.json"),t=await Of.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Of.access(Ff.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as SP}from"node:child_process";import Nf from"node:fs/promises";import fu from"node:path";import{promisify as bP}from"node:util";async function Lf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await cs("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await cs("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await cs("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await cs("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
939
|
+
`).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 cs('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
940
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await cs('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:se(t)})}return e}async function rn(r,e){try{return await Nf.access(fu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:se(t)}),!1}}async function Hf(r){let e={fileCount:0,version:"0.0.0",name:fu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await cs('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:se(t)}),e.fileCount=0}try{let t=fu.join(r,"package.json"),n=JSON.parse(await Nf.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 rn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:se(t)})}return await rn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(r,"requirements.txt")||await rn(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 Uf(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 rn(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 rn(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 rn(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 rn(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 rn(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 Gf(r,e){let t=as(),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 zf(r){return new na(r).detect()}var cs,Wf=y(()=>{"use strict";ln();Zl();Un();_f();cs=bP(SP);l(Lf,"analyzeGit");l(rn,"fileExists");l(Hf,"gatherStats");l(Uf,"detectCommands");l(Gf,"buildSources");l(zf,"detectStack")});import{exec as CP}from"node:child_process";import hu from"node:fs/promises";import sa from"node:path";import{promisify as vP}from"node:util";var xP,yu,wu,Bf,Vf=y(()=>{"use strict";Bt();_();xP=vP(CP),yu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=sa.join(r,s);try{await hu.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=sa.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=sa.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 hu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await hu.readFile(sa.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},wu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[yu.contextFilesExist(t),yu.jsonFilesValid(t),yu.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 xP(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}}}},Bf=new wu});import ra from"node:fs/promises";import oa from"node:path";var ia,ls,ku=y(()=>{"use strict";Ms();Xg();rf();cf();pf();Kl();ln();In();Ve();Se();Ci();vn();he();jr();Wr();xi();Dr();Rr();Mr();wf();le();Un();dl();pl();Sf();Xc();Mf();Wf();Vf();ia=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 ta(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ta(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await ff("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:se(N)})}let[i,a,c,u]=await Promise.all([Lf(this.projectPath),Hf(this.projectPath),Uf(this.projectPath),zf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&af(this.projectId))try{let{diff:N,currentHashes:it}=await Ql(this.projectPath,this.projectId),_n=N.added.length+N.modified.length+N.deleted.length;if(_n===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let fr=nf(N,this.projectId);f=sf(fr.allAffected);let vy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=fr.allAffected.some(Nn=>{let xy=Nn.substring(Nn.lastIndexOf("."));return vy.has(xy)}),g=fr.directlyChanged.some(Nn=>Nn==="package.json"||Nn==="tsconfig.json"||Nn.includes("Dockerfile")||Nn.includes("docker-compose")),m={isIncremental:!0,filesChanged:_n,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Xl(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:se(N)})}else try{let{currentHashes:N}=await Ql(this.projectPath,this.projectId);Xl(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:se(N)})}if(p)try{await Promise.all([Yg(this.projectPath,this.projectId),tf(this.projectPath,this.projectId),df(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:se(N)})}let k;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(k=N)}catch{}let b=g?await Af(this.globalPath,u,a,k):await jf(this.globalPath),D=Rf(b,this.projectId,this.globalPath),x=g?await $f(b):[],O=Gf(a,c),F=[],J={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},ne=await hf(J,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 S=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,S);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Z;try{let N=await R.readConfig(this.projectPath);Z=await Bf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:se(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:ne.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:Z,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:se(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>ra.mkdir(oa.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await kf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:se(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=oa.join(this.globalPath,m),g=await ra.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:se(p)})}for(let m of n)try{let p=oa.join(this.globalPath,"agents",`${m.name}.md`),g=await ra.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:se(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:se(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await It.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:se(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:se(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Jn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Rm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:se(e)})}}async getCliVersion(){try{let e=oa.join(__dirname,"..","..","package.json");return JSON.parse(await ra.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:se(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:[]}}},ls=new ia});var Mn=y(()=>{"use strict";nm();cm();lm();mm();fm();qc();ym();Xc();wm();km();Vg();Jg();ku()});import fn from"chalk";function Jf(r){return Math.ceil(r.length/PP)}function qf(r){let e=r.split(`
|
|
937
941
|
`),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+=`
|
|
938
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
939
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
942
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Su(r){return r.includes("<!-- prjct:preserve")}function Kf(r,e){let t=qf(r),n=qf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Jf(r),tokensAfter:Jf(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)Su(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
943
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Su(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
940
944
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
941
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
942
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
945
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Su(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
946
|
+
`).length}),s.hasChanges=!0)}return s}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?fn.green:p=>p,o=t?fn.red:p=>p,i=t?fn.yellow:p=>p,a=t?fn.dim:p=>p,c=t?fn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
943
947
|
`);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(`
|
|
944
|
-
`)}function
|
|
948
|
+
`)}function Xf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?fn.green:c=>c,o=t?fn.red:c=>c,i=t?fn.cyan:c=>c,a=t?fn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
945
949
|
`))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(`
|
|
946
950
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
947
951
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -952,11 +956,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function bu(r){return r.incl
|
|
|
952
956
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
953
957
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
954
958
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
955
|
-
`)}var
|
|
956
|
-
`));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function
|
|
957
|
-
`)}function
|
|
959
|
+
`)}var PP,Qf=y(()=>{"use strict";PP=4;l(Jf,"estimateTokens");l(qf,"parseMarkdownSections");l(Su,"isPreservedSection");l(Kf,"generateSyncDiff");l(Yf,"formatDiffPreview");l(Xf,"formatFullDiff")});import TP from"node:path";async function bu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
|
|
960
|
+
`));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Zf(r){try{let e=await mt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=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 lo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Cu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function eh(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 th(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${lo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ri(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Cu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${lo(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
|
|
961
|
+
`)}function nh(r,e){let t=[];t.push(`# Repository Analysis
|
|
958
962
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
959
|
-
`);let n=
|
|
963
|
+
`);let n=TP.basename(e);if(t.push(`## Project: ${n}
|
|
960
964
|
`),t.push(`## Stack Detected
|
|
961
965
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
962
966
|
`),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
|
|
@@ -972,29 +976,29 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function bu(r){return r.incl
|
|
|
972
976
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
973
977
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
974
978
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
975
|
-
`)}var
|
|
976
|
-
`),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=
|
|
979
|
+
`)}var sh=y(()=>{"use strict";In();oi();Mn();Ls();Gt();rt();l(bu,"showSyncResult");l(Zf,"getSessionActivity");l(lo,"formatTokens");l(Cu,"formatDuration");l(eh,"generateSparkline");l(th,"generateStatsMarkdown");l(nh,"generateAnalysisSummary")});var Bg={};fe(Bg,{AnalysisCommands:()=>us});import vu from"node:fs/promises";import rh from"node:path";import oh from"prompts";var us,Ki=y(()=>{"use strict";Ms();Bp();In();oi();Mn();Qf();Ci();he();Wr();_();Ns();Ls();Gt();sh();rt();us=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
980
|
+
`),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=nh(s,t),i=await R.getProjectId(t),a=n.paths.analysis||I.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:W.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Be(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${I.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
977
981
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
978
|
-
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=
|
|
979
|
-
${Yf(g)}`),!(await rh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Cu(m,i))}t.md||h.spin("Syncing project...");let d=await as.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Pi("sync"),S=Ie(en("Sync Complete",zt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tn("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Cu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await un.getSummary(s),i=await un.getDailyStats(s,30),a=await Qf(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await un.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=Zf(i);if(console.log(` ${p} ${lo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=eh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Zt.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=sh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,zt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",Gt(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Zt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Zt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await Zt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var ia,G,Us=y(()=>{"use strict";Ve();Ce();_();le();ia=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},G=new ia});import PP from"node:path";var Gs,Pu=y(()=>{"use strict";Dn();Ut();_();_s();rt();Us();Gs=class extends ke{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=PP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
982
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=I.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await I.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await ls.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(tn(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=rh.join(o,"context","CLAUDE.md"),c=null;try{c=await vu.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 ls.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await vu.readFile(a,"utf-8")}catch{p=""}let g=Kf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(tn("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 vu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?st("Changes",At(b),3):"No section changes.",jt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Yf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await oh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return k.action==="cancel"||!k.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):k.action==="diff"&&(console.log(`
|
|
983
|
+
${Xf(g)}`),!(await oh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),bu(m,i))}t.md||h.spin("Syncing project...");let d=await ls.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Pi("sync"),k=Ie(tn("Sync Complete",jt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tm("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return bu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await dn.getSummary(s),i=await dn.getDailyStats(s,30),a=await Zf(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await dn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Cu(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=eh(i);if(console.log(` ${p} ${lo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=th(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await It.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=rh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,jt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",At(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await It.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await It.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await It.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var aa,G,Gs=y(()=>{"use strict";Ve();Se();_();le();aa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},G=new aa});import EP from"node:path";var zs,xu=y(()=>{"use strict";Mn();Bt();_();Ns();rt();Gs();zs=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=EP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=W.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
980
984
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
981
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let
|
|
982
|
-
Activity: ${
|
|
985
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
|
|
986
|
+
Activity: ${k}
|
|
983
987
|
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
|
|
984
988
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
985
989
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
986
|
-
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,
|
|
987
|
-
`)[0].trim();console.log(` ${
|
|
988
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
990
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
|
|
991
|
+
`)[0].trim();console.log(` ${k+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
992
|
+
`),{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(k=>{let b=k.priority?` [${k.priority}]`:"";return`${k.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let b=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,st("Current Focus",m,3),st(`Queue (${c.length})`,At(p,!0),3),st("Recent Ships",At(g),3),st("Ideas",`${d.length} pending`,3),Qe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
989
993
|
\u{1F4CA} DASHBOARD - ${i}
|
|
990
994
|
`),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
991
995
|
${g}`),console.log(`
|
|
992
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=
|
|
993
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,
|
|
994
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let
|
|
996
|
+
\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(`
|
|
997
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
998
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
|
|
995
999
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
996
1000
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
997
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1001
|
+
`)}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(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
998
1002
|
PRJCT COMMANDS
|
|
999
1003
|
`),console.log("=".repeat(50));let i=G.getAllCategories(),a=G.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
|
|
1000
1004
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
@@ -1009,7 +1013,7 @@ ${"\u2550".repeat(50)}
|
|
|
1009
1013
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1010
1014
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1011
1015
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1012
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import
|
|
1016
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import IP from"node:fs/promises";import AP from"node:path";var ds,WG,Pu=y(()=>{"use strict";jl();Ve();Se();Bt();_();ds=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=I.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Li.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=AP.join(e,"analysis","repo-analysis.json"),n=await IP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},WG=new ds});async function ca(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function la(r){let e=await R.getProjectId(r);if(!e)return;let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function Tu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ca(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=V.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;V.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Ye.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await la(e),await mt.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(w(t)),{success:!1,error:w(t)}}}var Eu=y(()=>{"use strict";Mn();Bt();he();_();rt();l(ca,"cleanupMemory");l(la,"cleanupMemoryInternal");l(Tu,"cleanup")});import ih from"node:path";async function Iu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=ih.join(I.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1013
1017
|
|
|
1014
1018
|
*Use templates/design/architecture.md for full design*
|
|
1015
1019
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1024,12 +1028,12 @@ ${"\u2550".repeat(50)}
|
|
|
1024
1028
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1025
1029
|
|
|
1026
1030
|
*Use templates/design/flow.md for full design*
|
|
1027
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1031
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=ih.join(a,u);return await ce.writeFile(d,c),await mt.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(w(n)),{success:!1,error:w(n)}}}var Au=y(()=>{"use strict";Mn();_();rt();l(Iu,"design")});import Ws from"node:path";async function ju(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=I.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ce.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1028
1032
|
Found abandoned session:
|
|
1029
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let s=
|
|
1033
|
+
`),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(`
|
|
1030
1034
|
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
|
|
1031
|
-
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function
|
|
1032
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:
|
|
1035
|
+
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Du(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Ws.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp: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:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Ru(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots"),n=Ws.join(t,"history.json"),s;try{let i=await ce.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1036
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp: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:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function $u(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots"),n=Ws.join(t,"history.json"),s;try{let o=await ce.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
|
|
1033
1037
|
SNAPSHOT HISTORY
|
|
1034
1038
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1035
1039
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1037,32 +1041,32 @@ ${"\u2550".repeat(50)}
|
|
|
1037
1041
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1038
1042
|
`)):(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
|
|
1039
1043
|
`)),console.log(`${"=".repeat(50)}
|
|
1040
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var
|
|
1044
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Mu=y(()=>{"use strict";Mn();_();rt();l(ju,"recover");l(Du,"undo");l(Ru,"redo");l($u,"history")});var Bs,Ou=y(()=>{"use strict";rt();Eu();Au();Mu();Eu();Au();Mu();Bs=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=ca;_cleanupMemoryInternal=la;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Tu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Iu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ju(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Du(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ru(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$u(e):t}}});import je from"chalk";function ua(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}var On,Vs,Fu=y(()=>{"use strict";ei();_();rt();On={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ua,"statusIcon");Vs=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Bn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1041
1045
|
${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1042
1046
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1043
|
-
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=
|
|
1044
|
-
${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import
|
|
1047
|
+
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ua(i.startup.avg,On.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${On.startup.max}ms`)}`)}if(i.memory){let c=ua(i.memory.peakHeapMB,On.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${On.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ua(i.contextCorrectness.rate,On.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${On.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ua(i.subtaskHandoff.rate,On.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${On.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1048
|
+
${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import _u from"node:fs/promises";import jP from"node:path";import ae from"chalk";var Js,Nu=y(()=>{"use strict";In();Se();_();xe();dt();rt();Js=class extends be{static{l(this,"SetupCommands")}async start(){let t=await(Be(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1045
1049
|
`),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1046
1050
|
|
|
1047
1051
|
Please install it first:
|
|
1048
1052
|
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ee.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1049
1053
|
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1050
|
-
${
|
|
1054
|
+
${I.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1051
1055
|
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1052
1056
|
\u{1F389} Setup complete!`),console.log(`
|
|
1053
1057
|
Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1054
1058
|
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ee.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ee.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1055
1059
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1056
1060
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1057
|
-
\u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?
|
|
1061
|
+
\u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?I.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Be(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
|
|
1058
1062
|
\u26A1 Installing status line...`);let a=await this.installStatusLine();a.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${a.error}`)}return console.log(`
|
|
1059
1063
|
\u{1F389} Setup complete!
|
|
1060
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=
|
|
1064
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=I.getClaudeDir(),t=I.getClaudeSettingsPath(),n=jP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1061
1065
|
# prjct Status Line for Claude Code
|
|
1062
1066
|
# Shows version update notifications and current task
|
|
1063
1067
|
|
|
1064
1068
|
# Current CLI version (embedded at install time)
|
|
1065
|
-
CLI_VERSION="${
|
|
1069
|
+
CLI_VERSION="${ve}"
|
|
1066
1070
|
|
|
1067
1071
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1068
1072
|
read -r json
|
|
@@ -1113,18 +1117,18 @@ fi
|
|
|
1113
1117
|
|
|
1114
1118
|
# Default: show prjct branding
|
|
1115
1119
|
echo "\u26A1 prjct"
|
|
1116
|
-
`;await
|
|
1117
|
-
${
|
|
1118
|
-
`)[0])),{success:!1,failed:o,output:c}}}async function
|
|
1120
|
+
`;await _u.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await _u.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await _u.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${ve} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function DP(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(ht.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ht.join(r,"yarn.lock"))?"yarn":await P(ht.join(r,"bun.lockb"))||await P(ht.join(r,"bun.lock"))?"bun":(await P(ht.join(r,"package-lock.json")),"npm")}function ah(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function RP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Lu(r){let e=ht.join(r,"package.json"),t=await Ln(e,null);if(t){let o=await DP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:ah(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:ah(o,"typecheck")}),i.test&&(a.test={tool:o,command:RP(o)}),a}if(await P(ht.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await ys(ht.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(ht.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(ht.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await ws(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(ht.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(ht.join(r,"gradlew"))&&(await P(ht.join(r,"build.gradle"))||await P(ht.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var ch=y(()=>{"use strict";xe();l(DP,"detectPackageManager");l(ah,"pmRun");l(RP,"pmTest");l(Lu,"detectProjectCommands")});import{exec as $P}from"node:child_process";import{promisify as MP}from"node:util";import qt from"chalk";function uo(r,e){return`workflow:${r}_${e}`}async function lh(r,e){let t=uo(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(r,t,e.action,"workflow");break;case"session":da.set(t,e);break;case"once":qs.set(t,e);break}}async function FP(r,e){let t={};for(let n of["before","after","skip"]){let s=uo(n,e),o=qs.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=da.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function hn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await FP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=uo(e,t);qs.has(i)&&qs.delete(i),console.log(`
|
|
1121
|
+
${qt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await OP(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${qt.green("\u2713")} ${qt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(qt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(qt.dim(c.split(`
|
|
1122
|
+
`)[0])),{success:!1,failed:o,output:c}}}async function Hu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=uo(o,s),a=qs.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=da.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function uh(r,e,t){let n=uo(e,t);return qs.delete(n),da.delete(n),await Te.recordDecision(r,n,"","workflow:remove"),!0}function dh(r){if(r.length===0)return`${qt.dim(Ar.NO_PREFERENCES)}
|
|
1119
1123
|
|
|
1120
|
-
Set one: "${
|
|
1121
|
-
`)}var
|
|
1124
|
+
Set one: "${Ar.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of r){let n=t.scope==="permanent"?qt.green("permanent"):t.scope==="session"?qt.yellow("session"):qt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(qt.dim(`Modify: "${Ar.MODIFY_EXAMPLE}"`)),e.push(qt.dim(`Remove: "${Ar.REMOVE_EXAMPLE}"`)),e.join(`
|
|
1125
|
+
`)}var OP,da,qs,Uu=y(()=>{"use strict";Ms();_();un();OP=MP($P),da=new Map,qs=new Map;l(uo,"prefKey");l(lh,"setWorkflowPreference");l(FP,"getWorkflowPreferences");l(hn,"runWorkflowHooks");l(Hu,"listWorkflowPreferences");l(uh,"removeWorkflowPreference");l(dh,"formatWorkflowPreferences")});import ph from"node:path";var Ks,Gu=y(()=>{"use strict";Ms();Bt();_();Ns();Ls();ch();Uu();rt();Ks=class extends be{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Ke.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
|
|
1122
1126
|
${o.stderr}`.trim(),a=i.split(`
|
|
1123
1127
|
`),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
|
|
1124
1128
|
`).filter(m=>!m.startsWith("__EXIT:")).join(`
|
|
1125
|
-
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await
|
|
1129
|
+
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await hn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:W.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await hn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Pi("ship"),k=Ie(tn(`Shipped: ${i}`,`Version: ${d}`),st("Results",At([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Qe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Lu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Lu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=ph.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=ph.join(n,"CHANGELOG.md"),o=await ce.readFile(s,`# Changelog
|
|
1126
1130
|
|
|
1127
|
-
`),i=`## [${t}] - ${
|
|
1131
|
+
`),i=`## [${t}] - ${W.formatDate(new Date)}
|
|
1128
1132
|
|
|
1129
1133
|
### Added
|
|
1130
1134
|
- ${e}
|
|
@@ -1135,71 +1139,80 @@ ${o.stderr}`.trim(),a=i.split(`
|
|
|
1135
1139
|
|
|
1136
1140
|
${i}`);await ce.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Ke.get("Bash")("git add .");let n=`feat: ${e}
|
|
1137
1141
|
|
|
1138
|
-
Generated with [p/](https://www.prjct.app/)`;return await Ke.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ke.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import
|
|
1139
|
-
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${
|
|
1142
|
+
Generated with [p/](https://www.prjct.app/)`;return await Ke.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ke.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import _P from"node:fs/promises";import NP from"node:path";import Ys from"chalk";var Xs,zu=y(()=>{"use strict";Ve();Se();xi();_();Gt();rt();Xs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Ys.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1143
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ys.dim("would update")} ${m}`);continue}try{let p=await Br(d),g=await vi(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ys.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ys.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Ys.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ys.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=NP.join(I.getGlobalBasePath(),"projects");try{return(await _P.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Qs,Wu=y(()=>{"use strict";Cl();Ps();ol();_();Qn();rt();Qs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(s);if(i.length===0)return console.log(`
|
|
1140
1144
|
${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
|
|
1141
|
-
`),{success:!0,message:"No data"};let a=$i(i,o);await
|
|
1145
|
+
`),{success:!0,message:"No data"};let a=$i(i,o);await rl.saveMetrics(s,a),console.log(`
|
|
1142
1146
|
${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1143
|
-
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=
|
|
1144
|
-
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...kn,...n.velocity}}catch{}return kn}}});var _P,NP,mh,da,ph,gh,fh=y(()=>{"use strict";Xn();_P=[1,2,3,5,8,13,21],NP={1:{min:5,max:15,typical:10},2:{min:15,max:30,typical:20},3:{min:30,max:60,typical:45},5:{min:60,max:120,typical:90},8:{min:120,max:240,typical:180},13:{min:240,max:480,typical:360},21:{min:480,max:960,typical:720}},mh=l(r=>_P.includes(r),"isValidPoint"),da=l(r=>NP[r],"pointsToMinutes"),ph=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),gh=l(r=>{let e=da(r);return`${ph(e.min)}\u2013${ph(e.max)}`},"pointsToTimeRange")});function Vu(){et.clear(),Jt.clear(),Qs.clear(),Zs.clear()}function Ju(){return{issues:et.stats(),assignedIssues:Jt.stats(),teams:Qs.stats(),projects:Zs.stats()}}var pa,et,Jt,Qs,Zs,qu=y(()=>{"use strict";Jo();pa=300*1e3,et=new Ft({ttl:pa,maxSize:100}),Jt=new Ft({ttl:pa,maxSize:10}),Qs=new Ft({ttl:pa,maxSize:5}),Zs=new Ft({ttl:pa,maxSize:5});l(Vu,"clearLinearCache");l(Ju,"getLinearCacheStats")});import{exec as LP}from"node:child_process";import{promisify as HP}from"node:util";async function ma(r){if(process.platform!=="darwin")return hh(r);try{let{stdout:e}=await UP(`security find-generic-password -s "${GP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return hh(r)}}function hh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var UP,GP,Ku=y(()=>{"use strict";_();UP=HP(LP),GP="prjct-cli";l(ma,"getCredential");l(hh,"getEnvFallback")});var zP,WP,yh,ga,yt,Yu=y(()=>{"use strict";_();Ku();zP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},WP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},yh={none:0,urgent:1,high:2,medium:3,low:4},ga=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ma("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?yh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=yh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:zP[t?.type||"backlog"]||"backlog",priority:WP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new ga});var fa,Rt,Xu=y(()=>{"use strict";qu();Yu();fa=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Jt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Jt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Jt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Jt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Jt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Jt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Qs.get("teams");if(e)return e;let t=await yt.getTeams();return Qs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Zs.get("projects");if(e)return e;let t=await yt.getProjects();return Zs.set("projects",t),t}clearCache(){Vu()}getCacheStats(){return Ju()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Rt=new fa});var wh,ha,BP,Sh=y(()=>{"use strict";Za();he();_();Xu();wh=1800*1e3,ha=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Rt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:wh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Rt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Rt.markInProgress(t):n==="done"&&await Rt.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||wh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Jd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},BP=new ha});var kh=y(()=>{"use strict";qu();Yu();Xu();Sh()});import VP from"node:fs/promises";import JP from"node:os";import qP from"node:path";function KP(r){return qP.join(JP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function ya(r){let e=KP(r);if(!await P(e))return{};try{return JSON.parse(await VP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Qu(r){let e=await ya(r);return e.linear?.apiKey?e.linear.apiKey:ma("linear-api-key")}var bh=y(()=>{"use strict";_();xe();Ku();l(KP,"getCredentialsPath");l(ya,"getProjectCredentials");l(Qu,"getLinearApiKey")});function Ch(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}function YP(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var er,Zu=y(()=>{"use strict";Wl();Hl();fh();kh();Ot();Ut();_();_s();Ns();bh();Gu();Xn();rt();er=class extends ke{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await $n(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Bi.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await ya(o),S=await Qu(o);if(S&&f.linear?.teamId){await Rt.initializeFromApiKey(S,f.linear.teamId);let b=await Rt.fetchIssue(e);b&&(c=e,u=`${e}: ${b.title}`,await Rt.markInProgress(e))}}catch{}await L.startTask(o,{id:Se(),description:u,sessionId:Se(),linearId:c});let m=await Ll.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],S=ol({description:u,branch:a.branch,linearId:c,type:a.type}),b=f.length>0?il(f,0):"",D=Pm(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),x=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(S,b,D,x))}else h.done(`${e}`,{agents:g>0?g:void 0}),Vr("working"),bt("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:B.getTimestamp()}),await $n(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:mh,pointsToMinutes:da,pointsToTimeRange:gh,storeEstimate:l(async f=>{let S=da(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task")):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=ol({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?il(u,d):"",p=Qe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await $n(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Ch(d):"0m",actualDuration:c||"0m",variance:d?YP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Ch(d)}) \u2192 ${b}${S}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await ya(s),S=await Qu(s);S&&f.linear?.teamId&&(await Rt.initializeFromApiKey(S,f.linear.teamId),await Rt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(en("Subtask Complete",`**Completed:** ${a}${f}`),zt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Vr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await $n(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?console.log(Tn("Queue is empty")):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(st("Queue",`${o.length} task${o.length!==1?"s":""}`),Gt(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task to pause")):h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(en("Task Paused",`**Paused:** ${i.description}`),zt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Vr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?console.log(Tn(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(en("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Vr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Tn("No paused task found")):h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Uu(s);return console.log(uh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await ch(s,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await lh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Uu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Ch,"formatMinutesToDuration");l(YP,"formatVariance")});var gn,TB,vh=y(()=>{"use strict";qi();Pu();Tu();Fu();_u();Ji();Lu();zu();Wu();Bu();Zu();gn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new er,this.planning=new rs,this.shipping=new qs,this.analytics=new Gs,this.performanceCmds=new Bs,this.maintenance=new Ws,this.analysis=new cs,this.setupCmds=new Vs,this.updateCmds=new Ys,this.velocityCmds=new Xs,this.contextCmds=new ls,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},TB=new gn});var po,tr,ed=y(()=>{"use strict";po={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},tr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Eh={};ge(Eh,{UninstallCommands:()=>go,uninstall:()=>Th});import{execSync as wa}from"node:child_process";import wt from"node:fs/promises";import XP from"node:os";import fn from"node:path";import QP from"node:readline";import be from"chalk";async function td(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name);if(n.isDirectory())e+=await td(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function xh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function ZP(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function eT(){let r={homebrew:!1,npm:!1};try{wa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function tT(){let r=[],e=Yp(),t=A.getGlobalBasePath(),n=await P(t),s=n?await ZP(fn.join(t,"projects")):0,o=n?await td(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=fn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let K=await wt.readFile(i,"utf-8");c=K.includes(Sa)&&K.includes(mo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await td(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=fn.join(e.claude.config,"prjct-statusline.sh"),S=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=fn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let K=await wt.readFile(x,"utf-8");F=K.includes(Sa)&&K.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function nT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1147
|
+
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=tg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1148
|
+
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Cn,...n.velocity}}catch{}return Cn}}});var LP,HP,gh,pa,mh,fh,hh=y(()=>{"use strict";Qn();LP=[1,2,3,5,8,13,21],HP={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}},gh=l(r=>LP.includes(r),"isValidPoint"),pa=l(r=>HP[r],"pointsToMinutes"),mh=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"),fh=l(r=>{let e=pa(r);return`${mh(e.min)}\u2013${mh(e.max)}`},"pointsToTimeRange")});function Bu(){et.clear(),Kt.clear(),Zs.clear(),er.clear()}function Vu(){return{issues:et.stats(),assignedIssues:Kt.stats(),teams:Zs.stats(),projects:er.stats()}}var ma,et,Kt,Zs,er,Ju=y(()=>{"use strict";Jo();ma=300*1e3,et=new Ht({ttl:ma,maxSize:100}),Kt=new Ht({ttl:ma,maxSize:10}),Zs=new Ht({ttl:ma,maxSize:5}),er=new Ht({ttl:ma,maxSize:5});l(Bu,"clearLinearCache");l(Vu,"getLinearCacheStats")});import{exec as UP}from"node:child_process";import{promisify as GP}from"node:util";async function ga(r){if(process.platform!=="darwin")return yh(r);try{let{stdout:e}=await zP(`security find-generic-password -s "${WP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return yh(r)}}function yh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var zP,WP,qu=y(()=>{"use strict";_();zP=GP(UP),WP="prjct-cli";l(ga,"getCredential");l(yh,"getEnvFallback")});var BP,VP,wh,fa,yt,Ku=y(()=>{"use strict";_();qu();BP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},VP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},wh={none:0,urgent:1,high:2,medium:3,low:4},fa=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ga("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?wh[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=wh[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:BP[t?.type||"backlog"]||"backlog",priority:VP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new fa});var ha,Ot,Yu=y(()=>{"use strict";Ju();Ku();ha=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Kt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Kt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Zs.get("teams");if(e)return e;let t=await yt.getTeams();return Zs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=er.get("projects");if(e)return e;let t=await yt.getProjects();return er.set("projects",t),t}clearCache(){Bu()}getCacheStats(){return Vu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new ha});var kh,ya,JP,Sh=y(()=>{"use strict";ec();he();_();Yu();kh=1800*1e3,ya=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:kh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Ot.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 Ot.markInProgress(t):n==="done"&&await Ot.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||kh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Bd("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}}},JP=new ya});var bh=y(()=>{"use strict";Ju();Ku();Yu();Sh()});import qP from"node:fs/promises";import KP from"node:os";import YP from"node:path";function XP(r){return YP.join(KP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function wa(r){let e=XP(r);if(!await P(e))return{};try{return JSON.parse(await qP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Xu(r){let e=await wa(r);return e.linear?.apiKey?e.linear.apiKey:ga("linear-api-key")}var Ch=y(()=>{"use strict";_();xe();qu();l(XP,"getCredentialsPath");l(wa,"getProjectCredentials");l(Xu,"getLinearApiKey")});import QP from"node:fs/promises";import ZP from"node:path";function vh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function eT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function tT(r){try{let e=ZP.join(r,"analysis","repo-analysis.json"),t=await QP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e),null}}function nT(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=jt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: ${k}`);m=`Commands
|
|
1149
|
+
${At(g)}`}return[u?`Project
|
|
1150
|
+
${u}`:null,m].filter(Boolean).join(`
|
|
1151
|
+
|
|
1152
|
+
`)||null}function sT(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 Pm(e)}function rT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 ${o.location}`:"";return`- ${o.name}: ${o.description}${i}`});e.push(`Patterns (follow these)
|
|
1153
|
+
${s.join(`
|
|
1154
|
+
`)}`)}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)
|
|
1155
|
+
${s.join(`
|
|
1156
|
+
`)}`)}return e.length>0?e.join(`
|
|
1157
|
+
|
|
1158
|
+
`):null}function oT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var tr,Qu=y(()=>{"use strict";zl();Ll();hh();Se();bh();Lt();Bt();Oi();_();Ns();Ls();Ch();Uu();Qn();rt();tr=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await hn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await wa(o),k=await Xu(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let b=await Ot.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ot.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return pn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,x,O]=await Promise.all([eT(),It.getActive(o).catch(()=>null),tT(k),Zn(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=il({description:c,branch:b,linearId:a}),J=nT(D,x),ne=xm(O.files.map(N=>({path:N.path,description:N.reasons.join(", ")}))),S=sT(x),j=rT(D),Z=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Ie(F,J,ne,S,j,Z)),await this.logToMemory(t,"task_started",{task:e,timestamp:W.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Vi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let m=await Nl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Jr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:W.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:gh,pointsToMinutes:pa,pointsToTimeRange:fh,storeEstimate:l(async f=>{let k=pa(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?W.calculateDuration(new Date(i.startedAt)):void 0,c=il({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?vm(u,d):"",p=Qe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=w(s);return n.md?o.includes("Cannot run")||o.includes("working state")?pn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return t.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await hn(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?vh(d):"0m",actualDuration:c||"0m",variance:d?oT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${vh(d)}) \u2192 ${b}${k}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await wa(s),k=await Xu(s);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(tn("Completed",`${a}${f}`),jt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Jr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.getTimestamp()}),await hn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?pn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(st("Queue",`${o.length} task${o.length!==1?"s":""}`),At(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=W.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(tn("Task Paused",`**Paused:** ${i.description}`),jt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Jr("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(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?pn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(tn("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Jr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:W.getTimestamp()}),{success:!0,task:a.description}):(n.md?pn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Hu(s);return console.log(dh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await lh(s,{...o,createdAt:W.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await uh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Hu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(vh,"formatMinutesToDuration");l(eT,"getGitBranch");l(tT,"loadRepoAnalysis");l(nT,"buildProjectContext");l(sT,"buildRules");l(rT,"buildPatterns");l(oT,"formatVariance")});var yn,HB,xh=y(()=>{"use strict";Ki();xu();Pu();Ou();Fu();qi();Nu();Gu();zu();Wu();Qu();yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new tr,this.planning=new is,this.shipping=new Ks,this.analytics=new zs,this.performanceCmds=new Vs,this.maintenance=new Bs,this.analysis=new us,this.setupCmds=new Js,this.updateCmds=new Xs,this.velocityCmds=new Qs,this.contextCmds=new ds,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},HB=new yn});var po,nr,Zu=y(()=>{"use strict";po={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},nr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Ih={};fe(Ih,{UninstallCommands:()=>go,uninstall:()=>Eh});import{execSync as ka}from"node:child_process";import wt from"node:fs/promises";import iT from"node:os";import wn from"node:path";import aT from"node:readline";import Ce from"chalk";async function ed(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=wn.join(r,n.name);if(n.isDirectory())e+=await ed(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function Ph(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function cT(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function lT(){let r={homebrew:!1,npm:!1};try{ka("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ka("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function uT(){let r=[],e=qp(),t=I.getGlobalBasePath(),n=await P(t),s=n?await cT(wn.join(t,"projects")):0,o=n?await ed(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=wn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let J=await wt.readFile(i,"utf-8");c=J.includes(Sa)&&J.includes(mo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await ed(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=wn.join(e.claude.config,"prjct-statusline.sh"),k=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=wn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let J=await wt.readFile(x,"utf-8");F=J.includes(Sa)&&J.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function dT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1145
1159
|
|
|
1146
1160
|
`).trim(),!s||s.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${s}
|
|
1147
|
-
`,"utf-8"),!0}catch{return!1}}async function
|
|
1148
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(
|
|
1149
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1150
|
-
${a.length} errors:`));for(let c of a)console.log(
|
|
1151
|
-
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await
|
|
1161
|
+
`,"utf-8"),!0}catch{return!1}}async function pT(){let r=iT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=wn.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=I.getGlobalBasePath();return await P(n)&&await Th(n,wn.join(t,".prjct-cli")),t}catch{return null}}async function Th(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=wn.join(r,n.name),o=wn.join(e,n.name);n.isDirectory()?await Th(s,o):await wt.copyFile(s,o)}}async function mT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await dT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ka(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||ka("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function gT(r){let e=aT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Eh(r={},e=process.cwd()){let t=await uT(),n=lT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
|
|
1162
|
+
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(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=I.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${Ph(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${Ph(o)}`)),console.log("")),r.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(Ce.blue("Creating backup..."));let c=await pT();c?(console.log(Ce.green(`Backup created: ${I.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await gT("> ")))return console.log(Ce.yellow(`
|
|
1163
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await mT(t,n,r);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
|
|
1164
|
+
${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Sa,mo,go,td=y(()=>{"use strict";In();Se();_();xe();rt();Sa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",mo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(ed,"getDirectorySize");l(Ph,"formatSize");l(cT,"countDirectoryItems");l(lT,"detectInstallation");l(uT,"gatherUninstallItems");l(dT,"removePrjctSection");l(pT,"createBackup");l(Th,"copyDirectory");l(mT,"performUninstall");l(gT,"promptConfirmation");l(Eh,"uninstall");go=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Eh(e,t)}}});function bT(){for(let[r,e]of Object.entries(po))G.registerCategory(r,e)}function Dh(){if(G.has("work"))return;bT();let r=l(e=>nr.find(t=>t.name===e),"getMeta");G.registerMethod("task",sr,"now",r("task")),G.registerMethod("done",sr,"done",r("done")),G.registerMethod("next",sr,"next",r("next")),G.registerMethod("pause",sr,"pause",r("pause")),G.registerMethod("resume",sr,"resume",r("resume")),G.registerMethod("workflow",sr,"workflow",r("workflow")),G.registerMethod("init",ba,"init",r("init")),G.registerMethod("bug",ba,"bug",r("bug")),G.registerMethod("idea",ba,"idea",r("idea")),G.registerMethod("spec",ba,"spec",r("spec")),G.registerMethod("ship",fT,"ship",r("ship")),G.registerMethod("dash",Ah,"dash",r("dash")),G.registerMethod("help",Ah,"help",r("help")),G.registerMethod("perf",hT,"perf",r("perf")),G.registerMethod("velocity",wT,"velocity",r("velocity")),G.registerMethod("cleanup",rr,"cleanup",r("cleanup")),G.registerMethod("design",rr,"design",r("design")),G.registerMethod("recover",rr,"recover",r("recover")),G.registerMethod("undo",rr,"undo",r("undo")),G.registerMethod("redo",rr,"redo",r("redo")),G.registerMethod("history",rr,"history",r("history")),G.registerMethod("analyze",or,"analyze",r("analyze")),G.registerMethod("sync",or,"sync",r("sync")),G.registerMethod("stats",or,"stats",r("stats")),G.registerMethod("status",or,"status",r("status")),G.registerMethod("seal",or,"seal",r("seal")),G.registerMethod("verify",or,"verify",r("verify")),G.registerMethod("start",jh,"start",r("start")),G.registerMethod("setup",jh,"setup",r("setup")),G.registerMethod("uninstall",kT,"uninstall",r("uninstall")),G.registerMethod("update",ST,"update",r("update")),G.registerMethod("context",yT,"context",r("context"))}var sr,ba,fT,Ah,hT,rr,or,jh,yT,wT,kT,ST,Ca=y(()=>{"use strict";Ki();xu();Zu();Pu();Ou();Fu();qi();Gs();Nu();Gu();td();zu();Wu();Qu();sr=new tr,ba=new is,fT=new Ks,Ah=new zs,hT=new Vs,rr=new Bs,or=new us,jh=new Js,yT=new ds,wT=new Qs,kT=new go,ST=new Xs;l(bT,"registerCategories");l(Dh,"registerAllCommands");Dh()});var nd=y(()=>{"use strict";cc();xh();Ca();Gs()});var $h={};fe($h,{shutdown:()=>ar,startDaemon:()=>vT});import Ft from"node:fs";import{createServer as CT}from"node:net";async function vT(r){let e=Ue.socket(),t=Ue.pid(),n=Ue.runDir();if(Ft.mkdirSync(n,{recursive:!0}),Ft.existsSync(t)){let s=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);IT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),Ft.unlinkSync(t)}if(Ft.existsSync(e)&&Ft.unlinkSync(e),We={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ia,idleTimer:null},Le=new yn,ir=CT(s=>xT(s)),ir.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Rh()}),ir.on("error",s=>{console.error("Daemon socket error:",s.message),ar(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Yo;fo=Ko({port:i,projectId:o,projectPath:s,enableLogging:!1}),await fo.start()}}catch{}if(process.on("SIGTERM",()=>ar(0)),process.on("SIGINT",()=>ar(0)),process.on("SIGHUP",()=>{Le=new yn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function xT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1165
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await PT(o);r.write(ms(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ms(i))}}}),r.on("error",()=>{})}async function PT(r){if(!We||!Le)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Rh(),We.commandsServed++,We.lastActivity=Date.now(),r.command==="daemon")return ET(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 TT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1152
1166
|
`)||o.message||void 0,stderr:t.join(`
|
|
1153
|
-
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function
|
|
1154
|
-
${
|
|
1155
|
-
`),console.log(` ${
|
|
1156
|
-
`),r.forEach((t,n)=>{let s=n===e?
|
|
1167
|
+
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function TT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Le.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(r.cwd,{json:t.json===!0});case"verify":return Le.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,r.cwd,{md:n});case"done":return Le.done(r.cwd,{md:n});case"next":return Le.next(r.cwd,{md:n});case"pause":return Le.pause(e||"",r.cwd,{md:n});case"resume":return Le.resume(e,r.cwd,{md:n});case"bug":return Le.bug(e||"",r.cwd,{md:n});case"idea":return Le.idea(e||"",r.cwd,{md:n});case"ship":return Le.ship(e,r.cwd,{md:n});case"dash":return Le.dash(e||"default",r.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return G.execute(r.command,e,r.cwd)}}function ET(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ue.socket(),uptime:We?Date.now()-We.startedAt:0,commandsServed:We?.commandsServed??0,lastActivity:We?new Date(We.lastActivity).toISOString():null,registeredCommands:G.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ar(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Rh(){We&&(We.idleTimer&&clearTimeout(We.idleTimer),We.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${We.idleTimeoutMs/1e3/60} minutes, shutting down`),ar(0)},We.idleTimeoutMs),We.idleTimer.unref&&We.idleTimer.unref())}function ar(r){console.log("Daemon shutting down..."),We?.idleTimer&&clearTimeout(We.idleTimer),fo&&(fo.stop(),fo=null),ir&&(ir.close(),ir=null);let e=Ue.socket(),t=Ue.pid();try{Ft.existsSync(e)&&Ft.unlinkSync(e)}catch{}try{Ft.existsSync(t)&&Ft.unlinkSync(t)}catch{}process.exit(r)}function IT(r){try{return process.kill(r,0),!0}catch{return!1}}var ir,fo,Le,We,Mh=y(()=>{"use strict";nd();Gs();Ca();Ve();kc();ho();ir=null,fo=null,Le=null,We=null;l(vT,"startDaemon");l(xT,"handleConnection");l(PT,"handleRequest");l(TT,"executeCommand");l(ET,"handleDaemonCommand");l(Rh,"resetIdleTimer");l(ar,"shutdown");l(IT,"isProcessRunning")});var _h={};fe(_h,{runStart:()=>NT});import _t from"node:fs/promises";import Oh from"node:os";import Yt from"node:path";import B from"chalk";function DT(){console.clear(),console.log(AT),console.log(jT)}function Fh(r,e){console.log(`
|
|
1168
|
+
${B.bold(" Select AI providers to configure:")}
|
|
1169
|
+
`),console.log(` ${B.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1170
|
+
`),r.forEach((t,n)=>{let s=n===e?B.cyan("\u276F"):" ",o=t.selected?B.green("[\u2713]"):B.dim("[ ]"),i=t.installed?B.green("(installed)"):B.yellow("(will install)"),a=n===e?B.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function RT(){let r=await cn(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Fh(e,n)},"render");Fh(e,n),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
|
|
1157
1171
|
Cancelled.
|
|
1158
1172
|
`),process.exit(0)),a==="\r"||a===`
|
|
1159
1173
|
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
|
|
1160
|
-
${
|
|
1161
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${
|
|
1162
|
-
|
|
1163
|
-
${a}`)}else await
|
|
1164
|
-
${
|
|
1165
|
-
`),console.log(` ${
|
|
1166
|
-
${
|
|
1167
|
-
|
|
1168
|
-
${
|
|
1169
|
-
${
|
|
1170
|
-
${
|
|
1171
|
-
|
|
1172
|
-
${
|
|
1173
|
-
${
|
|
1174
|
-
${
|
|
1175
|
-
${
|
|
1176
|
-
|
|
1177
|
-
${
|
|
1178
|
-
`)}async function
|
|
1179
|
-
|
|
1180
|
-
${
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
${
|
|
1184
|
-
${
|
|
1185
|
-
${
|
|
1186
|
-
${
|
|
1187
|
-
${
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
${W.dim(`Project context layer for AI coding agents.
|
|
1174
|
+
${B.bold(" Detected providers:")}
|
|
1175
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${B.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function $T(r){let e=Me[r];if(!e.configDir)return!1;try{let t=Yt.join(e.configDir,"commands");await _t.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),Ao)),s=n(),o=r==="claude"?"p.md":"p.toml",i=Yt.join(s,"templates","commands",o),a=Yt.join(t,o);return await P(i)?(await _t.copyFile(i,a),!0):!1}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function MT(r){let e=Me[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Yt.join(e.configDir,"commands"):Yt.join(e.configDir,"commands","p");await _t.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=Tn("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=ye(`commands/${i}`);a&&await _t.writeFile(Yt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} subcommands: ${w(t)}`),!1}}async function OT(r){let e=Me[r];if(!e.configDir)return!1;try{await _t.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),Ao)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Yt.join(n,"templates","global",s),i=Yt.join(e.configDir,s);if(await P(o)){let a=await _t.readFile(o,"utf-8");if(await P(i)){let c=await _t.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await _t.writeFile(i,m+g+p)}else await _t.writeFile(i,`${c}
|
|
1176
|
+
|
|
1177
|
+
${a}`)}else await _t.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function FT(r){let e=Yt.join(Oh.homedir(),".prjct-cli","config");await _t.mkdir(e,{recursive:!0});let t=Yt.join(e,"installed-editors.json"),n={version:ve,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Yt.join(Oh.homedir(),`.${r[0]}`,"commands")};await _t.writeFile(t,JSON.stringify(n,null,2))}function _T(r){console.log(`
|
|
1178
|
+
${B.green.bold(" \u2713 Setup complete!")}
|
|
1179
|
+
`),console.log(` ${B.dim("Configured providers:")}`),r.forEach(e=>{let t=Me[e];console.log(` ${B.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1180
|
+
${B.bold("Next steps:")}
|
|
1181
|
+
|
|
1182
|
+
${B.cyan("1.")} Navigate to your project directory
|
|
1183
|
+
${B.cyan("2.")} Run ${B.bold("p. init")} to initialize prjct for that project
|
|
1184
|
+
${B.cyan("3.")} Start tracking with ${B.bold('p. task "your task"')}
|
|
1185
|
+
|
|
1186
|
+
${B.dim("Tips:")}
|
|
1187
|
+
${B.dim("\u2022")} Use ${B.bold("p. sync")} to analyze your codebase
|
|
1188
|
+
${B.dim("\u2022")} Use ${B.bold("p. done")} to complete tasks
|
|
1189
|
+
${B.dim("\u2022")} Use ${B.bold("p. ship")} to create PRs
|
|
1190
|
+
|
|
1191
|
+
${B.dim("Learn more: https://prjct.app/docs")}
|
|
1192
|
+
`)}async function NT(){DT();let r=await RT();console.log(`
|
|
1193
|
+
${B.cyan("Setting up...")}
|
|
1194
|
+
`);for(let e of r){let t=Me[e];process.stdout.write(` ${B.dim("\u2022")} ${t.displayName}... `);let n=await $T(e),s=await MT(e),o=await OT(e);console.log(n&&s&&o?B.green("\u2713"):n||o?B.yellow("partial"):B.yellow("skipped"))}await FT(r),_T(r)}var cr,lr,ur,dr,pr,AT,jT,Nh=y(()=>{"use strict";En();Be();_();xe();dt();cr=B.rgb(0,255,255),lr=B.rgb(80,180,255),ur=B.rgb(140,120,255),dr=B.rgb(200,80,220),pr=B.rgb(255,80,180),AT=`
|
|
1195
|
+
|
|
1196
|
+
${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${ur(" \u2588\u2588\u2557")}${dr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${pr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1197
|
+
${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur(" \u2588\u2588\u2551")}${dr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${pr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1198
|
+
${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur(" \u2588\u2588\u2551")}${dr("\u2588\u2588\u2551 ")}${pr(" \u2588\u2588\u2551 ")}
|
|
1199
|
+
${cr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur("\u2588\u2588 \u2588\u2588\u2551")}${dr("\u2588\u2588\u2551 ")}${pr(" \u2588\u2588\u2551 ")}
|
|
1200
|
+
${cr(" \u2588\u2588\u2551 ")}${lr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${ur("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${dr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${pr(" \u2588\u2588\u2551 ")}
|
|
1201
|
+
${cr(" \u255A\u2550\u255D ")}${lr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${ur(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${dr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${pr(" \u255A\u2550\u255D ")}
|
|
1202
|
+
|
|
1203
|
+
`,jT=` ${B.white("Context Layer for AI Agents")} ${B.dim(`v${ve}`)}
|
|
1204
|
+
|
|
1205
|
+
${B.dim(`Project context layer for AI coding agents.
|
|
1193
1206
|
Works with Claude Code, Gemini CLI, and more.`)}
|
|
1194
|
-
${
|
|
1195
|
-
`;l(
|
|
1196
|
-
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function
|
|
1207
|
+
${B.cyan("https://prjct.app")}
|
|
1208
|
+
`;l(DT,"showBanner");l(Fh,"showProviderSelection");l(RT,"selectProviders");l($T,"installRouter");l(MT,"installSubcommands");l(OT,"installGlobalConfig");l(FT,"saveSetupConfig");l(_T,"showCompletion");l(NT,"runStart")});import{exec as LT}from"node:child_process";import Uh from"node:fs/promises";import on from"node:path";import{promisify as HT}from"node:util";async function mr(r,e=process.cwd(),t={}){let n=on.isAbsolute(r)?r:on.join(e,r),s;try{s=await Uh.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=on.extname(r).toLowerCase(),i=BT[o]||"unknown",a=WT[i]||[],c=await VT(s,a,n,e),u=[];t.reverse&&(u=await qT(r,e));let d;t.depth&&t.depth>0&&(d=await Gh(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function VT(r,e,t,n){let s=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await JT(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function JT(r,e,t){let n=on.dirname(e);if(r.startsWith("@/")){let o=on.join(t,"src",r.slice(2));return Hh(o,t)}let s=on.resolve(n,r);return Hh(s,t)}async function Hh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await Uh.stat(s)).isFile())return on.relative(e,s)}catch{}}return null}async function qT(r,e){let t=[],n=on.basename(r,on.extname(r)),s=on.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await UT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
|
|
1209
|
+
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function Gh(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await mr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Gh(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var UT,Lh,GT,zT,WT,BT,sd=y(()=>{"use strict";_();UT=HT(LT),Lh=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],GT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],zT=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],WT={typescript:Lh,javascript:Lh,python:GT,go:zT},BT={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(mr,"analyzeImports");l(VT,"extractImports");l(JT,"resolveImport");l(Hh,"tryResolve");l(qT,"findImportedBy");l(Gh,"buildDependencyTree")});import zh from"node:fs/promises";import an from"node:path";async function va(r,e=process.cwd()){let t=an.isAbsolute(r)?r:an.join(e,r),n;try{n=await zh.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:es("")};throw p}let s=an.extname(r).toLowerCase(),o=Wh[s]||"unknown",i=await Rn(r,e),a=await mr(r,e),c=YT(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?XT(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=QT(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function rd(r,e=process.cwd(),t={}){let n=an.isAbsolute(r)?r:an.join(e,r),s=[];async function o(i){let a=await zh.readdir(i,{withFileTypes:!0});for(let c of a){let u=an.join(i,c.name),d=an.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=an.extname(c.name).toLowerCase();if(Wh[m]){let p=await va(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function YT(r,e){let t=KT[e]||[],n=r.split(`
|
|
1197
1210
|
`);for(let o=0;o<Math.min(30,n.length);o++){let i=n[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<n.length&&a.start.test(n[u].trim());)c.push(n[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<n.length&&(c+=`${n[u]}
|
|
1198
1211
|
`,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1199
1212
|
`).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let s=r.split(`
|
|
1200
|
-
`)[0]||"";return`Module: ${
|
|
1201
|
-
`)[0].trim()}function
|
|
1202
|
-
`)}var
|
|
1213
|
+
`)[0]||"";return`Module: ${an.basename(s,an.extname(s))}`}function XT(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1214
|
+
`)[0].trim()}function QT(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
|
|
1215
|
+
`)}var KT,Wh,Bh=y(()=>{"use strict";_();sd();Ni();eo();KT={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},Wh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(va,"summarizeFile");l(rd,"summarizeDirectory");l(YT,"extractFilePurpose");l(XT,"extractDescriptionFromDocstring");l(QT,"buildSummaryText")});var Vh=y(()=>{"use strict"});var Jh={};fe(Jh,{analyzeImports:()=>mr,combineMetrics:()=>_i,countTokens:()=>Fi,extractDirectorySignatures:()=>Tl,extractSignatures:()=>Rn,findRelevantFiles:()=>Zn,formatCompressionRate:()=>lv,formatCostSaved:()=>Pl,formatTokenCount:()=>cv,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>es,runContextTool:()=>ZT,summarizeDirectory:()=>rd,summarizeFile:()=>va});async function ZT(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await eE(o,t);break;case"signatures":i=await tE(o,t);break;case"imports":i=await nE(o,t);break;case"recent":i=await sE(o,t);break;case"summary":i=await rE(o,t);break;case"help":return{tool:"error",result:{error:cE(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=oE(i),u=iE(i);return await aE(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function eE(r,e){let t={},n=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await Zn(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function tE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Tl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=_i(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await Rn(t,e)}}async function nE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await mr(t,e,n)}}async function sE(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await Qr(e,t)}}async function rE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await rd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:_i(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await va(t,e)}}function oE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function iE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function aE(r,e){try{await dn.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function cE(){return`
|
|
1203
1216
|
Context Tools - Smart context filtering for AI agents
|
|
1204
1217
|
|
|
1205
1218
|
USAGE:
|
|
@@ -1260,7 +1273,7 @@ TOOLS:
|
|
|
1260
1273
|
OUTPUT:
|
|
1261
1274
|
All tools output JSON for easy parsing by AI agents.
|
|
1262
1275
|
Each output includes metrics showing token savings.
|
|
1263
|
-
`.trim()}var
|
|
1276
|
+
`.trim()}var qh=y(()=>{"use strict";Wr();_();le();Oi();sd();vl();Ni();Bh();eo();eo();Vh();l(ZT,"runContextTool");l(eE,"runFilesTool");l(tE,"runSignaturesTool");l(nE,"runImportsTool");l(sE,"runRecentTool");l(rE,"runSummaryTool");l(oE,"getTokensSaved");l(iE,"getCompressionRate");l(aE,"recordToolUsage");l(cE,"getHelpText")});var Qh={};fe(Qh,{hooksService:()=>fE});import He from"node:fs/promises";import Re from"node:path";import vt from"chalk";function Yh(){return`#!/bin/sh
|
|
1264
1277
|
# prjct auto-sync hook (post-commit)
|
|
1265
1278
|
# Syncs project context after each commit
|
|
1266
1279
|
# Installed by: prjct hooks install
|
|
@@ -1281,7 +1294,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1281
1294
|
fi
|
|
1282
1295
|
|
|
1283
1296
|
exit 0
|
|
1284
|
-
`}function
|
|
1297
|
+
`}function Xh(){return`#!/bin/sh
|
|
1285
1298
|
# prjct auto-sync hook (post-checkout)
|
|
1286
1299
|
# Syncs project context after branch switch
|
|
1287
1300
|
# Installed by: prjct hooks install
|
|
@@ -1313,7 +1326,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1313
1326
|
fi
|
|
1314
1327
|
|
|
1315
1328
|
exit 0
|
|
1316
|
-
`}async function
|
|
1329
|
+
`}async function od(r){let e=[];return(await P(Re.join(r,"lefthook.yml"))||await P(Re.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P(Re.join(r,".husky"))||await P(Re.join(r,".husky","_")))&&e.push("husky"),await P(Re.join(r,".git"))&&e.push("direct"),e}function Kh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function lE(r,e){let t=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(r,t),s=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
|
|
1317
1330
|
${i}:
|
|
1318
1331
|
commands:
|
|
1319
1332
|
${a}:
|
|
@@ -1324,34 +1337,34 @@ ${i}:
|
|
|
1324
1337
|
${a}:
|
|
1325
1338
|
run: prjct sync --quiet --yes
|
|
1326
1339
|
fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
|
|
1327
|
-
${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function
|
|
1340
|
+
${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function uE(r,e){let t=Re.join(r,".husky");for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?Yh():Xh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1328
1341
|
# prjct auto-sync
|
|
1329
1342
|
prjct sync --quiet --yes &
|
|
1330
|
-
`)}else await He.writeFile(s,o,{mode:493})}return!0}async function
|
|
1343
|
+
`)}else await He.writeFile(s,o,{mode:493})}return!0}async function dE(r,e){let t=Re.join(r,".git","hooks");await P(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?Yh():Xh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1331
1344
|
# prjct auto-sync
|
|
1332
1345
|
${o.split(`
|
|
1333
1346
|
`).slice(1).join(`
|
|
1334
|
-
`)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function
|
|
1335
|
-
`,"utf-8"),!0}async function
|
|
1347
|
+
`)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function pE(r){let e=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(r,e);if(!await P(t))return!1;let n=await He.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await He.writeFile(t,`${n.trimEnd()}
|
|
1348
|
+
`,"utf-8"),!0}async function mE(r){let e=Re.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
|
|
1336
1349
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1337
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function
|
|
1350
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function gE(r){let e=Re.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=s.split(`
|
|
1338
1351
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1339
|
-
`);await He.writeFile(n,o,{mode:493})}}return!0}var
|
|
1340
|
-
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${
|
|
1352
|
+
`);await He.writeFile(n,o,{mode:493})}}return!0}var id,fE,Zh=y(()=>{"use strict";Ve();he();_();xe();Gt();l(Yh,"getPostCommitScript");l(Xh,"getPostCheckoutScript");l(od,"detectHookManagers");l(Kh,"selectStrategy");l(lE,"installLefthook");l(uE,"installHusky");l(dE,"installDirect");l(pE,"uninstallLefthook");l(mE,"uninstallHusky");l(gE,"uninstallDirect");id=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await od(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Kh(s);try{let i=!1;switch(o){case"lefthook":i=await lE(e,n);break;case"husky":i=await uE(e,n);break;case"direct":i=await dE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await pE(e);break;case"husky":s=await mE(e);break;case"direct":s=await gE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await od(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){h.start(),h.section("Git Hooks Installation");let t=await od(e),n=Kh(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await P(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await P(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=Re.join(e,".git","hooks",t);return await P(s)?(await He.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=$.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let s=$.getDoc(n,"project")||{};s.hooks=t,$.setDoc(n,"project",s)}catch{}}},fE=new id});var ny={};fe(ny,{DoctorService:()=>xa,doctorService:()=>hE});import{execSync as ad}from"node:child_process";import ey from"node:fs/promises";import ty from"node:path";import Fn from"chalk";var xa,hE,sy=y(()=>{"use strict";Ve();Se();Bt();Gt();dt();xa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=I.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,s,o){try{let a=ad(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e}async checkPrjctConfig(){let e=ty.join(this.projectPath,".prjct","prjct.config.json");try{return await ey.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=ty.join(this.globalPath,"context","CLAUDE.md");try{let t=await ey.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{ad("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=ad("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
|
|
1353
|
+
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${ve}`)}printSection(e,t){h.section(e);let n=t.map(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Fn.dim(" (optional)"):"";return`${o} ${i} ${Fn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Fn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Fn.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return Fn.green("\u2713");case"warn":return Fn.yellow("\u26A0");case"error":return t?Fn.dim("\u25CB"):Fn.red("\u2717")}}},hE=new xa});var ry={};fe(ry,{WatchService:()=>Pa,watchService:()=>bE});import yE from"node:path";import tt from"chalk";import wE from"chokidar";var kE,SE,Pa,bE,oy=y(()=>{"use strict";Ve();_();le();ku();kE=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],SE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Pa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=wE.watch(kE,{cwd:this.projectPath,ignored:SE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(tt.dim(`
|
|
1341
1354
|
\u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(tt.dim(` ${n} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(tt.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
|
|
1342
|
-
${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await
|
|
1343
|
-
`)}function
|
|
1344
|
-
`)}function
|
|
1345
|
-
`)}function
|
|
1346
|
-
${
|
|
1355
|
+
${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await ls.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${tt.dim(`[${t}]`)} ${tt.green("\u2713")} Synced${o}`)}}else console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(tt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(tt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(tt.dim(` Project: ${yE.basename(this.projectPath)}`)),console.log(tt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(tt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(tt.dim(" Press Ctrl+C to stop")),console.log("")}},bE=new Pa});var py={};fe(py,{formatAgentCommandHelp:()=>ly,formatCommandHelp:()=>uy,formatCommandList:()=>dy,formatMainHelp:()=>ay,formatTerminalCommandHelp:()=>cy,getHelp:()=>vE});import q from"chalk";function ay(){let r=[];r.push(""),r.push(`${q.cyan.bold("prjct")} v${ve} - Context layer for AI coding agents`),r.push(q.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(q.bold("QUICK START")),r.push(q.dim("\u2500".repeat(60))),r.push(` ${q.green("1.")} prjct start ${q.dim("# Configure AI providers")}`),r.push(` ${q.green("2.")} cd my-project && prjct init`),r.push(` ${q.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${q.green("4.")} p. sync ${q.dim("# Analyze project")}`),r.push(""),r.push(q.bold("TERMINAL COMMANDS")),r.push(q.dim("\u2500".repeat(60)));for(let t of iy){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${q.bold("AI AGENT COMMANDS")} ${q.dim("(inside Claude/Gemini/Cursor)")}`),r.push(q.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${q.dim("\u2500".repeat(56))}`);let e=nr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${q.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(q.bold("FLAGS")),r.push(q.dim("\u2500".repeat(60)));for(let t of CE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(q.bold("MORE INFO")),r.push(q.dim("\u2500".repeat(60))),r.push(` Documentation: ${q.cyan("https://prjct.app")}`),r.push(` GitHub: ${q.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1356
|
+
`)}function cy(r){let e=iy.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${q.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(q.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(q.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(q.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
|
|
1357
|
+
`)}function ly(r){let e=nr.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${q.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(q.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(q.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(q.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(q.bold("REQUIREMENTS")),t.push(` ${q.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=po[e.group];return n&&(t.push(q.dim(`Category: ${n.title}`)),e.isOptional&&t.push(q.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1358
|
+
`)}function uy(r){let e=cy(r);if(e)return e;let t=ly(r);return t||`
|
|
1359
|
+
${q.yellow(`Command '${r}' not found.`)}
|
|
1347
1360
|
|
|
1348
1361
|
Run 'prjct help' to see all available commands.
|
|
1349
|
-
`}function
|
|
1350
|
-
`)}function
|
|
1362
|
+
`}function dy(){let r=[];r.push(""),r.push(q.cyan.bold("All Commands")),r.push("");let e=Object.entries(po).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=nr.filter(o=>o.group===t);if(s.length!==0){r.push(`${q.bold(n.title)} ${q.dim(`(${s.length} commands)`)}`),r.push(q.dim(n.description)),r.push("");for(let o of s){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(q.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1363
|
+
`)}function vE(r){return r?r==="commands"||r==="all"?dy():uy(r):ay()}var iy,CE,my=y(()=>{"use strict";Zu();dt();iy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],CE=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(ay,"formatMainHelp");l(cy,"formatTerminalCommandHelp");l(ly,"formatAgentCommandHelp");l(uy,"formatCommandHelp");l(dy,"formatCommandList");l(vE,"getHelp")});var wy={};fe(wy,{installAntigravitySkill:()=>yy,needsAntigravityInstallation:()=>IE,run:()=>hy});import{execSync as xE}from"node:child_process";import K from"node:fs/promises";import ps from"node:os";import oe from"node:path";import ge from"chalk";async function PE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_s.isAvailable("npm"))return console.log(`${ge.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ge.dim(`Install ${r.displayName} using one of:`)}`),console.log(ge.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ge.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(ge.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ge.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),xE(`npm install -g ${e}`,{stdio:"inherit",timeout:Is("NPM_INSTALL")}),console.log(""),console.log(`${ge.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(ge.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(ge.dim("The npm install took too long. Try:")),console.log(ge.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ge.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ge.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(ge.dim("Alternative installation methods:")),console.log(ge.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ge.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ge.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ge.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function hy(){let r=await cn(),e=await Fa(),t=Me[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let i of s){let a=Me[i],c=r[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!c.installed)if(i===e.provider)if(await PE(a))u.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Ee.detectClaude()){let m=await Ee.syncCommands();m.success&&(u.commandsAdded=m.added,u.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let p=await Ee.installGlobalConfig();p.success&&(u.configAction=p.action,n.configAction||(n.configAction=p.action)),await Ee.installDocs(),await jE(),await DE()}}else if(i==="gemini"){await TE()&&(u.commandsAdded=1,n.commandsAdded+=1);let m=await EE();m.success&&(u.configAction=m.action)}n.providers.push(u)}(await Ss()).installed&&(await yy()).success&&console.log(` ${ge.green("\u2713")} Antigravity skill installed`),await Va.saveConfig(ve,await Ee.getInstallPath(),e.provider),await AE();for(let i of n.providers)RE(i,Me[i.provider]);return n}async function TE(){try{let r=oe.join(ps.homedir(),".gemini","commands"),e=oe.join(r,"p.toml");await K.mkdir(r,{recursive:!0});let t=ye("commands/p.toml");if(t)return await K.writeFile(e,t,"utf-8"),!0;let n=oe.join(pe,"templates","commands","p.toml");return await P(n)?(await K.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function EE(){try{let r=oe.join(ps.homedir(),".gemini"),e=oe.join(r,"GEMINI.md");await K.mkdir(r,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=oe.join(pe,"templates","global","GEMINI.md");t=await K.readFile(p,"utf-8")}let n="",s=!1;try{n=await K.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await K.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}
|
|
1351
1364
|
|
|
1352
|
-
${t}`;return await
|
|
1365
|
+
${t}`;return await K.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 K.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function yy(){try{let r=oe.join(ps.homedir(),".gemini","antigravity","skills"),e=oe.join(r,"prjct"),t=oe.join(e,"SKILL.md");await K.mkdir(e,{recursive:!0});let n=await P(t),s=ye("antigravity/SKILL.md");if(!s){let o=oe.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await K.readFile(o,"utf-8")}return await K.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function IE(){let r=await Ss();return r.installed&&!r.skillInstalled}async function AE(){try{let r=oe.join(ps.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await K.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=$.getDoc(n,"project");if(!s)continue;s.cliVersion!==ve&&(s.cliVersion=ve,$.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${ge.green("\u2713")} Updated ${t} project(s) to v${ve}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function gy(r,e){let t={};if(await P(r))try{t=JSON.parse(await K.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await K.writeFile(r,JSON.stringify(t,null,2))}async function jE(){try{let r=oe.join(ps.homedir(),".claude"),e=oe.join(r,"settings.json"),t=oe.join(r,"prjct-statusline.sh"),n=oe.join(ps.homedir(),".prjct-cli","statusline"),s=oe.join(n,"statusline.sh"),o=oe.join(n,"themes"),i=oe.join(n,"lib"),a=oe.join(n,"components"),c=oe.join(n,"config.json"),u=oe.join(pe,"assets","statusline"),d=oe.join(u,"statusline.sh"),m=oe.join(u,"themes"),p=oe.join(u,"lib"),g=oe.join(u,"components"),f=oe.join(u,"default-config.json");if(await P(r)||await K.mkdir(r,{recursive:!0}),await P(n)||await K.mkdir(n,{recursive:!0}),await P(o)||await K.mkdir(o,{recursive:!0}),await P(i)||await K.mkdir(i,{recursive:!0}),await P(a)||await K.mkdir(a,{recursive:!0}),await P(s)){let k=await K.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let b=k.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==ve){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`);await K.writeFile(s,D,{mode:493})}await Ta(p,i),await Ta(g,a),await fy(t,s),await gy(e,t);return}}if(await P(d)){let k=await K.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`),await K.writeFile(s,k,{mode:493}),await Ta(p,i),await Ta(g,a),await P(m)){let b=await K.readdir(m);for(let D of b){let x=oe.join(m,D),O=oe.join(o,D);await K.copyFile(x,O)}}!await P(c)&&await P(f)&&await K.copyFile(f,c)}else{let k=`#!/bin/bash
|
|
1353
1366
|
# prjct Status Line for Claude Code
|
|
1354
|
-
CLI_VERSION="${
|
|
1367
|
+
CLI_VERSION="${ve}"
|
|
1355
1368
|
input=$(cat)
|
|
1356
1369
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
1357
1370
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -1380,14 +1393,14 @@ if [ -f "$CONFIG" ]; then
|
|
|
1380
1393
|
fi
|
|
1381
1394
|
fi
|
|
1382
1395
|
echo "prjct"
|
|
1383
|
-
`;await
|
|
1396
|
+
`;await K.writeFile(s,k,{mode:493})}await fy(t,s),await gy(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function DE(){try{let r=oe.join(ps.homedir(),".claude"),e=oe.join(r,"mcp.json");await P(r)||await K.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await K.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await K.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await K.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function Ta(r,e){if(!await P(r))return;let t=await K.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=oe.join(r,n),o=oe.join(e,n);await K.copyFile(s,o),await K.chmod(o,493)}}async function fy(r,e){try{if(await P(r)){if((await K.lstat(r)).isSymbolicLink()&&await K.readlink(r)===e)return;await K.unlink(r)}await K.symlink(e,r)}catch{try{await P(e)&&(await K.copyFile(e,r),await K.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function RE(r,e){if(console.log(""),r.cliInstalled?console.log(` ${ge.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ge.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${ge.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${ge.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${ge.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${ge.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${ge.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var $E,ky=y(()=>{"use strict";En();Si();he();_();un();xe();Un();dt();Be();In();Ja();l(PE,"installAICLI");l(hy,"run");l(TE,"installGeminiRouter");l(EE,"installGeminiGlobalConfig");l(yy,"installAntigravitySkill");l(IE,"needsAntigravityInstallation");l(AE,"migrateProjectsCliVersion");l(gy,"ensureStatusLineSettings");l(jE,"installStatusLine");l(DE,"installContext7MCP");l(Ta,"installStatusLineModules");l(fy,"ensureStatusLineSymlink");l(RE,"showResults");$E=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");$E&&hy().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var Sy=jy((lq,ME)=>{ME.exports={name:"prjct-cli",version:"1.29.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var GE={};import by from"node:os";import Ea from"node:path";import $e from"chalk";async function OE(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Dy(Sy()));await HE(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(UE(),process.exit(0)),h.start();try{let t=G.getByName(r);if(!t){let d=_E(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Wn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=LE(t,e),o=FE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await Pn.expireIfStale(i),await Pn.touch(i))}catch{}let c=new yn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await Pn.trackCommand(i,r,d)}catch{}try{await Bn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Bn.recordTiming(i,"startup_time",p)}await Bn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(wo(t)),h.end(),process.exit(1)}}function FE(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Wn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function _E(r){let e=G.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=NE(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function NE(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function LE(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function HE(r){let e=await cn(),t=Ea.join(by.homedir(),".claude","commands","p.md"),n=Ea.join(by.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Ea.join(process.cwd(),".cursor","commands","sync.md")),P(Ea.join(process.cwd(),".cursor"))]),c=await Ss();if(console.log(`
|
|
1384
1397
|
${$e.cyan("p/")} prjct v${r}
|
|
1385
1398
|
${$e.dim("Context layer for AI coding agents")}
|
|
1386
1399
|
|
|
1387
1400
|
${$e.dim("Providers:")}`),e.claude.installed){let u=s?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1388
1401
|
${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1389
1402
|
${$e.cyan("https://prjct.app")}
|
|
1390
|
-
`)}function
|
|
1403
|
+
`)}function UE(){console.log(`
|
|
1391
1404
|
prjct - Context layer for AI coding agents
|
|
1392
1405
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1393
1406
|
|
|
@@ -1446,11 +1459,11 @@ MORE INFO
|
|
|
1446
1459
|
---------
|
|
1447
1460
|
Documentation: https://prjct.app
|
|
1448
1461
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1449
|
-
`)}var
|
|
1462
|
+
`)}var Cy=y(()=>{"use strict";nd();Gs();Ca();Be();Ve();ei();Zo();_();Fr();xe();Gt();l(OE,"main");l(FE,"validateCommandParams");l(_E,"findClosestCommand");l(NE,"editDistance");l(LE,"parseCommandArgs");l(HE,"displayVersion");l(UE,"displayHelp");OE().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(wo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var gr=process.argv.slice(2),cd=gr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),zE=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(cd&&!zE.has(cd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(ho(),dd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(fs(),gs)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<gr.length;a++){let c=gr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<gr.length&&!gr[a+1].startsWith("--")?i[u]=gr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:cd,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function WE(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Be(),ut)),s=(await Promise.resolve().then(()=>(Ve(),Od))).default,o=(await Promise.resolve().then(()=>(Ja(),_d))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(kc(),Op)),{fileExists:c}=await Promise.resolve().then(()=>(xe(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>($a(),xd)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),Ao));async function m(){let x=r.homedir(),O=await n();if(O.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(O.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!O.claude.installed&&!O.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(Gt(),Lp));x(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(x){let O=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:J}=await Promise.resolve().then(()=>(Zo(),Gp));return await J.expireIfStale(F),await J.touch(F),()=>{let ne=Date.now()-O;J.trackCommand(F,x,ne).catch(()=>{}),Promise.resolve().then(()=>(ei(),Wp)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ne,{command:x}).catch(()=>{}),S.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:O,spawnDaemon:F}=await Promise.resolve().then(()=>(fs(),gs));if(await O())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ne}=await Promise.resolve().then(()=>(Mh(),$h)),S=parseInt(p.find(Z=>Z.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await ne({port:S,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(x==="stop"){let{isDaemonRunning:O,stopDaemon:F}=await Promise.resolve().then(()=>(fs(),gs));if(await O()){let J=await F();console.log(J?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=J?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:O}=await Promise.resolve().then(()=>(fs(),gs)),F=await O();if(F.running){let J=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${J}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(Nh(),_h));await x()}else if(p[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(p[0]==="web"||p[0]==="serve")try{let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(O,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:J}=await Promise.resolve().then(()=>(qh(),Jh)),ne=await J(p.slice(1),O,x);console.log(JSON.stringify(ne,null,2)),process.exitCode=ne.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:O}=await Promise.resolve().then(()=>(Zh(),Qh)),F=p[1]||"status",J=await O.run(process.cwd(),F);process.exitCode=J,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:O}=await Promise.resolve().then(()=>(sy(),ny)),F=await O.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(td(),Ih)),O=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),J=p.includes("--dry-run")||p.includes("-n"),ne=p.includes("--keep-package"),S=await x({force:O,backup:F,dryRun:J,keepPackage:ne});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(oy(),ry)),J=p.includes("--verbose")||p.includes("-v"),ne=p.find(it=>it.startsWith("--debounce=")),S=ne?parseInt(ne.split("=")[1],10):void 0,j=p.find(it=>it.startsWith("--interval=")),Z=j?parseInt(j.split("=")[1],10)*1e3:void 0,N=await F.start(x,{verbose:J,quiet:f,debounceMs:S,minIntervalMs:Z});N.success||(console.error(N.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),O=await import("node:fs"),F=process.cwd(),J=await s.getProjectId(F);if(!J)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let ne=e.join(__dirname,"..","core","cli","linear.ts"),S=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),Z,N;if(O.existsSync(ne)?(Z=ne,N="bun"):O.existsSync(j)?(Z=j,N="node"):O.existsSync(S)?(Z=S,N="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,Z="",N=""),Z){let it=["--project",J,...p.slice(1)];x(N,[Z,...it],{stdio:"inherit",cwd:F}).on("close",fr=>{process.exitCode=fr||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(my(),py)),O=p[1];console.log(x(O)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),O=r.homedir(),F=process.cwd(),[J,ne,S,j,Z,N]=await Promise.all([c(e.join(O,".claude","commands","p.md")),c(e.join(O,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
|
|
1450
1463
|
${t.cyan("p/")} prjct v${d}
|
|
1451
1464
|
${t.dim("Context layer for AI coding agents")}
|
|
1452
1465
|
|
|
1453
|
-
${t.dim("Providers:")}`),x.claude.installed){let it=
|
|
1466
|
+
${t.dim("Providers:")}`),x.claude.installed){let it=J?t.green("\u2713 ready"):t.yellow("\u25CF installed"),_n=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${it}${t.dim(_n)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let it=ne?t.green("\u2713 ready"):t.yellow("\u25CF installed"),_n=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${it}${t.dim(_n)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(S){let it=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${it}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(Z){let it=N?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${it}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
|
|
1454
1467
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1455
1468
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1456
1469
|
${t.cyan("https://prjct.app")}
|
|
@@ -1463,4 +1476,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
|
|
|
1463
1476
|
Claude Code, Gemini CLI, or both.`)}
|
|
1464
1477
|
`),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
|
|
1465
1478
|
${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
|
|
1466
|
-
`);let{default:
|
|
1479
|
+
`);let{default:J}=await Promise.resolve().then(()=>(ky(),wy));await J.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(fs(),gs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Cy(),GE))}}}l(WE,"main");WE().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|