prjct-cli 1.53.0 → 1.55.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 +25 -0
- package/README.md +203 -164
- package/dist/bin/prjct-core.mjs +457 -375
- package/dist/cli/jira.mjs +5 -5
- package/dist/cli/linear.mjs +6 -6
- package/dist/daemon/entry.mjs +392 -310
- package/dist/mcp/server.mjs +276 -173
- package/package.json +1 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,13 +5,13 @@ import { dirname as __pathDirname } from 'path';
|
|
|
5
5
|
var require = __createRequire(import.meta.url);
|
|
6
6
|
var __filename = __fileURLToPath(import.meta.url);
|
|
7
7
|
var __dirname = __pathDirname(__filename);
|
|
8
|
-
var
|
|
9
|
-
`,"utf-8")}async function C(r){try{return await bt.access(r),!0}catch(e){if(D(e))return!1;throw e}}async function ms(r){try{return(await bt.stat(r)).isDirectory()}catch(e){if(D(e))return!1;throw e}}async function Ve(r){await bt.mkdir(r,{recursive:!0})}async function ps(r,e={}){try{let s=await bt.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(D(t))return[];throw t}}var B=v(()=>{"use strict";Ni();Zl();U();l(an,"walkDir");l(cn,"batchProcess");l(Pe,"readJson");l(le,"writeJson");l(Ie,"readFile");l(Tt,"writeFile");l(eu,"appendLine");l(C,"fileExists");l(ms,"dirExists");l(Ve,"ensureDir");l(ps,"listFiles")});var Hi={};Jt(Hi,{PACKAGE_ROOT:()=>lt,VERSION:()=>Ee,compareVersions:()=>tu,getPackageInfo:()=>af,getPackageRoot:()=>Ui,getVersion:()=>xs,isCompatible:()=>cf,needsMigration:()=>lf});import Li from"node:fs";import Wr from"node:path";function Ui(){if(ir)return ir;let r=__dirname;for(let e=0;e<5;e++){let t=Wr.join(r,"package.json");if(Li.existsSync(t))try{if(JSON.parse(Li.readFileSync(t,"utf-8")).name==="prjct-cli")return ir=r,r}catch{}r=Wr.dirname(r)}return ir=Wr.join(__dirname,"..","..",".."),ir}function xs(){if(Hr)return Hr;try{let r=Wr.join(Ui(),"package.json"),e=JSON.parse(Li.readFileSync(r,"utf-8"));return Hr=e.version,Fi=e,Hr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function af(){return Fi||xs(),Fi}function tu(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function cf(r){let e=xs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function lf(r,e=null){let t=e||xs();return tu(r,t)<0}var Hr,Fi,ir,Ee,lt,It=v(()=>{"use strict";U();Hr=null,Fi=null,ir=null;l(Ui,"getPackageRoot");l(xs,"getVersion");l(af,"getPackageInfo");l(tu,"compareVersions");l(cf,"isCompatible");l(lf,"needsMigration");Ee=xs(),lt=Ui()});var nu={};Jt(nu,{execAsync:()=>_,execFileAsync:()=>As});import{exec as uf,execFile as df}from"node:child_process";import{promisify as su}from"node:util";var _,As,Le=v(()=>{"use strict";_=su(uf),As=su(df)});async function Gr(r){try{let{stdout:e}=await _(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mf(){let r=await Gr("gh api user --jq .login");return r.success&&r.output||(r=await Gr("git config --global github.user"),r.success&&r.output)?r.output:null}async function pf(){let r=await Gr("git config user.name");return r.success&&r.output?r.output:null}async function gf(){let r=await Gr("git config user.email");return r.success&&r.output?r.output:null}async function ln(){let[r,e,t]=await Promise.all([mf(),pf(),gf()]);return{github:r,email:t,name:e||r||"Unknown"}}var Vr=v(()=>{"use strict";Le();l(Gr,"execCommand");l(mf,"detectGitHubUsername");l(pf,"detectGitName");l(gf,"detectGitEmail");l(ln,"detect")});var ar=v(()=>{"use strict"});import{z as qt}from"zod";function ru(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var WT,GT,VT,un,BT,Br=v(()=>{"use strict";WT=qt.enum(["opus","sonnet","haiku"]),GT=qt.enum(["2.5-pro","2.5-flash","2.0-flash"]),VT=qt.string().min(1),un=qt.object({provider:qt.string(),model:qt.string(),cliVersion:qt.string().optional(),recordedAt:qt.string()}),BT=qt.object({preferredModel:qt.string().optional(),lastAnalysisModel:un.optional()});l(ru,"compareSemver")});function gs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var dn,Rs=v(()=>{"use strict";l(gs,"isExpired");dn=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((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import ff from"node:fs/promises";import hf from"node:os";import ou from"node:path";async function au(){try{let r=await ff.readFile(iu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||gs(e.timestamp,wf)?null:e.detection}catch{return null}}async function cu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(iu,e)}var yf,iu,wf,lu=v(()=>{"use strict";Rs();B();yf=ou.join(hf.homedir(),".prjct-cli","cache"),iu=ou.join(yf,"providers.json"),wf=600*1e3;l(au,"readProviderCache");l(cu,"writeProviderCache")});var jt={};Jt(jt,{AntigravityProvider:()=>Vi,ClaudeProvider:()=>Jr,CodexProvider:()=>Bi,CursorProvider:()=>du,GeminiProvider:()=>Gi,Providers:()=>ut,WindsurfProvider:()=>mu,detectAllProviders:()=>cr,detectAntigravity:()=>Kr,detectCodex:()=>Ds,detectCursorProject:()=>fu,detectProvider:()=>qr,detectWindsurfProject:()=>hu,getActiveProvider:()=>Tf,getCapabilities:()=>Sf,getCommandsDir:()=>Rf,getGlobalContextPath:()=>Cf,getGlobalSettingsPath:()=>xf,getProjectCommandsPath:()=>Df,getProviderBranding:()=>zr,getSkillsPath:()=>Af,hasProviderConfig:()=>vf,needsCursorRouterRegeneration:()=>Ef,needsWindsurfRouterRegeneration:()=>Pf,selectProvider:()=>Ji,validateCliVersion:()=>gu});import fs from"node:os";import We from"node:path";function Sf(r,e){return{...kf[r],...e}}async function pu(r){try{let{stdout:e}=await _(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function bf(r){try{let{stdout:e}=await _(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function qr(r){let e=ut[r];if(!e.cliCommand)return{installed:!1};let t=await pu(e.cliCommand);if(!t)return{installed:!1};let s=await bf(e.cliCommand),n=gu(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function gu(r,e){let t=ut[r];return!t.minCliVersion||!e?null:ru(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 cr(r=!1){if(!r){let i=await au();if(i)return i}let[e,t,s]=await Promise.all([qr("claude"),qr("gemini"),Ds()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await cu(o).catch(()=>{}),o}async function Tf(r){if(r&&ut[r])return ut[r];let e=await cr();return e.claude.installed&&!e.gemini.installed?Jr:e.gemini.installed&&!e.claude.installed?Gi:Jr}async function vf(r){let e=ut[r];return e.configDir?C(e.configDir):!1}function zr(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function fu(r){let e=We.join(r,".cursor"),t=We.join(e,"rules"),s=We.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Ef(r){let e=await fu(r);return e.detected&&!e.routerInstalled}async function hu(r){let e=We.join(r,".windsurf"),t=We.join(e,"rules"),s=We.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Pf(r){let e=await hu(r);return e.detected&&!e.routerInstalled}async function Kr(){let r=Vi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=We.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Ds(){let r=Bi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await pu("codex"),t=We.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Cf(r){let e=ut[r];return e.configDir?We.join(e.configDir,e.contextFile):null}function xf(r){let e=ut[r];return!e.configDir||!e.settingsFile?null:We.join(e.configDir,e.settingsFile)}function Af(r){return ut[r].skillsDir}function Rf(r){return ut[r].commandsDir}function Df(r,e){let t=ut[r];return We.join(e,t.commandsDir)}async function Ji(){let r=await cr(),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 kf,Jr,Gi,Vi,du,mu,Bi,ut,dt=v(()=>{"use strict";ar();Br();Le();B();lu();kf={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(Sf,"getCapabilities");Jr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:We.join(fs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:We.join(fs.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",capabilityTier:"full"},Gi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:We.join(fs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:We.join(fs.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",capabilityTier:"standard"},Vi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:We.join(fs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:We.join(fs.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,capabilityTier:"basic"},du={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,capabilityTier:"basic"},mu={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,capabilityTier:"basic"},Bi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:We.join(fs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:We.join(fs.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ut={claude:Jr,gemini:Gi,cursor:du,antigravity:Vi,windsurf:mu,codex:Bi};l(pu,"whichCommand");l(bf,"getCliVersion");l(qr,"detectProvider");l(gu,"validateCliVersion");l(cr,"detectAllProviders");l(Tf,"getActiveProvider");l(vf,"hasProviderConfig");l(zr,"getProviderBranding");l(fu,"detectCursorProject");l(Ef,"needsCursorRouterRegeneration");l(hu,"detectWindsurfProject");l(Pf,"needsWindsurfRouterRegeneration");l(Kr,"detectAntigravity");l(Ds,"detectCodex");l(Cf,"getGlobalContextPath");l(xf,"getGlobalSettingsPath");l(Af,"getSkillsPath");l(Rf,"getCommandsDir");l(Df,"getProjectCommandsPath");l(Ji,"selectProvider")});import If from"node:crypto";import zt from"node:fs/promises";import qi from"node:os";import V from"node:path";import{globSync as jf}from"glob";var zi,$f,A,ye=v(()=>{"use strict";q();B();zi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?V.resolve(e):V.join(qi.homedir(),".prjct-cli"),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=V.resolve(e),this.globalProjectsDir=V.join(this.globalBaseDir,"projects"),this.globalConfigDir=V.join(this.globalBaseDir,"config")}generateProjectId(e){return If.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return V.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return V.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return V.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return V.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ms(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await Ve(this.globalBaseDir),await Ve(this.globalProjectsDir),await Ve(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await Ve(V.join(t,n));return await Ve(V.join(t,"planning","tasks")),await Ve(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Bl(t);return V.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Ve(s),s}async listSessions(e,t=null,s=null){let n=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await zt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(n,a.name),u=await zt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=V.join(c,d.name),p=await zt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:V.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,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return V.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await zt.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 ms(t)}getDisplayPath(e){let t=qi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return V.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return V.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return V.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return V.join(this.globalBaseDir,".running")}getDocsPath(){return V.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(dt(),at(jt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(dt(),at(jt)).getActiveProvider();return(dt(),at(jt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(qi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return V.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return V.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{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 n of s){let o=V.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=V.join(e,"package.json");if(await C(n))try{let o=await zt.readFile(n,"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 s=[],n=[];try{if(t==="pnpm"){let i=(await zt.readFile(V.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
10
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=
|
|
11
|
-
`)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await
|
|
8
|
+
var Vr=Object.defineProperty;var df=Object.getOwnPropertyDescriptor;var mf=Object.getOwnPropertyNames;var pf=Object.prototype.hasOwnProperty;var l=(r,e)=>Vr(r,"name",{value:e,configurable:!0}),Tt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var E=(r,e)=>()=>(r&&(e=r(r=0)),e);var Lt=(r,e)=>{for(var t in e)Vr(r,t,{get:e[t],enumerable:!0})},gf=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of mf(e))!pf.call(r,n)&&n!==t&&Vr(r,n,{get:()=>e[n],enumerable:!(s=df(e,n))||s.enumerable});return r};var lt=r=>gf(Vr({},"__esModule",{value:!0}),r);import{z as ve}from"zod";function ff(r){return r instanceof ln}function de(r){return ff(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var un,kT,ST,bT,TT,vT,ET,ln,qr,Jr,pr,ts=E(()=>{"use strict";un={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},kT=un.create("FileError",ve.object({path:ve.string(),operation:ve.enum(["read","write","delete","create","copy"]),reason:ve.string().optional()})),ST=un.create("ValidationError",ve.object({field:ve.string(),expected:ve.string(),received:ve.string().optional(),message:ve.string().optional()})),bT=un.create("PermissionError",ve.object({action:ve.string(),resource:ve.string(),reason:ve.string().optional()})),TT=un.create("TaskError",ve.object({taskId:ve.string().optional(),operation:ve.enum(["create","update","complete","pause","resume","delete"]),reason:ve.string()})),vT=un.create("SessionError",ve.object({sessionId:ve.string().optional(),reason:ve.string()})),ET=un.create("SyncError",ve.object({projectId:ve.string().optional(),operation:ve.enum(["push","pull","auth","connect"]),reason:ve.string()})),ln=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)}},qr=class r extends ln{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")}},Jr=class r extends ln{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")}},pr=class r extends ln{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(ff,"isPrjctError");l(de,"getErrorMessage")});function hf(r){return r instanceof Error&&"code"in r}function D(r){return hf(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var W=E(()=>{"use strict";l(hf,"isNodeError");l(D,"isNotFoundError");l(y,"getErrorMessage")});import{formatDistanceToNowStrict as DT}from"date-fns";function tu(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function su(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function S(){return new Date().toISOString()}function hs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ut(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function ss(r,e=new Date){let t=e.getTime()-r.getTime();return ut(t)}function dn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function vt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=E(()=>{"use strict";l(tu,"formatDate");l(su,"getYearMonthDay");l(S,"getTimestamp");l(hs,"getDaysAgo");l(ut,"formatDuration");l(ss,"calculateDuration");l(dn,"parseVarianceMinutes");l(vt,"parseDurationMinutes")});var nu,ru,ou,Vi=E(()=>{"use strict";nu=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),ru=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ou=/(?:import|from)\s+['"]([^'"]+)['"]/g});import cu from"node:fs/promises";async function lu(r,e){let t;try{t=await cu.readFile(r,"utf-8")}catch(o){if(D(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await iu(r,t),au(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await iu(r,t),au(r,yf(n.error)),null)}async function iu(r,e){let t=`${r}.backup`;try{await cu.writeFile(t,e,"utf-8")}catch{}}function au(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 yf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var uu=E(()=>{"use strict";W();l(lu,"safeRead");l(iu,"createBackup");l(au,"logCorruption");l(yf,"formatZodError")});import Et from"node:fs/promises";import gr from"node:path";async function mn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Et.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(nu.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=gr.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(gr.relative(r,d))}}return l(o,"walk"),await o(r),t}async function pn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function be(r,e=null,t){if(t)return await lu(r,t)??e;try{let s=await Et.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(D(s))return e;throw s}}async function ce(r,e,t=2){let s=gr.dirname(r);await Et.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Et.writeFile(r,n,"utf-8")}async function $e(r,e=""){try{return await Et.readFile(r,"utf-8")}catch(t){if(D(t))return e;throw t}}async function Pt(r,e){let t=gr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.writeFile(r,e,"utf-8")}async function du(r,e){let t=gr.dirname(r);await Et.mkdir(t,{recursive:!0}),await Et.appendFile(r,`${e}
|
|
9
|
+
`,"utf-8")}async function C(r){try{return await Et.access(r),!0}catch(e){if(D(e))return!1;throw e}}async function ys(r){try{return(await Et.stat(r)).isDirectory()}catch(e){if(D(e))return!1;throw e}}async function ze(r){await Et.mkdir(r,{recursive:!0})}async function ws(r,e={}){try{let s=await Et.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(D(t))return[];throw t}}var V=E(()=>{"use strict";Vi();uu();W();l(mn,"walkDir");l(pn,"batchProcess");l(be,"readJson");l(ce,"writeJson");l($e,"readFile");l(Pt,"writeFile");l(du,"appendLine");l(C,"fileExists");l(ys,"dirExists");l(ze,"ensureDir");l(ws,"listFiles")});var Ki={};Lt(Ki,{PACKAGE_ROOT:()=>dt,VERSION:()=>Ce,compareVersions:()=>mu,getPackageInfo:()=>wf,getPackageRoot:()=>zi,getVersion:()=>Ms,isCompatible:()=>kf,needsMigration:()=>Sf});import qi from"node:fs";import Kr from"node:path";function zi(){if(fr)return fr;let r=__dirname;for(let e=0;e<5;e++){let t=Kr.join(r,"package.json");if(qi.existsSync(t))try{if(JSON.parse(qi.readFileSync(t,"utf-8")).name==="prjct-cli")return fr=r,r}catch{}r=Kr.dirname(r)}return fr=Kr.join(__dirname,"..","..",".."),fr}function Ms(){if(zr)return zr;try{let r=Kr.join(zi(),"package.json"),e=JSON.parse(qi.readFileSync(r,"utf-8"));return zr=e.version,Ji=e,zr}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function wf(){return Ji||Ms(),Ji}function mu(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function kf(r){let e=Ms(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Sf(r,e=null){let t=e||Ms();return mu(r,t)<0}var zr,Ji,fr,Ce,dt,$t=E(()=>{"use strict";W();zr=null,Ji=null,fr=null;l(zi,"getPackageRoot");l(Ms,"getVersion");l(wf,"getPackageInfo");l(mu,"compareVersions");l(kf,"isCompatible");l(Sf,"needsMigration");Ce=Ms(),dt=zi()});var gu={};Lt(gu,{execAsync:()=>N,execFileAsync:()=>_s});import{exec as bf,execFile as Tf}from"node:child_process";import{promisify as pu}from"node:util";var N,_s,Ue=E(()=>{"use strict";N=pu(bf),_s=pu(Tf)});async function Xr(r){try{let{stdout:e}=await N(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function vf(){let r=await Xr("gh api user --jq .login");return r.success&&r.output||(r=await Xr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Ef(){let r=await Xr("git config user.name");return r.success&&r.output?r.output:null}async function Pf(){let r=await Xr("git config user.email");return r.success&&r.output?r.output:null}async function gn(){let[r,e,t]=await Promise.all([vf(),Ef(),Pf()]);return{github:r,email:t,name:e||r||"Unknown"}}var Yr=E(()=>{"use strict";Ue();l(Xr,"execCommand");l(vf,"detectGitHubUsername");l(Ef,"detectGitName");l(Pf,"detectGitEmail");l(gn,"detect")});var hr=E(()=>{"use strict"});import{z as Xt}from"zod";function fu(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var ZT,ev,tv,fn,sv,Qr=E(()=>{"use strict";ZT=Xt.enum(["opus","sonnet","haiku"]),ev=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),tv=Xt.string().min(1),fn=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),sv=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:fn.optional()});l(fu,"compareSemver")});function ks(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var hn,Os=E(()=>{"use strict";l(ks,"isExpired");hn=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((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import Cf from"node:fs/promises";import xf from"node:os";import hu from"node:path";async function wu(){try{let r=await Cf.readFile(yu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||ks(e.timestamp,Af)?null:e.detection}catch{return null}}async function ku(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(yu,e)}var Rf,yu,Af,Su=E(()=>{"use strict";Os();V();Rf=hu.join(xf.homedir(),".prjct-cli","cache"),yu=hu.join(Rf,"providers.json"),Af=600*1e3;l(wu,"readProviderCache");l(ku,"writeProviderCache")});var Mt={};Lt(Mt,{AntigravityProvider:()=>Qi,ClaudeProvider:()=>Zr,CodexProvider:()=>Zi,CursorProvider:()=>Tu,GeminiProvider:()=>Yi,Providers:()=>mt,WindsurfProvider:()=>vu,detectAllProviders:()=>yr,detectAntigravity:()=>so,detectCodex:()=>Ns,detectCursorProject:()=>Cu,detectProvider:()=>eo,detectWindsurfProject:()=>xu,getActiveProvider:()=>$f,getCapabilities:()=>jf,getCommandsDir:()=>Uf,getGlobalContextPath:()=>Nf,getGlobalSettingsPath:()=>Lf,getProjectCommandsPath:()=>Hf,getProviderBranding:()=>to,getSkillsPath:()=>Ff,hasProviderConfig:()=>Mf,needsCursorRouterRegeneration:()=>_f,needsWindsurfRouterRegeneration:()=>Of,selectProvider:()=>ea,validateCliVersion:()=>Pu});import Ss from"node:os";import Ve from"node:path";function jf(r,e){return{...Df[r],...e}}async function Eu(r){try{let{stdout:e}=await N(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function If(r){try{let{stdout:e}=await N(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function eo(r){let e=mt[r];if(!e.cliCommand)return{installed:!1};let t=await Eu(e.cliCommand);if(!t)return{installed:!1};let s=await If(e.cliCommand),n=Pu(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Pu(r,e){let t=mt[r];return!t.minCliVersion||!e?null:fu(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 yr(r=!1){if(!r){let i=await wu();if(i)return i}let[e,t,s]=await Promise.all([eo("claude"),eo("gemini"),Ns()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await ku(o).catch(()=>{}),o}async function $f(r){if(r&&mt[r])return mt[r];let e=await yr();return e.claude.installed&&!e.gemini.installed?Zr:e.gemini.installed&&!e.claude.installed?Yi:Zr}async function Mf(r){let e=mt[r];return e.configDir?C(e.configDir):!1}function to(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Cu(r){let e=Ve.join(r,".cursor"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function _f(r){let e=await Cu(r);return e.detected&&!e.routerInstalled}async function xu(r){let e=Ve.join(r,".windsurf"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Of(r){let e=await xu(r);return e.detected&&!e.routerInstalled}async function so(){let r=Qi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ve.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Ns(){let r=Zi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Eu("codex"),t=Ve.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Nf(r){let e=mt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function Lf(r){let e=mt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Ff(r){return mt[r].skillsDir}function Uf(r){return mt[r].commandsDir}function Hf(r,e){let t=mt[r];return Ve.join(e,t.commandsDir)}async function ea(){let r=await yr(),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 Df,Zr,Yi,Qi,Tu,vu,Zi,mt,pt=E(()=>{"use strict";hr();Qr();Ue();V();Su();Df={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(jf,"getCapabilities");Zr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ve.join(Ss.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ve.join(Ss.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",capabilityTier:"full"},Yi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ve.join(Ss.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ve.join(Ss.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",capabilityTier:"standard"},Qi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ve.join(Ss.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ve.join(Ss.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,capabilityTier:"basic"},Tu={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,capabilityTier:"basic"},vu={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,capabilityTier:"basic"},Zi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ve.join(Ss.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ve.join(Ss.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},mt={claude:Zr,gemini:Yi,cursor:Tu,antigravity:Qi,windsurf:vu,codex:Zi};l(Eu,"whichCommand");l(If,"getCliVersion");l(eo,"detectProvider");l(Pu,"validateCliVersion");l(yr,"detectAllProviders");l($f,"getActiveProvider");l(Mf,"hasProviderConfig");l(to,"getProviderBranding");l(Cu,"detectCursorProject");l(_f,"needsCursorRouterRegeneration");l(xu,"detectWindsurfProject");l(Of,"needsWindsurfRouterRegeneration");l(so,"detectAntigravity");l(Ns,"detectCodex");l(Nf,"getGlobalContextPath");l(Lf,"getGlobalSettingsPath");l(Ff,"getSkillsPath");l(Uf,"getCommandsDir");l(Hf,"getProjectCommandsPath");l(ea,"selectProvider")});import Wf from"node:crypto";import Yt from"node:fs/promises";import ta from"node:os";import q from"node:path";import{globSync as Gf}from"glob";var sa,Bf,R,Se=E(()=>{"use strict";K();V();sa=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?q.resolve(e):q.join(ta.homedir(),".prjct-cli"),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=q.resolve(e),this.globalProjectsDir=q.join(this.globalBaseDir,"projects"),this.globalConfigDir=q.join(this.globalBaseDir,"config")}generateProjectId(e){return Wf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return q.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return q.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return q.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return q.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ys(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await ze(this.globalBaseDir),await ze(this.globalProjectsDir),await ze(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await ze(q.join(t,n));return await ze(q.join(t,"planning","tasks")),await ze(q.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=su(t);return q.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await ze(s),s}async listSessions(e,t=null,s=null){let n=q.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Yt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=q.join(n,a.name),u=await Yt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=q.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:q.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,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return q.join(this.getGlobalProjectPath(e),t,s)}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 ys(t)}getDisplayPath(e){let t=ta.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return q.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return q.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return q.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return q.join(this.globalBaseDir,".running")}getDocsPath(){return q.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(pt(),lt(Mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(pt(),lt(Mt)).getActiveProvider();return(pt(),lt(Mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return q.join(ta.homedir(),".claude")}getClaudeSettingsPath(){return q.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return q.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return q.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{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 n of s){let o=q.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=q.join(e,"package.json");if(await C(n))try{let o=await Yt.readFile(n,"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 s=[],n=[];try{if(t==="pnpm"){let i=(await Yt.readFile(q.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
10
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=q.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=q.join(e,"lerna.json");if(await C(c)){let u=await Yt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=q.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=Gf(o,{cwd:e,absolute:!1});for(let a of i){let c=q.join(e,a),u=q.join(c,"package.json");if(await C(u))try{let d=await Yt.readFile(u,"utf-8"),m=JSON.parse(d),p=q.join(c,"PRJCT.md");s.push({name:m.name||q.basename(a),path:c,relativePath:a,hasPrjctMd:await C(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=q.resolve(e);for(let n of t.packages){let o=q.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=q.resolve(e),s=q.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=q.dirname(t)}return null}},Bf=new sa,R=Bf});var no={};Lt(no,{default:()=>Ut,worktreeService:()=>Au});import na from"node:fs/promises";import Qt from"node:path";var Ru,ra,Au,Ut,wr=E(()=>{"use strict";Ue();V();Ru=".worktrees",ra=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=Qt.join(n,Ru,t),i=s.branch||`feat/${t}`;await na.mkdir(Qt.join(n,Ru),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await N(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await N("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await N("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await N(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await N(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await N("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await N("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await N("git rev-parse --git-dir",{cwd:e}),n=Qt.resolve(e,t.trim()),o=Qt.resolve(e,s.trim());if(n!==o){let{stdout:i}=await N("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await N("git rev-parse HEAD",{cwd:e}),{stdout:c}=await N("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=Qt.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await N("git worktree list --porcelain",{cwd:e}),n=s.split(`
|
|
11
|
+
`)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await N("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=Qt.join(t,".env");await C(s)&&await na.copyFile(s,Qt.join(e,".env"));let n=Qt.join(t,".prjct"),o=Qt.join(e,".prjct");await C(n)&&!await C(o)&&await na.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await N("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
|
|
12
12
|
|
|
13
13
|
`);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
|
|
14
|
-
`),a="",c="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":
|
|
14
|
+
`),a="",c="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":Qt.basename(a)})}}return s}},Au=new ra,Ut=Au});import oa from"node:fs/promises";import Vf from"node:path";import*as ro from"jsonc-parser";function Du(r){let e=[],t=ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${ro.printParseErrorCode(s.error)}`)}return t}var ia,qf,I,xe=E(()=>{"use strict";ts();W();K();V();$t();Yr();Se();l(Du,"parseJsonc");ia=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=R.getLocalConfigPath(e),s=await oa.readFile(t,"utf-8");return Du(s)}catch(t){return D(t)||console.warn(`Warning: Could not read config at ${e}: ${de(t)}`),null}}async writeConfig(e,t){let s=R.getLocalConfigPath(e);await ce(s,t)}async readGlobalConfig(e){try{let t=R.getGlobalProjectConfigPath(e),s=await oa.readFile(t,"utf-8");return Du(s)}catch(t){return D(t)||console.warn(`Warning: Could not read global config for ${e}: ${de(t)}`),null}}async writeGlobalConfig(e,t){let s=R.getGlobalProjectConfigPath(e);await ce(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=S();t={projectId:e,authors:[],version:Ce,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=R.generateProjectId(e),n=R.getGlobalProjectPath(s),o=R.getDisplayPath(n),i=S(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Ce,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=S(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await R.hasLegacyStructure(e))return!1;if(!await R.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=R.getGlobalProjectPath(n.projectId);try{return(await oa.readdir(Vf.join(o,"core"))).length===0}catch(i){return D(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(wr(),no));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return R.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=S();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=S(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await gn(),s=await this.getProjectId(e);return await this.addAuthor(s,{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 s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=R.generateProjectId(e);return{projectId:s,dataPath:R.getDisplayPath(R.getGlobalProjectPath(s))}}},qf=new ia,I=qf});import oo from"node:fs/promises";var aa,Jf,Ls,io=E(()=>{"use strict";xe();Se();W();Os();V();aa=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new hn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await I.getProjectId(e),n=R.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:R.getFilePath(s,"core","now.md"),next:R.getFilePath(s,"core","next.md"),context:R.getFilePath(s,"core","context.md"),shipped:R.getFilePath(s,"progress","shipped.md"),metrics:R.getFilePath(s,"progress","metrics.md"),ideas:R.getFilePath(s,"planning","ideas.md"),roadmap:R.getFilePath(s,"planning","roadmap.md"),specs:R.getFilePath(s,"planning","specs"),memory:R.getFilePath(s,"memory","context.jsonl"),patterns:R.getFilePath(s,"memory","patterns.json"),analysis:R.getFilePath(s,"analysis","repo-summary.md"),codePatterns:R.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await oo.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(D(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[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([oo.readFile(d,"utf-8"),oo.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(D(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)s[u]=m,this._cache.set(d,{content:m,mtime:p})}return s}async loadStateForCommand(e,t){let s={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"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await oo.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(D(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);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){return C(e)}getCacheStats(){return this._cache.stats()}},Jf=new aa,Ls=Jf});function ju(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ca(){if(ju()==="bun")return!0;try{let{execSync:r}=Tt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Fs(){return ju()==="bun"}var kr=E(()=>{"use strict";l(ju,"detectRuntime");l(ca,"isBunAvailable");l(Fs,"isBun")});var co={};Lt(co,{PrjctDatabase:()=>ao,default:()=>M,prjctDb:()=>P});import la from"node:fs";import Iu from"node:path";function zf(r){if(Fs()){let{Database:n}=Tt("bun:sqlite");return new n(r,{create:!0})}let e=Tt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Kf,Xf,ao,P,M,Z=E(()=>{"use strict";Se();kr();l(zf,"openDatabase");Kf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
15
15
|
-- =======================================================================
|
|
16
16
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
17
17
|
-- =======================================================================
|
|
@@ -461,47 +461,47 @@ var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Objec
|
|
|
461
461
|
|
|
462
462
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
|
|
463
463
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
|
|
464
|
-
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],
|
|
464
|
+
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Xf=3,ao=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Iu.join(R.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Xf&&this.evictLru();let s=this.getDbPath(e),n=Iu.dirname(s);la.existsSync(n)||la.mkdirSync(n,{recursive:!0});let o=zf(s);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 = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return la.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.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,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
|
|
465
465
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
466
466
|
version INTEGER PRIMARY KEY,
|
|
467
467
|
name TEXT NOT NULL,
|
|
468
468
|
applied_at TEXT NOT NULL
|
|
469
469
|
)
|
|
470
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of
|
|
471
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let p=
|
|
470
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Kf)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.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}},P=new ao,M=P});function lo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var He,Sr=E(()=>{"use strict";He={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"};l(lo,"calculateConfidence")});var uo,mo,po,ua=E(()=>{"use strict";Z();Sr();K();uo=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(),s=M.getDoc(e,t);return s!==null?(this._data=s,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();M.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},mo=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()}},po=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:S(),...t,type:t.type};M.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return M.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var go,$u=E(()=>{"use strict";Z();Sr();K();ua();go=class r extends uo{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))Array.isArray(t.contexts)||(t.contexts=[]),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,s,n="",o={}){let i=await this.load(e),a=S();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=lo(c.count,c.userConfirmed)):(c.value=s,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 n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=S(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=S();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=lo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=S(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:S(),confidence:lo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=S(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=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();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=M.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return M.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import Yf from"node:crypto";import{homedir as Qf}from"node:os";import{join as Zf}from"node:path";function z(){return Yf.randomUUID()}var TE,Ct=E(()=>{"use strict";l(z,"generateUUID");TE=Zf(Qf(),".prjct-cli","projects")});import{createHash as Mu}from"node:crypto";function br(r){return Mu("sha256").update(r).digest("hex")}function Us(r){return br(r).slice(0,16)}function _u(r){return Mu("md5").update(r).digest("hex")}var Hs=E(()=>{"use strict";l(br,"sha256");l(Us,"sha256Short");l(_u,"md5")});function ns(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var yn,da=E(()=>{"use strict";Ct();Z();Sr();K();Hs();l(ns,"rowToMemory");yn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(He));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=S(),d=Us(s),m=M.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(m)return m.id;if(i){let g=M.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return M.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
471
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let p=z();return M.run(e,`INSERT INTO memories
|
|
472
472
|
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
473
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}async updateMemory(e,t,s){let n
|
|
474
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,S(),t),!0}async deleteMemory(e,t){return
|
|
475
|
-
AND (${a}) ORDER BY updated_at DESC`,...c).map(
|
|
473
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}async updateMemory(e,t,s){let n=M.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?Us(i):n.content_hash;return M.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
474
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,S(),t),!0}async deleteMemory(e,t){return M.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(M.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",S(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return M.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
|
|
475
|
+
AND (${a}) ORDER BY updated_at DESC`,...c).map(ns)}async searchMemories(e,t,s=20,n=0){try{return M.query(e,`SELECT m.* FROM memories m
|
|
476
476
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
477
477
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
478
|
-
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(
|
|
478
|
+
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(ns)}catch{let o=`%${t}%`;return M.query(e,`SELECT * FROM memories
|
|
479
479
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
480
480
|
AND (title LIKE ? OR content LIKE ?)
|
|
481
|
-
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(
|
|
481
|
+
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(ns)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return M.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(ns);let o=n.join(" ");try{return M.query(e,`SELECT m.* FROM memories m
|
|
482
482
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
483
483
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
484
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(
|
|
485
|
-
Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return
|
|
484
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(ns)}catch{return M.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(ns)}}async getRelevantMemoriesWithMetrics(e,t){let n=M.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,m)=>({...d,relevanceScore:Math.max(10,100-m*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-m*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,m)=>d+m.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[He.COMMIT_STYLE],branch_naming:[He.BRANCH_NAMING],test_before_ship:[He.TEST_BEHAVIOR,He.SHIP_WORKFLOW],preferred_agent:[He.AGENT_PREFERENCE],code_style:[He.CODE_STYLE],verbosity:[He.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
485
|
+
Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return M.query(e,`SELECT m.* FROM memories m
|
|
486
486
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
487
487
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
488
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(
|
|
488
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(ns)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=M.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
489
489
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
490
|
-
GROUP BY title HAVING cnt > 1`,e),n=S();for(let o of s){let i
|
|
490
|
+
GROUP BY title HAVING cnt > 1`,e),n=S();for(let o of s){let i=M.query(e,`SELECT * FROM memories
|
|
491
491
|
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
492
492
|
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(p=>p.content!==a.content).map(p=>p.content)].filter((p,g,h)=>h.indexOf(p)===g).join(`
|
|
493
493
|
|
|
494
494
|
---
|
|
495
495
|
|
|
496
|
-
`),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)
|
|
497
|
-
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await
|
|
498
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
499
|
-
`).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:n.trim()}}async function
|
|
496
|
+
`),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&M.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let m=[];for(let p of c)M.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,p.id),m.push(p.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:m})}return t}async getMemoryById(e,t){let s=M.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?ns(s):null}async getAllMemories(e){return M.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(ns)}async getMemoryStats(e){let t=M.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var ma,eh,it,fo=E(()=>{"use strict";ua();$u();da();ma=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new yn,this._patternStore=new go,this._historyStore=new po,this._sessionStore=new mo}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,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(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,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}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)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(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 s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},eh=new ma,it=eh});import _t from"node:fs/promises";import Ht from"node:path";var pa,th,Ke,Ou=E(()=>{"use strict";W();Ue();V();pa=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Ht.join(this.projectPath,"package.json"),t=await _t.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(D(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Ht.join(this.projectPath,"Cargo.toml");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readRequirements(){try{let e=Ht.join(this.projectPath,"requirements.txt");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readGoMod(){try{let e=Ht.join(this.projectPath,"go.mod");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readGemfile(){try{let e=Ht.join(this.projectPath,"Gemfile");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readMixExs(){try{let e=Ht.join(this.projectPath,"mix.exs");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readPomXml(){try{let e=Ht.join(this.projectPath,"pom.xml");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async readComposerJson(){try{let e=Ht.join(this.projectPath,"composer.json"),t=await _t.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(D(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Ht.join(this.projectPath,"pyproject.toml");return await _t.readFile(e,"utf-8")}catch(e){if(D(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await N('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(`
|
|
497
|
+
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await _t.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(s=>t.some(n=>n.test(s)))}catch(e){if(D(e))return[];throw e}}async listDirectories(){try{return(await _t.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(D(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await N(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await N("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await N('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await N('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:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await N('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){return C(Ht.join(this.projectPath,e))}async readFile(e){try{let t=Ht.join(this.projectPath,e);return await _t.readFile(t,"utf-8")}catch(t){if(D(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await N(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
498
|
+
`).filter(Boolean)}catch{return[]}}},th=new pa,Ke=th});import fa from"node:fs";import sh from"node:fs/promises";import ho from"node:path";function ha(){if(Nu)return ga;Nu=!0;let r=ho.join(dt,"dist","templates.json");try{let e=fa.readFileSync(r,"utf-8");return ga=JSON.parse(e),ga}catch{return null}}function rh(r){let e=Ws.indexOf(r);e>-1&&Ws.splice(e,1),Ws.push(r)}function oh(){for(;wn.size>=nh&&Ws.length>0;){let r=Ws.shift();r&&wn.delete(r)}}function Lu(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
|
|
499
|
+
`).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:n.trim()}}async function Fu(r){if(wn.has(r))return rh(r),wn.get(r);let e,t=ha();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=ho.join(dt,"templates","commands",`${r}.md`);try{e=await sh.readFile(n,"utf-8")}catch{throw Jr.notFound(r)}}let s=Lu(e);return oh(),wn.set(r,s),Ws.push(r),s}async function ih(r){return(await Fu(r)).frontmatter["allowed-tools"]||[]}function ah(){wn.clear(),Ws.length=0}function wt(r){let e=ha();if(e?.[r])return e[r];let t=ho.join(dt,"templates",r);try{return fa.readFileSync(t,"utf-8")}catch{return null}}function kn(r){let e=ha();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=ho.join(dt,"templates",r);try{return fa.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var nh,wn,Ws,ga,Nu,ch,Uu,Gs=E(()=>{"use strict";ts();$t();nh=50,wn=new Map,Ws=[],ga=null,Nu=!1;l(ha,"loadBundle");l(rh,"updateLruOrder");l(oh,"evictLru");l(Lu,"parseFrontmatter");l(Fu,"load");l(ih,"getAllowedTools");l(ah,"clearCache");l(wt,"getTemplateContent");l(kn,"listTemplates");ch={load:Fu,parseFrontmatter:Lu,getAllowedTools:ih,clearCache:ah,getTemplateContent:wt,listTemplates:kn},Uu=ch});function uh(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(lh.has(r)||r.includes("prjct"))return{level:Sn.debug,name:"debug"};let e=Sn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function yo(r,e,t){return Hu>=r?(...s)=>console[t](e,...s):mh}var Sn,lh,Hu,dh,mh,ph,G,rs=E(()=>{"use strict";Sn={error:0,warn:1,info:2,debug:3},lh=new Set(["1","true","*"]);l(uh,"getLogLevel");({level:Hu,name:dh}=uh()),mh=l(()=>{},"noop");l(yo,"createLogMethod");ph={error:yo(Sn.error,"[prjct:error]","error"),warn:yo(Sn.warn,"[prjct:warn]","warn"),info:yo(Sn.info,"[prjct:info]","log"),debug:yo(Sn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Hu>=0,"isEnabled"),level:l(()=>dh,"level")},G=ph});function wo(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
|
|
500
500
|
|
|
501
|
-
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var
|
|
501
|
+
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var ya=E(()=>{"use strict";Gs();W();V();rs();$t();l(wo,"mergeWithMarkers")});import tt from"node:fs/promises";import ko from"node:os";import Te from"node:path";async function gh(){try{let r=Te.join(ko.homedir(),".prjct-cli","docs");await tt.mkdir(r,{recursive:!0});let e=kn("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Te.basename(n);await tt.writeFile(Te.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=($t(),lt(Ki)),s=Te.join(t,"templates/global/docs");try{let n=await tt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Te.join(s,o),a=Te.join(r,o),c=await tt.readFile(i,"utf-8");await tt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function fh(){let r=(pt(),lt(Mt)),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 tt.mkdir(e.configDir,{recursive:!0});let n=Te.join(e.configDir,e.contextFile),o=Wu;if(t!=="claude"){let g=wt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=($t(),lt(Ki)),b=Te.join(h,"templates","global",e.contextFile);try{o=await tt.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Wu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await tt.readFile(n,"utf-8"),a=!0}catch(g){if(D(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),h=i.substring(i.indexOf(u)+u.length);i=`${(g+h).replace(/\n{3,}/g,`
|
|
502
502
|
|
|
503
503
|
`).trim()}
|
|
504
|
-
`}let p=
|
|
504
|
+
`}let p=wo(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await tt.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:y(n),action:"failed"}}}function Gu(){let r=ko.homedir();return{claude:{commands:Te.join(r,".claude","commands"),config:Te.join(r,".claude"),router:Te.join(r,".claude","commands","p.md")},gemini:{commands:Te.join(r,".gemini","commands"),config:Te.join(r,".gemini"),router:Te.join(r,".gemini","commands","p.toml")}}}var Wu,os,hh,Re,is=E(()=>{"use strict";Gs();W();V();ya();Wu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
|
|
505
505
|
# p/ \u2014 Context layer for AI agents
|
|
506
506
|
|
|
507
507
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -517,22 +517,22 @@ Data:
|
|
|
517
517
|
|
|
518
518
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
519
519
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
520
|
-
`;l(
|
|
520
|
+
`;l(gh,"installDocs");l(fh,"installGlobalConfig");os=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=ko.homedir()}async ensureInit(){if(this._initialized)return;let t=await(pt(),lt(Mt)).getActiveProvider();this.commandsPath=Te.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(pt(),lt(Mt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Te.join(this.commandsPath,t);try{await tt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:y(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Te.join(this.commandsPath,t);try{await tt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Te.join(this.commandsPath,"p");try{if((await tt.stat(e).catch(()=>null))?.isDirectory())return await tt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return fh()}async cleanupAllLegacy(){let e=ko.homedir(),t=[],s=[Te.join(e,".claude","commands","p.md"),Te.join(e,".claude","commands","p.toml"),Te.join(e,".gemini","commands","p.md"),Te.join(e,".gemini","commands","p.toml")];for(let i of s)try{await tt.unlink(i),t.push(i)}catch{}let n=[Te.join(e,".claude","commands","p"),Te.join(e,".gemini","commands","p")];for(let i of n)try{(await tt.stat(i).catch(()=>null))?.isDirectory()&&(await tt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Te.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await tt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return gh()}};l(Gu,"getProviderPaths");hh=new os,Re=hh});import{z as Me}from"zod";function Ju(r,e="default"){let t=Bu[e]||Bu.default;return r/1e3*t}function So(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var yh,wh,Vu,qu,Bu,bo=E(()=>{"use strict";yh=Me.object({date:Me.string(),tokensSaved:Me.number(),syncs:Me.number(),avgCompressionRate:Me.number(),totalDuration:Me.number()}),wh=Me.object({agentName:Me.string(),usageCount:Me.number(),tokensSaved:Me.number()}),Vu=Me.object({totalTokensSaved:Me.number(),avgCompressionRate:Me.number(),syncCount:Me.number(),watchTriggers:Me.number(),avgSyncDuration:Me.number(),totalSyncDuration:Me.number(),agentUsage:Me.array(wh),dailyStats:Me.array(yh),firstSync:Me.string(),lastUpdated:Me.string()}),qu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Bu={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(Ju,"estimateCostSaved");l(So,"formatCost")});function zu(r,e){let t=[];Tr("Languages",r.languages,e.languages,t),Tr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),Tr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);Tr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Tr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function wa(r){if(!r.hasChanges)return`## Analysis Diff
|
|
521
521
|
|
|
522
522
|
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
523
|
-
`)}function
|
|
524
|
-
`)}function pr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var da=v(()=>{"use strict";l(Nu,"generateAnalysisDiff");l(ua,"formatAnalysisDiffMd");l(Lu,"formatAnalysisDiffText");l(pr,"diffStringArray")});var ma,pa,Fu,gr=v(()=>{"use strict";ma=[1,2,3,5,8,13,21],pa={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}},Fu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import ch from"node:fs/promises";import lh from"node:path";function hn(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 uh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...hn(p));let n=[/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 n){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...hn(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(...hn(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(...hn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...hn(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&&!Wu.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function dh(r){return r.split(/\s+/).flatMap(e=>hn(e)).filter(e=>e.length>1&&!Wu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function mh(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async a=>{try{let c=await ch.readFile(lh.join(r,a),"utf-8"),u=uh(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function ph(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function gh(r,e){let t=dh(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=ph(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function fh(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};$.setDoc(r,Gu,t)}function fo(r){let e=$.getDoc(r,Gu);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Vu(r,e){let t=await mh(r);return fh(e,t),t}function Bu(r,e,t=15){let s=fo(r);return s?gh(e,s).slice(0,t):[]}var Wu,Gu,ga=v(()=>{"use strict";gr();te();B();Wu=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"]);l(hn,"splitIdentifier");l(uh,"tokenizeFile");l(dh,"tokenizeQuery");l(mh,"buildIndex");l(ph,"idf");l(gh,"score");Gu="bm25-index";l(fh,"saveIndex");l(fo,"loadIndex");l(Vu,"indexProject");l(Bu,"queryFiles")});import fa from"node:fs/promises";import hs from"node:path";import{z as K}from"zod";async function Sh(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 s=hs.join(e,"package.json"),n=await fa.readFile(s,"utf-8"),o=JSON.parse(n),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(s){return D(s)?{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: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function bh(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 s=await Ph(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=kh[a];if(!c)continue;c.some(d=>n.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(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Th(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=hs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.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: ${n.join(", ")}`,durationMs:Date.now()-t}}async function vh(r,e){let t=Date.now();try{let s=await Ch(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Eh(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 s=[],n=[];for(let o of r.antiPatterns){let i=hs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Ju(r,e){let t=Date.now(),s=await Promise.all([Sh(r,e),bh(r,e),Th(r,e),vh(r,e),Eh(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function Ph(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await fa.readdir(n,{withFileTypes:!0});for(let i of o){let a=hs.join(n,i.name),c=hs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=hs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function Ch(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await fa.readdir(n,{withFileTypes:!0});for(let i of o){let a=hs.join(n,i.name),c=hs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var hh,yh,wh,ha,CP,kh,qu=v(()=>{"use strict";U();B();Br();hh=K.enum(["draft","verified","sealed"]),yh=K.object({name:K.string(),description:K.string(),location:K.string().optional(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),wh=K.object({issue:K.string(),file:K.string(),suggestion:K.string(),severity:K.enum(["low","medium","high"]).optional(),language:K.string().optional(),framework:K.string().optional(),source:K.enum(["baseline","repo","context7","feedback"]).optional(),confidence:K.number().min(0).max(1).optional()}),ha=K.object({projectId:K.string(),languages:K.array(K.string()),frameworks:K.array(K.string()),packageManager:K.string().optional(),sourceDir:K.string().optional(),testDir:K.string().optional(),configFiles:K.array(K.string()),fileCount:K.number(),patterns:K.array(yh),antiPatterns:K.array(wh),analyzedAt:K.string(),modelMetadata:un.optional(),status:hh.default("draft"),commitHash:K.string().optional(),signature:K.string().optional(),sealedAt:K.string().optional(),verifiedAt:K.string().optional()}),CP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},kh={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(Sh,"verifyFrameworks");l(bh,"verifyLanguages");l(Th,"verifyPatternLocations");l(vh,"verifyFileCount");l(Eh,"verifyAntiPatternFiles");l(Ju,"semanticVerify");l(Ph,"getProjectExtensions");l(Ch,"countProjectFiles")});var ya,ys,wa=v(()=>{"use strict";ye();q();B();ya=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Pe(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Pe(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:S(),success:!0};await le(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Pe(t,null)}},ys=new ya});var Je,ns=v(()=>{"use strict";wa();Rs();q();te();Je=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new dn({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 s=P.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){P.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:S(),projectId:e};await ys.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:S()};await this.publishEvent(e,o,i)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ka,qe,yn=v(()=>{"use strict";qu();da();q();Ms();ns();ka=class extends Je{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};ha.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:S()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.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 s=this.computeSignature(t.draft),n=S(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ha.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=S();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Nu(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await Ju(n,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 mr(JSON.stringify(t))}},qe=new ka});var Sa,xh,Lt,fr=v(()=>{"use strict";q();te();Sa=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=S();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=P.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?P.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return P.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},xh=new Sa,Lt=xh});import{z as T}from"zod";var Ah,ho,Rh,Dh,Ih,ba,Ku,Xu,Yu,Ta,zu,jh,$h,Mh,Qu,Zu,ed,_h,Oh,QP,va=v(()=>{"use strict";Br();Ah=T.enum(["low","medium","high","critical"]),ho=T.enum(["feature","bug","improvement","chore"]),Rh=T.enum(["active","backlog","previously_active"]),Dh=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ih=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ba=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()}),Ku=T.object({output:T.string().min(1,"Subtask output is required"),summary:ba}),Xu=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Dh,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:ba.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),Yu=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Ta=T.object({id:T.string(),description:T.string(),type:ho.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Xu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:Yu.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:un.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),zu=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:ho.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(Xu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:Yu.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:un.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),jh=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()}),$h=T.object({taskId:T.string(),title:T.string(),classification:ho,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(ba),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:jh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Mh=Ta.extend({workspaceId:T.string(),worktreePath:T.string().optional(),agentSessionId:T.string().optional(),jiraId:T.string().optional(),jiraUuid:T.string().optional(),dispatchedFrom:T.string().optional()}),Qu=T.object({currentTask:Ta.nullable(),previousTask:zu.nullable().optional(),pausedTasks:T.array(zu).optional(),taskHistory:T.array($h).optional(),activeTasks:T.array(Mh).optional(),lastUpdated:T.string()}),Zu=T.object({id:T.string(),description:T.string(),priority:Ah,type:ho,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Rh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),ed=T.object({tasks:T.array(Zu),lastUpdated:T.string()}),_h=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),Oh=T.object({type:Ih,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),QP=T.object({projectId:T.string(),currentTask:Ta.nullable(),queue:T.array(Zu),stats:_h,recentActivity:T.array(Oh),lastSync:T.string()})});var hr,Ea,Ns,Pa=v(()=>{"use strict";hr={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"}},Ea=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.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 s?"working":"idle"}}canTransition(e,t){let s=hr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}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 hr[e]}getPrompt(e){return hr[e].prompt}getValidCommands(e){return hr[e].transitions}formatNextSteps(e){return hr[e].transitions.map(s=>{switch(s){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. ${s}`}})}},Ns=new Ea});var rs,Ca,Mt,Ls=v(()=>{"use strict";vt();q();te();rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ca=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=J(),n=S();return P.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=S();return P.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(J(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=P.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(P.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);P.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Mt=new Ca});var xa,O,ft=v(()=>{"use strict";vt();va();q();Pa();Ls();ns();xa=class extends Je{static{l(this,"StateStorage")}constructor(){super("state.json",Qu)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Ns.getCurrentState(e),n=Ns.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:S()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:S()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:S()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=S(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:S(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:S()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,h)=>h!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:S(),sessionId:i.sessionId??J()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:S()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Mt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:S()}));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:[],activeTasks:[],lastUpdated:S()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.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 s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(p=>p.feedback),n=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],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 startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:S()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:S()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=S(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:S()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:S()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?S():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:S()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Ku.safeParse(t);if(!s.success){let h=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
523
|
+
`)}function Ku(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
|
|
524
|
+
`)}function Tr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var ka=E(()=>{"use strict";l(zu,"generateAnalysisDiff");l(wa,"formatAnalysisDiffMd");l(Ku,"formatAnalysisDiffText");l(Tr,"diffStringArray")});var Sa,ba,Xu,vr=E(()=>{"use strict";Sa=[1,2,3,5,8,13,21],ba={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}},Xu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import kh from"node:fs/promises";import Sh from"node:path";function bn(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 bh(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...bn(p));let n=[/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 n){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...bn(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(...bn(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(...bn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...bn(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&&!Zu.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function Th(r){return r.split(/\s+/).flatMap(e=>bn(e)).filter(e=>e.length>1&&!Zu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function vh(r){let e=await mn(r),t={},s={},n=0,o=await pn(e,50,async a=>{try{let c=await kh.readFile(Sh.join(r,a),"utf-8"),u=bh(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Eh(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Ph(r,e){let t=Th(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=Eh(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Ch(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};M.setDoc(r,ed,t)}function To(r){let e=M.getDoc(r,ed);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function td(r,e){let t=await vh(r);return Ch(e,t),t}function sd(r,e,t=15){let s=To(r);return s?Ph(e,s).slice(0,t):[]}var Zu,ed,Ta=E(()=>{"use strict";vr();Z();V();Zu=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"]);l(bn,"splitIdentifier");l(bh,"tokenizeFile");l(Th,"tokenizeQuery");l(vh,"buildIndex");l(Eh,"idf");l(Ph,"score");ed="bm25-index";l(Ch,"saveIndex");l(To,"loadIndex");l(td,"indexProject");l(sd,"queryFiles")});import va from"node:fs/promises";import bs from"node:path";import{z as Y}from"zod";async function jh(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 s=bs.join(e,"package.json"),n=await va.readFile(s,"utf-8"),o=JSON.parse(n),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(s){return D(s)?{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: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Ih(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 s=await Oh(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=Dh[a];if(!c)continue;c.some(d=>n.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(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function $h(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=bs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.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: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Mh(r,e){let t=Date.now();try{let s=await Nh(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function _h(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 s=[],n=[];for(let o of r.antiPatterns){let i=bs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function nd(r,e){let t=Date.now(),s=await Promise.all([jh(r,e),Ih(r,e),$h(r,e),Mh(r,e),_h(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function Oh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await va.readdir(n,{withFileTypes:!0});for(let i of o){let a=bs.join(n,i.name),c=bs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=bs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function Nh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await va.readdir(n,{withFileTypes:!0});for(let i of o){let a=bs.join(n,i.name),c=bs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var xh,Rh,Ah,Ea,NP,Dh,rd=E(()=>{"use strict";W();V();Qr();xh=Y.enum(["draft","verified","sealed"]),Rh=Y.object({name:Y.string(),description:Y.string(),location:Y.string().optional(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),Ah=Y.object({issue:Y.string(),file:Y.string(),suggestion:Y.string(),severity:Y.enum(["low","medium","high"]).optional(),language:Y.string().optional(),framework:Y.string().optional(),source:Y.enum(["baseline","repo","context7","feedback"]).optional(),confidence:Y.number().min(0).max(1).optional()}),Ea=Y.object({projectId:Y.string(),languages:Y.array(Y.string()),frameworks:Y.array(Y.string()),packageManager:Y.string().optional(),sourceDir:Y.string().optional(),testDir:Y.string().optional(),configFiles:Y.array(Y.string()),fileCount:Y.number(),patterns:Y.array(Rh),antiPatterns:Y.array(Ah),analyzedAt:Y.string(),modelMetadata:fn.optional(),status:xh.default("draft"),commitHash:Y.string().optional(),signature:Y.string().optional(),sealedAt:Y.string().optional(),verifiedAt:Y.string().optional()}),NP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Dh={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(jh,"verifyFrameworks");l(Ih,"verifyLanguages");l($h,"verifyPatternLocations");l(Mh,"verifyFileCount");l(_h,"verifyAntiPatternFiles");l(nd,"semanticVerify");l(Oh,"getProjectExtensions");l(Nh,"countProjectFiles")});var Pa,Ts,Ca=E(()=>{"use strict";Se();K();V();Pa=class{static{l(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await be(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await be(t,[])??[]}async clearPending(e){let t=R.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=R.getLastSyncPath(e),s={timestamp:S(),success:!0};await ce(t,s)}async getLastSync(e){let t=R.getLastSyncPath(e);return await be(t,null)}},Ts=new Pa});var Xe,as=E(()=>{"use strict";Ca();Os();K();Z();Xe=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hn({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 s=P.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){P.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:S(),projectId:e};await Ts.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:S()};await this.publishEvent(e,o,i)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var xa,Ye,Tn=E(()=>{"use strict";rd();ka();K();Hs();as();xa=class extends Xe{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};Ea.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:S()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.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 s=this.computeSignature(t.draft),n=S(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Ea.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=S();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:zu(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await nd(n,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 br(JSON.stringify(t))}},Ye=new xa});var Ra,Lh,Wt,Er=E(()=>{"use strict";K();Z();Ra=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=S();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=P.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?P.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return P.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},Lh=new Ra,Wt=Lh});import{z as T}from"zod";var Fh,vo,Uh,Hh,Wh,Aa,id,ad,cd,Da,od,Gh,Bh,Vh,ld,ud,dd,qh,Jh,lC,ja=E(()=>{"use strict";Qr();Fh=T.enum(["low","medium","high","critical"]),vo=T.enum(["feature","bug","improvement","chore"]),Uh=T.enum(["active","backlog","previously_active"]),Hh=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Wh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Aa=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()}),id=T.object({output:T.string().min(1,"Subtask output is required"),summary:Aa}),ad=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Hh,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:Aa.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),cd=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Da=T.object({id:T.string(),description:T.string(),type:vo.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(ad).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:cd.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:fn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),od=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:vo.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(ad).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:cd.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:fn.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Gh=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()}),Bh=T.object({taskId:T.string(),title:T.string(),classification:vo,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(Aa),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:Gh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),Vh=Da.extend({workspaceId:T.string(),worktreePath:T.string().optional(),agentSessionId:T.string().optional(),jiraId:T.string().optional(),jiraUuid:T.string().optional(),dispatchedFrom:T.string().optional()}),ld=T.object({currentTask:Da.nullable(),previousTask:od.nullable().optional(),pausedTasks:T.array(od).optional(),taskHistory:T.array(Bh).optional(),activeTasks:T.array(Vh).optional(),lastUpdated:T.string()}),ud=T.object({id:T.string(),description:T.string(),priority:Fh,type:vo,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Uh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),dd=T.object({tasks:T.array(ud),lastUpdated:T.string()}),qh=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),Jh=T.object({type:Wh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),lC=T.object({projectId:T.string(),currentTask:Da.nullable(),queue:T.array(ud),stats:qh,recentActivity:T.array(Jh),lastSync:T.string()})});var Pr,Ia,Bs,$a=E(()=>{"use strict";Pr={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"}},Ia=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.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 s?"working":"idle"}}canTransition(e,t){let s=Pr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}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 Pr[e]}getPrompt(e){return Pr[e].prompt}getValidCommands(e){return Pr[e].transitions}formatNextSteps(e){return Pr[e].transitions.map(s=>{switch(s){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. ${s}`}})}},Bs=new Ia});var cs,Ma,Ot,Vs=E(()=>{"use strict";Ct();K();Z();cs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ma=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=z(),n=S();return P.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=S();return P.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=P.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(P.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);P.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ot=new Ma});var _a,_,gt=E(()=>{"use strict";Ct();ja();K();$a();Vs();as();_a=class extends Xe{static{l(this,"StateStorage")}constructor(){super("state.json",ld)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Bs.getCurrentState(e),n=Bs.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:S()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:S()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:S()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=S(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:S(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:S()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,h)=>h!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:S(),sessionId:i.sessionId??z()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:S()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Ot.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:S()}));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:[],activeTasks:[],lastUpdated:S()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.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 s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(p=>p.feedback),n=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],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 startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:S()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:S()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=S(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:S()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:S()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?S():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:S()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=id.safeParse(t);if(!s.success){let h=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
525
525
|
${h.join(`
|
|
526
|
-
`)}`)}let{output:n,summary:o}=s.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:S(),output:n,summary:o};let d=u.filter(h=>h.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:S()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:S()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,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 s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||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(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:S(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:S(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:S()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},
|
|
527
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,
|
|
526
|
+
`)}`)}let{output:n,summary:o}=s.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:S(),output:n,summary:o};let d=u.filter(h=>h.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:S()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:S()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,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 s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||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(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:S(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:S(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()});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:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:S()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:S()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:S()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new _a});import md from"node:fs/promises";import pd from"node:path";async function Na(r,e,t,s){let[n,o,i,a]=await Promise.all([Xh(r,e,s),Yh(r),Qh(r),Zh(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,zh).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Xh(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=sd(r,n,Oa*2);for(let a of o){if(s.length>=Oa)break;try{let c=pd.join(e,a.path),u=await md.readFile(c,"utf-8");u.length>Eo*3?s.push({path:a.path,content:`${u.slice(0,Eo)}
|
|
527
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Eo),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(s.length>=Oa)break;if(!s.some(c=>c.path===a))try{let c=pd.join(e,a),u=await md.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Eo),reason:"entry point"})}catch{}}return s}async function Yh(r){try{let e=await Ye.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function Qh(r){try{return(await _.getTaskHistory(r)).slice(0,Kh).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Zh(r){try{let e=Wt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return G.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Eo,Oa,zh,Kh,gd=E(()=>{"use strict";Ta();Tn();Er();gt();rs();Eo=3e3,Oa=15,zh=15,Kh=10;l(Na,"buildAnalysisPayload");l(Xh,"selectCodeSamples");l(Yh,"getExistingPatterns");l(Qh,"getTaskHistory");l(Zh,"getPreviousAnalysisSummary")});var Po=E(()=>{"use strict"});import ls from"chalk";function fd(r){return Math.ceil(r.length/4)}function hd(r){let e=r.split(`
|
|
528
528
|
`),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
|
|
529
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
530
|
-
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
529
|
+
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function La(r){return r.includes("<!-- prjct:preserve")}function yd(r,e){let t=hd(r),s=hd(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:fd(r),tokensAfter:fd(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)La(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
530
|
+
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(La(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
531
531
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
532
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
533
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
532
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!La(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
533
|
+
`).length}),n.hasChanges=!0)}return n}function wd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?ls.green:p=>p,o=t?ls.red:p=>p,i=t?ls.yellow:p=>p,a=t?ls.dim:p=>p,c=t?ls.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
534
534
|
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let p of r.added)s.push(n(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of r.preserved)s.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}s.push(""),s.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(n(`+${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`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
535
|
-
`)}function
|
|
535
|
+
`)}function kd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?ls.green:c=>c,o=t?ls.red:c=>c,i=t?ls.cyan:c=>c,a=t?ls.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
536
536
|
`))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
537
537
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
538
538
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -543,19 +543,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Da(r){return r.incl
|
|
|
543
543
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
544
544
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
545
545
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
546
|
-
`)}var
|
|
546
|
+
`)}var Sd=E(()=>{"use strict";Po();l(fd,"estimateTokens");l(hd,"parseMarkdownSections");l(La,"isPreservedSection");l(yd,"generateSyncDiff");l(wd,"formatDiffPreview");l(kd,"formatFullDiff")});var bd,Td,Fa,vd,Ed=E(()=>{"use strict";hr();Z();Os();K();bd=50,Td=200,Fa=class{static{l(this,"SessionTracker")}async read(e){try{return P.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){P.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return ks(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=S();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=S();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>bd&&(n.current.commands=n.current.commands.slice(-bd)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=S();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>Td&&(n.current.files=n.current.files.slice(-Td)),await this.write(e,n)}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 s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:ut(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:ut(u),commandCount:s.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}},vd=new Fa});var ty,Ua,Co,Ha=E(()=>{"use strict";Z();W();Ue();Ed();ty={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ua=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ty,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=P.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await N("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([N(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),N(`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(`
|
|
547
547
|
`).filter(Boolean):[],n){let c=new Date(n),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(s){return t.reason=`Error checking staleness: ${y(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);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(`
|
|
548
|
-
`)}async getSessionInfo(e){return
|
|
548
|
+
`)}async getSessionInfo(e){return vd.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
549
549
|
`);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
550
|
-
`)}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}},
|
|
551
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&
|
|
552
|
-
`);throw new
|
|
553
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
550
|
+
`)}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}},Co=l((r,e)=>new Ua(r,e),"createStalenessChecker")});import Pd from"node:fs/promises";import En from"node:path";function sy(r){let e=[],t,s=new RegExp(ou.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function ny(r,e,t){let s;if(r.startsWith("@/"))s=En.join(t,"src",r.slice(2));else{let n=En.dirname(En.join(t,e));s=En.resolve(n,r)}for(let n of ru){let o=s+n;try{if((await Pd.stat(o)).isFile())return En.relative(t,o)}catch{}}return null}async function ry(r){let e=await mn(r),t={},s={},n=0,o=await pn(e,50,async i=>{try{let a=await Pd.readFile(En.join(r,i),"utf-8"),c=sy(a),u=[];for(let d of c){let m=await ny(d,i,r);m&&m!==i&&u.push(m)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function oy(r,e){M.setDoc(r,Cd,e)}function xo(r){return M.getDoc(r,Cd)}async function xd(r,e){let t=await ry(r);return oy(e,t),t}var Cd,Wa=E(()=>{"use strict";Vi();Z();V();l(sy,"extractImportSources");l(ny,"resolveImport");l(ry,"buildGraph");Cd="import-graph";l(oy,"saveGraph");l(xo,"loadGraph");l(xd,"indexImports")});function Rd(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=xo(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Ad(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var Dd=E(()=>{"use strict";Wa();l(Rd,"propagateChanges");l(Ad,"affectedDomains")});import jd from"node:fs/promises";import iy from"node:path";function ay(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 cy(r){let e=await mn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await pn(e,100,async n=>{try{let o=iy.join(r,n),[i,a]=await Promise.all([jd.readFile(o,"utf-8"),jd.stat(o)]);return{path:n,hash:ay(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function ly(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function Ga(r,e){let t=M.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),M.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function uy(r){let e=new Map;try{let t=M.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function Ba(r,e){let[t,s]=await Promise.all([cy(r),Promise.resolve(uy(e))]);return{diff:ly(t,s),currentHashes:t}}function Id(r){return M.hasDoc(r,"file-hashes-meta")}var $d=E(()=>{"use strict";Z();V();l(ay,"hashContent");l(cy,"computeHashes");l(ly,"diffHashes");l(Ga,"saveHashes");l(uy,"loadHashes");l(Ba,"detectChanges");l(Id,"hasHashRegistry")});async function my(r,e=100){try{let{stdout:t}=await N(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
|
|
551
|
+
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&py(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function py(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 gy(r,e=100){let t=await my(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=fy(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<2||m<2)continue;let p=d+m-a,g=p>0?a/p:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function fy(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function hy(r,e){M.setDoc(r,Od,e)}function Nd(r){return M.getDoc(r,Od)}async function Ld(r,e,t=100){let s=await gy(r,t);return hy(e,s),s}var Od,Fd=E(()=>{"use strict";vr();Z();Ue();l(my,"parseGitLog");l(py,"isSourceFile");l(gy,"buildMatrix");l(fy,"pairKey");Od="cochange-index";l(hy,"saveMatrix");l(Nd,"loadMatrix");l(Ld,"indexCoChanges")});import Gd from"node:fs/promises";import Ud from"node:os";import Va from"node:path";function wy(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:qa}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:qa}}}}function Bd(){return wy().mcpServers?.context7||qa}function Hd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Va.join(Ud.tmpdir(),"prjct-context7-test","mcp.json"):Va.join(Ud.homedir(),".claude","mcp.json")}async function Wd(r){try{let e=await Gd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e))return{};throw e}}async function ky(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Bd(),e=[...r.args||[],"--help"];await _s(r.command||"npx",e,{timeout:15e3})}var qa,Pn,Ja,Sy,us,Cr=E(()=>{"use strict";Gs();hr();W();Ue();V();qa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Pn=null;l(wy,"parseTemplateConfig");l(Bd,"getContext7Config");l(Hd,"getConfigPath");l(Wd,"readConfig");l(ky,"runSmokeCheck");Ja=class{static{l(this,"Context7Service")}async install(){let e=Hd(),t=Va.dirname(e);await Gd.mkdir(t,{recursive:!0});let s=await Wd(e),n=s.mcpServers||{};return n.context7=Bd(),s.mcpServers=n,await ce(e,s),Pn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Pn&&Date.now()-Pn.at<3e5)return Pn.status;let e=Hd(),n=((await Wd(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await ky();let o={installed:!0,verified:!0,configPath:e};return Pn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return Pn={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},Sy=new Ja,us=Sy});var Ro,za=E(()=>{"use strict";Ro={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 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Ka(r,e){return{...Ro[r],...e}}function xr(r,e,t){return{message:r,hint:e,...t}}var Ao=E(()=>{"use strict";za();za();l(Ka,"getError");l(xr,"createError")});import{execFileSync as Vd,execSync as by}from"node:child_process";var Do,Xa,jo,qd,Jd=E(()=>{"use strict";Os();Ao();Do={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"}},Xa=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 s=Do[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Do[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new jo(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Do[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
552
|
+
`);throw new jo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
553
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Do),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=by(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:xr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:xr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Vd(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Vd(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:xr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?ks(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())}},jo=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}},qd=new Xa});function Cn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Ty[r]}var ie,Ya,Qa,Io,Ty,Gt,zd,qs=E(()=>{"use strict";ie={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ya=["feature","spec","design","refactor","migrate"],Qa=["ship","cleanup","git","migrate"],Io=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ty={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Cn,"getTimeout");Gt={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},zd={HISTORY_MAX:100}});import Za from"node:fs/promises";import vy from"node:os";import Kd from"node:path";var ec,Ey,$o,tc=E(()=>{"use strict";W();V();ec=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=vy.homedir(),this.configDir=Kd.join(this.homeDir,".prjct-cli","config"),this.configFile=Kd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Za.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Za.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await ce(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",y(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"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 ce(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Za.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Ey=new ec,$o=Ey});var nc={};Lt(nc,{installAntigravitySkill:()=>em,installCodexSkill:()=>sc,needsAntigravityInstallation:()=>Ay,run:()=>Zd,verifyCodexPRouterReady:()=>_o});import{execFileSync as Py}from"node:child_process";import ee from"node:fs/promises";import Js from"node:os";import ae from"node:path";import fe from"chalk";async function Cy(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!qd.isAvailable("npm"))return console.log(`${fe.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${fe.dim(`Install ${r.displayName} using one of:`)}`),console.log(fe.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(fe.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(fe.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(fe.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Py("npm",["install","-g",e],{stdio:"inherit",timeout:Cn("NPM_INSTALL")}),console.log(""),console.log(`${fe.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(fe.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(fe.dim("The npm install took too long. Try:")),console.log(fe.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(fe.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(fe.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(fe.dim("Alternative installation methods:")),console.log(fe.dim(` \u2022 npm: npm install -g ${e}`)),console.log(fe.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(fe.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(fe.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Zd(){let r=await yr(),e=await ea(),t=mt[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=mt[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Cy(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Re.detectActiveProvider()){let p=await Re.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await Re.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Re.installDocs(),await $y(),await us.ensureReady()}}else if(a==="gemini"){await xy()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Ry();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await so()).installed&&(await em()).success&&console.log(` ${fe.green("\u2713")} Antigravity skill installed`),(await Ns()).installed){if(!(await sc()).success)throw new Error("Codex skill installation failed");let c=await _o({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${fe.green("\u2713")} Codex skill installed`),console.log(` ${fe.green("\u2713")} Codex p. router ready`)}await $o.saveConfig(Ce,await Re.getInstallPath(),e.provider),await Iy();for(let a of s.providers)My(a,mt[a.provider]);return s}async function xy(){try{let r=ae.join(Js.homedir(),".gemini","commands"),e=ae.join(r,"p.toml");try{return await ee.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return G.warn(`Gemini router cleanup warning: ${y(r)}`),!1}}async function Ry(){try{let r=ae.join(Js.homedir(),".gemini"),e=ae.join(r,"GEMINI.md");await ee.mkdir(r,{recursive:!0});let t=wt("global/GEMINI.md");if(!t){let c=ae.join(dt,"templates","global","GEMINI.md");t=await ee.readFile(c,"utf-8")}let s="",n=!1;try{s=await ee.readFile(e,"utf-8"),n=!0}catch(c){if(D(c))n=!1;else throw c}let a=wo(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await ee.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return G.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function em(){try{let r=ae.join(Js.homedir(),".gemini","antigravity","skills"),e=ae.join(r,"prjct"),t=ae.join(e,"SKILL.md");await ee.mkdir(e,{recursive:!0});let s=await C(t),n=wt("antigravity/SKILL.md");if(!n){let o=ae.join(dt,"templates","antigravity","SKILL.md");if(!await C(o))return G.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await ee.readFile(o,"utf-8")}return await ee.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return G.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ay(){let r=await so();return r.installed&&!r.skillInstalled}function sm(){return ae.join(Js.homedir(),".codex","skills","prjct","SKILL.md")}function Dy(r){return`<!-- ${tm}: ${JSON.stringify({version:Ce,templateHash:r})} -->`}function Xd(r){let e=r.match(new RegExp(`<!--\\s*${tm}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function jy(r){return br(r)}async function nm(){let r=wt("codex/SKILL.md");if(r)return r;let e=ae.join(dt,"templates","codex","SKILL.md");return await C(e)?ee.readFile(e,"utf-8"):null}function rm(r){let e=r.trimEnd(),t=jy(e),s=Dy(t);return{content:`${e}
|
|
554
554
|
|
|
555
555
|
${s}
|
|
556
|
-
`,templateHash:t}}async function
|
|
556
|
+
`,templateHash:t}}async function sc(){try{let r=sm(),e=ae.dirname(r);await ee.mkdir(e,{recursive:!0});let t=await C(r),s=await nm();if(!s)return G.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=rm(s);return t&&await ee.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await ee.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return G.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function _o(r={}){let e=sm();if(!(await Ns()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await nm();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=rm(s),o=l(async()=>r.autoRepair?(await sc()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await ee.readFile(e,"utf-8").catch(()=>"");let a=Xd(i);if(!(a?.version===Ce&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await ee.readFile(e,"utf-8").catch(()=>""),a=Xd(i),!(a?.version===Ce&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function Iy(){try{let r=ae.join(Js.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await ee.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=P.getDoc(s,"project");if(!n)continue;n.cliVersion!==Ce&&(n.cliVersion=Ce,P.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${fe.green("\u2713")} Updated ${t} project(s) to v${Ce}`)}catch(r){D(r)||G.warn(`Migration warning: ${y(r)}`)}}async function Yd(r,e){let t={};if(await C(r))try{t=await be(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await ce(r,t)}async function $y(){try{let r=ae.join(Js.homedir(),".claude"),e=ae.join(r,"settings.json"),t=ae.join(r,"prjct-statusline.sh"),s=ae.join(Js.homedir(),".prjct-cli","statusline"),n=ae.join(s,"statusline.sh"),o=ae.join(s,"themes"),i=ae.join(s,"lib"),a=ae.join(s,"components"),c=ae.join(s,"config.json"),u=ae.join(dt,"assets","statusline"),d=ae.join(u,"statusline.sh"),m=ae.join(u,"themes"),p=ae.join(u,"lib"),g=ae.join(u,"components"),h=ae.join(u,"default-config.json");if(await C(r)||await ee.mkdir(r,{recursive:!0}),await C(s)||await ee.mkdir(s,{recursive:!0}),await C(o)||await ee.mkdir(o,{recursive:!0}),await C(i)||await ee.mkdir(i,{recursive:!0}),await C(a)||await ee.mkdir(a,{recursive:!0}),await C(n)){let b=await ee.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let w=b.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==Ce){let v=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ce}"`);await ee.writeFile(n,v,{mode:493})}await Mo(p,i),await Mo(g,a),await Qd(t,n),await Yd(e,t);return}}if(await C(d)){let b=await ee.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ce}"`),await ee.writeFile(n,b,{mode:493}),await Mo(p,i),await Mo(g,a),await C(m)){let w=await ee.readdir(m);for(let v of w){let A=ae.join(m,v),F=ae.join(o,v);await ee.copyFile(A,F)}}!await C(c)&&await C(h)&&await ee.copyFile(h,c)}else{let b=`#!/bin/bash
|
|
557
557
|
# prjct Status Line for Claude Code
|
|
558
|
-
CLI_VERSION="${
|
|
558
|
+
CLI_VERSION="${Ce}"
|
|
559
559
|
input=$(cat)
|
|
560
560
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
561
561
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -584,7 +584,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
584
584
|
fi
|
|
585
585
|
fi
|
|
586
586
|
echo "prjct"
|
|
587
|
-
`;await Q.writeFile(n,b,{mode:493})}await Hd(t,n),await Ud(e,t)}catch(r){D(r)||H.warn(`Status line warning: ${y(r)}`)}}async function xo(r,e){if(!await C(r))return;let t=await Q.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=oe.join(r,s),o=oe.join(e,s);await Q.copyFile(n,o),await Q.chmod(o,493)}}async function Hd(r,e){try{if(await C(r)){if((await Q.lstat(r)).isSymbolicLink()&&await Q.readlink(r)===e)return;await Q.unlink(r)}await Q.symlink(e,r)}catch{try{await C(e)&&(await Q.copyFile(e,r),await Q.chmod(r,493))}catch(s){D(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function vy(r,e){if(console.log(""),r.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var Vd,Ey,Ro=v(()=>{"use strict";Os();yr();Od();te();U();Fs();B();Ms();es();It();dt();ss();qa();la();l(fy,"installAICLI");l(Wd,"run");l(hy,"installGeminiRouter");l(yy,"installGeminiGlobalConfig");l(Gd,"installAntigravitySkill");l(wy,"needsAntigravityInstallation");Vd="prjct-codex-router";l(Bd,"getCodexSkillPath");l(ky,"getCodexSkillMetadata");l(Fd,"parseCodexSkillMetadata");l(Sy,"hashContent");l(Jd,"loadCodexSkillTemplate");l(qd,"buildCodexSkillContent");l(za,"installCodexSkill");l(Ao,"verifyCodexPRouterReady");l(by,"migrateProjectsCliVersion");l(Ud,"ensureStatusLineSettings");l(Ty,"installStatusLine");l(xo,"installStatusLineModules");l(Hd,"ensureStatusLineSymlink");l(vy,"showResults");Ey=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Ey&&Wd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as G}from"zod";var Py,Cy,zd,xy,Ay,Ry,Dy,Iy,Kd,oA,Xd=v(()=>{"use strict";Py=G.enum(["low","medium","high"]),Cy=G.enum(["pending","converted","completed","archived","dormant"]),zd=G.enum(["high","medium","low"]),xy=G.object({impact:zd,effort:zd}),Ay=G.object({frontend:G.string().optional(),backend:G.string().optional(),payments:G.string().optional(),ai:G.string().optional(),deploy:G.string().optional(),other:G.array(G.string()).optional()}),Ry=G.object({name:G.string(),description:G.string()}),Dy=G.object({name:G.string(),description:G.string().optional()}),Iy=G.object({id:G.string(),text:G.string(),details:G.string().optional(),priority:Py,status:Cy,tags:G.array(G.string()),addedAt:G.string(),completedAt:G.string().optional(),convertedTo:G.string().optional(),source:G.string().optional(),sourceFiles:G.array(G.string()).optional(),painPoints:G.array(G.string()).optional(),solutions:G.array(G.string()).optional(),filesAffected:G.array(G.string()).optional(),impactEffort:xy.optional(),implementationNotes:G.string().optional(),stack:Ay.optional(),modules:G.array(Ry).optional(),roles:G.array(Dy).optional(),risks:G.array(G.string()).optional(),risksCount:G.number().optional()}),Kd=G.object({ideas:G.array(Iy),lastUpdated:G.string()}),oA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Xa,Ue,ws=v(()=>{"use strict";Xd();vt();q();Ls();ns();Xa=class extends Je{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kd)}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(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:J(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:S()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:S()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:S()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:S()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:S()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:S()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:S()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.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:S()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=ds(rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:S()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Ue=new Xa});var Ya,Tn,Qa=v(()=>{"use strict";go();q();ns();Ya=class extends Je{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Mu)}getDefault(){return{..._u}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],p=m.findIndex(E=>E.date===o);if(p>=0){let E=m[p];m[p]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+n)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],b=m.filter(E=>E.date>=h),k=[...i.agentUsage];if(t.agents)for(let E of t.agents){let R=k.findIndex(W=>W.agentName===E);R>=0?k[R]={...k[R],usageCount:k[R].usageCount+1,tokensSaved:k[R].tokensSaved+Math.floor(s/t.agents.length)}:k.push({agentName:E,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:k,dailyStats:b,firstSync:i.firstSync||S(),lastUpdated:S()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ou(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 s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.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 s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Tn=new Ya});import Z from"node:fs/promises";import X from"node:path";async function Do(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(P.exists(r)&&P.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=X.join(s,"storage"),o=X.join(s,"index"),i=X.join(s,"memory");t.backupDir=await jy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of tc){let d=X.join(n,c),m=await Ut(d);if(m===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,m),Yd(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of ec){let d=X.join(o,c),m=await Ut(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),Qd(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Uy(r,o,t),await Hy(r,o,t),await Wy(r,i,t),await Gy(r,i,t);let a=X.join(s,"sessions");return await Vy(r,a,t),t.errors.length===0&&await By(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function jy(r,e,t){let s=X.join(r,"backup");return await Z.mkdir(s,{recursive:!0}),await Z.mkdir(X.join(s,"index"),{recursive:!0}),await Z.mkdir(X.join(s,"memory"),{recursive:!0}),await Za(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Za(e,X.join(s,"index")),await Za(t,X.join(s,"memory")),s}async function Za(r,e,t){try{let s=await Z.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=X.join(r,n.name),i=X.join(e,n.name);await Z.copyFile(o,i)}}catch(s){if(!D(s))throw s}}function Yd(r,e,t){switch(e){case"state":$y(r,t);break;case"queue":My(r,t);break;case"ideas":_y(r,t);break;case"shipped":Oy(r,t);break;case"metrics":Ny(r,t);break;case"analysis":Ly(r,t);break}}function $y(r,e){let t=P.getDb(r),s=t.prepare(`
|
|
587
|
+
`;await ee.writeFile(n,b,{mode:493})}await Qd(t,n),await Yd(e,t)}catch(r){D(r)||G.warn(`Status line warning: ${y(r)}`)}}async function Mo(r,e){if(!await C(r))return;let t=await ee.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ae.join(r,s),o=ae.join(e,s);await ee.copyFile(n,o),await ee.chmod(o,493)}}async function Qd(r,e){try{if(await C(r)){if((await ee.lstat(r)).isSymbolicLink()&&await ee.readlink(r)===e)return;await ee.unlink(r)}await ee.symlink(e,r)}catch{try{await C(e)&&(await ee.copyFile(e,r),await ee.chmod(r,493))}catch(s){D(s)||G.warn(`Symlink fallback warning: ${s.message}`)}}}function My(r,e){if(console.log(""),r.cliInstalled?console.log(` ${fe.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${fe.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${fe.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${fe.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${fe.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${fe.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${fe.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var tm,_y,Oo=E(()=>{"use strict";Gs();Cr();Jd();Z();W();qs();V();Hs();rs();$t();pt();is();tc();ya();l(Cy,"installAICLI");l(Zd,"run");l(xy,"installGeminiRouter");l(Ry,"installGeminiGlobalConfig");l(em,"installAntigravitySkill");l(Ay,"needsAntigravityInstallation");tm="prjct-codex-router";l(sm,"getCodexSkillPath");l(Dy,"getCodexSkillMetadata");l(Xd,"parseCodexSkillMetadata");l(jy,"hashContent");l(nm,"loadCodexSkillTemplate");l(rm,"buildCodexSkillContent");l(sc,"installCodexSkill");l(_o,"verifyCodexPRouterReady");l(Iy,"migrateProjectsCliVersion");l(Yd,"ensureStatusLineSettings");l($y,"installStatusLine");l(Mo,"installStatusLineModules");l(Qd,"ensureStatusLineSymlink");l(My,"showResults");_y=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");_y&&Zd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as B}from"zod";var Oy,Ny,om,Ly,Fy,Uy,Hy,Wy,im,hR,am=E(()=>{"use strict";Oy=B.enum(["low","medium","high"]),Ny=B.enum(["pending","converted","completed","archived","dormant"]),om=B.enum(["high","medium","low"]),Ly=B.object({impact:om,effort:om}),Fy=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Uy=B.object({name:B.string(),description:B.string()}),Hy=B.object({name:B.string(),description:B.string().optional()}),Wy=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:Oy,status:Ny,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:Ly.optional(),implementationNotes:B.string().optional(),stack:Fy.optional(),modules:B.array(Uy).optional(),roles:B.array(Hy).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),im=B.object({ideas:B.array(Wy),lastUpdated:B.string()}),hR={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var rc,We,vs=E(()=>{"use strict";am();Ct();K();Vs();as();rc=class extends Xe{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",im)}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(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:S()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:S()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:S()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:S()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:S()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:S()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:S()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.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:S()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=hs(cs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Ot.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:S()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},We=new rc});var oc,xn,ic=E(()=>{"use strict";bo();K();as();oc=class extends Xe{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Vu)}getDefault(){return{...qu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],p=m.findIndex(v=>v.date===o);if(p>=0){let v=m[p];m[p]={...v,tokensSaved:v.tokensSaved+s,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+n)/(v.syncs+1),totalDuration:v.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],b=m.filter(v=>v.date>=h),w=[...i.agentUsage];if(t.agents)for(let v of t.agents){let A=w.findIndex(F=>F.agentName===v);A>=0?w[A]={...w[A],usageCount:w[A].usageCount+1,tokensSaved:w[A].tokensSaved+Math.floor(s/t.agents.length)}:w.push({agentName:v,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:w,dailyStats:b,firstSync:i.firstSync||S(),lastUpdated:S()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ju(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 s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.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 s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},xn=new oc});import te from"node:fs/promises";import Q from"node:path";async function No(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(P.exists(r)&&P.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=R.getGlobalProjectPath(r),n=Q.join(s,"storage"),o=Q.join(s,"index"),i=Q.join(s,"memory");t.backupDir=await Gy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of lc){let d=Q.join(n,c),m=await Bt(d);if(m===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,m),cm(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of cc){let d=Q.join(o,c),m=await Bt(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),lm(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Yy(r,o,t),await Qy(r,o,t),await Zy(r,i,t),await ew(r,i,t);let a=Q.join(s,"sessions");return await tw(r,a,t),t.errors.length===0&&await sw(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function Gy(r,e,t){let s=Q.join(r,"backup");return await te.mkdir(s,{recursive:!0}),await te.mkdir(Q.join(s,"index"),{recursive:!0}),await te.mkdir(Q.join(s,"memory"),{recursive:!0}),await ac(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await ac(e,Q.join(s,"index")),await ac(t,Q.join(s,"memory")),s}async function ac(r,e,t){try{let s=await te.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Q.join(r,n.name),i=Q.join(e,n.name);await te.copyFile(o,i)}}catch(s){if(!D(s))throw s}}function cm(r,e,t){switch(e){case"state":By(r,t);break;case"queue":Vy(r,t);break;case"ideas":qy(r,t);break;case"shipped":Jy(r,t);break;case"metrics":zy(r,t);break;case"analysis":Ky(r,t);break}}function By(r,e){let t=P.getDb(r),s=t.prepare(`
|
|
588
588
|
INSERT OR REPLACE INTO tasks
|
|
589
589
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
590
590
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -595,92 +595,92 @@ echo "prjct"
|
|
|
595
595
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
596
596
|
depends_on, started_at, completed_at, output, summary)
|
|
597
597
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
598
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(
|
|
598
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;s.run($(a.id)??`task-${Date.now()}`,$(a.description??a.parentDescription)??"",$(a.type),$(c??a.status)??"unknown",$(a.parentDescription),$(a.branch),$(a.linearId),$(a.linearUuid),$(a.sessionId),$(a.featureId),$(a.startedAt)??new Date().toISOString(),$(a.completedAt),$(a.shippedAt),$(a.pausedAt),$(a.pauseReason),$(a.prUrl),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];n.run($(m.id)??`subtask-${d}`,$(a.id),$(m.description)??"",$(m.status)??"pending",$(m.domain),$(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,$(m.startedAt),$(m.completedAt),$(m.output),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 Vy(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
599
599
|
INSERT OR REPLACE INTO queue_tasks
|
|
600
600
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
601
601
|
feature_id, feature_name)
|
|
602
602
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
603
|
-
`);for(let o of t)n.run(
|
|
603
|
+
`);for(let o of t)n.run($(o.id)??`queue-${Date.now()}`,$(o.description)??"",$(o.type),$(o.priority),$(o.section),$(o.createdAt)??new Date().toISOString(),o.completed?1:0,$(o.completedAt),$(o.featureId),$(o.featureName))}function qy(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
604
604
|
INSERT OR REPLACE INTO ideas
|
|
605
605
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
606
606
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
607
|
-
`);for(let o of t)n.run(
|
|
607
|
+
`);for(let o of t)n.run($(o.id)??`idea-${Date.now()}`,$(o.text)??"",$(o.status)??"pending",$(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,$(o.addedAt)??new Date().toISOString(),$(o.convertedTo),$(o.details),JSON.stringify(o))}function Jy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
608
608
|
INSERT OR REPLACE INTO shipped_features
|
|
609
609
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
610
610
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
611
|
-
`);for(let o of t)n.run(
|
|
611
|
+
`);for(let o of t)n.run($(o.id)??`ship-${Date.now()}`,$(o.name)??"",$(o.shippedAt)??new Date().toISOString(),$(o.version)??"0.0.0",$(o.description),$(o.type),$(o.duration),JSON.stringify(o))}function zy(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
612
612
|
INSERT OR REPLACE INTO metrics_daily
|
|
613
613
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
614
614
|
VALUES (?, ?, ?, ?, ?)
|
|
615
|
-
`);for(let o of t)n.run(
|
|
615
|
+
`);for(let o of t)n.run($(o.date)??new Date().toISOString().slice(0,10),Es(o.tokensSaved)??0,Es(o.syncs)??0,Es(o.avgCompressionRate)??0,Es(o.totalDuration)??0)}function Ky(r,e){let s=P.getDb(r).prepare(`
|
|
616
616
|
INSERT OR REPLACE INTO analysis
|
|
617
617
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
618
618
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
619
|
-
`),n=l((o,i)=>{o&&s.run(i
|
|
619
|
+
`),n=l((o,i)=>{o&&s.run(i,$(o.status)??"unknown",$(o.commitHash),$(o.signature),$(o.sealedAt),$(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function lm(r,e,t){e==="categories-cache"&&Xy(r,t)}function Xy(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
620
620
|
INSERT OR REPLACE INTO index_files
|
|
621
621
|
(path, categories, domain, score, size, mtime, language)
|
|
622
622
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
623
|
-
`);for(let o of t){let i
|
|
623
|
+
`);for(let o of t){let i=$(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,$(o.primaryDomain),i)}}async function Yy(r,e,t){let s=Q.join(e,"checksums.json"),n=await Bt(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=P.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 Qy(r,e,t){let s=Q.join(e,"file-scores.json"),n=await Bt(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=P.getDb(r),a=i.prepare(`
|
|
624
624
|
INSERT OR REPLACE INTO index_files
|
|
625
625
|
(path, score, size, mtime, language, categories, domain)
|
|
626
626
|
VALUES (?, ?, ?, ?, NULL,
|
|
627
627
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
628
628
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
629
|
-
`);i.transaction(()=>{for(let c of o){let u
|
|
630
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=P.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
|
|
631
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=P.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:${
|
|
629
|
+
`);i.transaction(()=>{for(let c of o){let u=$(c.path);u&&a.run(u,Es(c.score)??0,Es(c.size),$(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Zy(r,e,t){let s=Q.join(e,"events.jsonl");try{let o=(await te.readFile(s,"utf-8")).split(`
|
|
630
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=P.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),p=$(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){D(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function ew(r,e,t){let s=Q.join(e,"learnings.jsonl");try{let o=(await te.readFile(s,"utf-8")).split(`
|
|
631
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=P.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(n){D(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function tw(r,e,t){let n=P.getDb(r).prepare(`
|
|
632
632
|
INSERT OR IGNORE INTO sessions
|
|
633
633
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
634
634
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
635
|
-
`),o=l(u=>{!u||!u.id||n.run(
|
|
636
|
-
`).filter(
|
|
635
|
+
`),o=l(u=>{!u||!u.id||n.run($(u.id),$(u.projectId)??r,$(u.task)??"",$(u.status)??"completed",$(u.startedAt)??new Date().toISOString(),$(u.pausedAt),$(u.completedAt),Es(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=Q.join(e,"current.json"),a=await Bt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await te.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=Q.join(e,"archive");try{let u=await te.readdir(c);for(let m of u){let p=Q.join(c,m);try{if(!(await te.stat(p)).isDirectory())continue;let h=await te.readdir(p);for(let w of h){if(!w.endsWith(".json"))continue;let v=Q.join(p,w),A=await Bt(v);if(A!==null)try{o(A),t.migratedFiles.push(`sessions/archive/${m}/${w}`),await te.unlink(v).catch(()=>{})}catch(F){t.errors.push({file:`sessions/archive/${m}/${w}`,error:String(F)})}}(await te.readdir(p)).length===0&&await te.rmdir(p).catch(()=>{})}catch{}}(await te.readdir(c).catch(()=>[])).length===0&&await te.rmdir(c).catch(()=>{})}catch{}try{(await te.readdir(e)).length===0&&await te.rmdir(e).catch(()=>{})}catch{}}async function sw(r,e,t,s){let n=l(async(i,a)=>{try{await te.unlink(i)}catch(c){D(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of lc)await n(Q.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 n(Q.join(e,i),`cleanup:index/${i}`);await n(Q.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(Q.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function $(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function Es(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function Bt(r){try{let e=await te.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e)||e instanceof SyntaxError)return null;throw e}}async function Lo(r){let e=R.getGlobalProjectPath(r),t=Q.join(e,"storage"),s=0;P.getDb(r);for(let{filename:h,key:b}of lc){let w=Q.join(t,h),v=await Bt(w);if(v!==null){P.setDoc(r,b,v),cm(r,b,v);try{await te.unlink(w)}catch{}s++}}let n=Q.join(e,"project.json"),o=await Bt(n);if(o!==null){P.setDoc(r,"project",o);try{await te.unlink(n)}catch{}s++}let i=Q.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let b=Q.join(i,h);try{let v=(await te.readFile(b,"utf-8")).split(`
|
|
636
|
+
`).filter(F=>F.trim());if(v.length===0){await te.unlink(b),s++;continue}let A=P.getDb(r);if(h==="events.jsonl"){let F=A.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");A.transaction(()=>{for(let J of v)try{let k=JSON.parse(J);F.run($(k.type??k.action)??"unknown",$(k.taskId??k.task_id),J,$(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let F=A.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");A.transaction(()=>{for(let J of v)try{let k=JSON.parse(J),j=`learning:${$(k.taskId??k.timestamp)??Date.now()}`,O=k.tags;F.run(j,$(O?.[0]),J,1,$(k.timestamp)??new Date().toISOString())}catch{}})()}await te.unlink(b),s++}catch{}}let a=Q.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;P.getDb(r).prepare(`
|
|
637
637
|
INSERT OR IGNORE INTO sessions
|
|
638
638
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
639
639
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
640
|
-
`).run(I(h.id),I(h.projectId)??r,I(h.task)??"",I(h.status)??"completed",I(h.startedAt)??new Date().toISOString(),I(h.pausedAt),I(h.completedAt),ks(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=X.join(a,"current.json"),d=await Ut(u);d!==null&&(c(d),await Z.unlink(u).catch(()=>{}),s++);let m=X.join(a,"archive");try{let h=await Z.readdir(m);for(let k of h){let E=X.join(m,k);try{if(!(await Z.stat(E)).isDirectory())continue;let W=await Z.readdir(E);for(let w of W){if(!w.endsWith(".json"))continue;let M=await Ut(X.join(E,w));M!==null&&(c(M),await Z.unlink(X.join(E,w)).catch(()=>{}),s++)}(await Z.readdir(E)).length===0&&await Z.rmdir(E).catch(()=>{})}catch{}}(await Z.readdir(m).catch(()=>[])).length===0&&await Z.rmdir(m).catch(()=>{})}catch{}try{(await Z.readdir(a)).length===0&&await Z.rmdir(a).catch(()=>{})}catch{}let p=X.join(e,"index"),g=[...ec.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let b=X.join(p,h),k=await Ut(b);if(k===null)continue;let E=ec.find(R=>R.filename===h);E&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(k),new Date().toISOString()),Qd(r,E.key,k));try{await Z.unlink(b)}catch{}s++}return s}var tc,ec,sc=v(()=>{"use strict";ye();U();te();tc=[{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"}],ec=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Do,"migrateJsonToSqlite");l(jy,"createBackup");l(Za,"copyFiles");l(Yd,"populateNormalized");l($y,"populateTasksFromState");l(My,"populateQueueTasks");l(_y,"populateIdeas");l(Oy,"populateShippedFeatures");l(Ny,"populateMetricsDaily");l(Ly,"populateAnalysis");l(Qd,"populateIndexTables");l(Fy,"populateCategoriesIndex");l(Uy,"migrateChecksums");l(Hy,"migrateFileScores");l(Wy,"migrateEventsJsonl");l(Gy,"migrateLearningsJsonl");l(Vy,"migrateSessionFiles");l(By,"cleanupJsonFiles");l(I,"toStr");l(ks,"toNum");l(Ut,"readJsonSafe");l(Io,"sweepLegacyJson")});function jo(r){return[...r].sort((e,t)=>{let s=em[e.section]-em[t.section];return s!==0?s:Zd[e.priority]-Zd[t.priority]})}function nc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Zd,em,$o=v(()=>{"use strict";Zd={critical:0,high:1,medium:2,low:3},em={active:0,previously_active:1,backlog:2};l(jo,"sortBySectionAndPriority");l(nc,"uniqueBy")});var rc,pe,Ht=v(()=>{"use strict";vt();va();$o();q();Ls();ns();rc=class extends Je{static{l(this,"QueueStorage")}constructor(){super("queue.json",ed)}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(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return jo(t)[0]||null}async addTask(e,t){let s={...t,id:J(),createdAt:S(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:S()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=S(),n=t.map(o=>({...o,id:J(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:S()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:S()},s):i),lastUpdated:S()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:S()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:S()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:S()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=ds(rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:S()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},pe=new rc});import{z as ee}from"zod";var Jy,tm,qy,zy,Ky,Xy,Yy,Qy,Zy,sm,nm=v(()=>{"use strict";Jy=ee.enum(["feature","fix","improvement","refactor"]),tm=ee.enum(["pass","warning","fail","skipped"]),qy=ee.enum(["added","changed","fixed","removed"]),zy=ee.object({hours:ee.number(),minutes:ee.number(),totalMinutes:ee.number()}),Ky=ee.object({filesChanged:ee.number().nullable().optional(),linesAdded:ee.number().nullable().optional(),linesRemoved:ee.number().nullable().optional(),commits:ee.number().nullable().optional()}),Xy=ee.object({description:ee.string(),type:qy.optional()}),Yy=ee.object({lintStatus:tm.nullable().optional(),lintDetails:ee.string().optional(),testStatus:tm.nullable().optional(),testDetails:ee.string().optional()}),Qy=ee.object({hash:ee.string().optional(),message:ee.string().optional(),branch:ee.string().optional()}),Zy=ee.object({id:ee.string(),name:ee.string(),version:ee.string().nullable().optional(),type:Jy,agent:ee.string().optional(),description:ee.string().optional(),changes:ee.array(Xy).optional(),codeSnippets:ee.array(ee.string()).optional(),commit:Qy.optional(),codeMetrics:Ky.optional(),qualityMetrics:Yy.optional(),quantitativeImpact:ee.string().optional(),duration:zy.optional(),tasksCompleted:ee.number().nullable().optional(),shippedAt:ee.string(),featureId:ee.string().optional()}),sm=ee.object({shipped:ee.array(Zy),lastUpdated:ee.string()})});var oc,Ye,Hs=v(()=>{"use strict";vt();nm();q();Ls();ns();oc=class extends Je{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",sm)}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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:J(),shippedAt:S()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:S()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=ds(rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.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)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:S()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},Ye=new oc});import{z as ue}from"zod";var ew,tw,rm,zA,KA,XA,Ss,om,kr=v(()=>{"use strict";ew=ue.enum(["improving","stable","declining"]),tw=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),rm=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),zA=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),KA=ue.object({sprints:ue.array(tw),averageVelocity:ue.number(),velocityTrend:ew,estimationAccuracy:ue.number(),overEstimated:ue.array(rm),underEstimated:ue.array(rm),lastUpdated:ue.string()}),XA=ue.object({sprintLengthDays:ue.number().min(1).max(90).default(7),startDay:ue.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ue.number().min(1).max(52).default(6),accuracyTolerance:ue.number().min(0).max(100).default(20)}),Ss={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},om={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var ic,Mo,ac=v(()=>{"use strict";kr();ns();ic=class extends Je{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:om,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}},Mo=new ic});var Sr,cc,lc,im=v(()=>{"use strict";dr();q();Sr=3,cc=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Sr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Sr} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Sr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Sr} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.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(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Sr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[Fe.FILE_STRUCTURE,Fe.ARCHITECTURE],tech_stack:[Fe.TECH_STACK],architecture:[Fe.ARCHITECTURE,Fe.CODE_STYLE],estimation:[Fe.SHIP_WORKFLOW],workflow:[Fe.SHIP_WORKFLOW,Fe.CODE_STYLE],gotcha:[Fe.TEST_BEHAVIOR,Fe.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: ${S()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
641
|
-
`)}},
|
|
642
|
-
`)}},
|
|
643
|
-
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function
|
|
640
|
+
`).run($(h.id),$(h.projectId)??r,$(h.task)??"",$(h.status)??"completed",$(h.startedAt)??new Date().toISOString(),$(h.pausedAt),$(h.completedAt),Es(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=Q.join(a,"current.json"),d=await Bt(u);d!==null&&(c(d),await te.unlink(u).catch(()=>{}),s++);let m=Q.join(a,"archive");try{let h=await te.readdir(m);for(let w of h){let v=Q.join(m,w);try{if(!(await te.stat(v)).isDirectory())continue;let F=await te.readdir(v);for(let k of F){if(!k.endsWith(".json"))continue;let j=await Bt(Q.join(v,k));j!==null&&(c(j),await te.unlink(Q.join(v,k)).catch(()=>{}),s++)}(await te.readdir(v)).length===0&&await te.rmdir(v).catch(()=>{})}catch{}}(await te.readdir(m).catch(()=>[])).length===0&&await te.rmdir(m).catch(()=>{})}catch{}try{(await te.readdir(a)).length===0&&await te.rmdir(a).catch(()=>{})}catch{}let p=Q.join(e,"index"),g=[...cc.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let b=Q.join(p,h),w=await Bt(b);if(w===null)continue;let v=cc.find(A=>A.filename===h);v&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(w),new Date().toISOString()),lm(r,v.key,w));try{await te.unlink(b)}catch{}s++}return s}var lc,cc,uc=E(()=>{"use strict";Se();W();Z();lc=[{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"}],cc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(No,"migrateJsonToSqlite");l(Gy,"createBackup");l(ac,"copyFiles");l(cm,"populateNormalized");l(By,"populateTasksFromState");l(Vy,"populateQueueTasks");l(qy,"populateIdeas");l(Jy,"populateShippedFeatures");l(zy,"populateMetricsDaily");l(Ky,"populateAnalysis");l(lm,"populateIndexTables");l(Xy,"populateCategoriesIndex");l(Yy,"migrateChecksums");l(Qy,"migrateFileScores");l(Zy,"migrateEventsJsonl");l(ew,"migrateLearningsJsonl");l(tw,"migrateSessionFiles");l(sw,"cleanupJsonFiles");l($,"toStr");l(Es,"toNum");l(Bt,"readJsonSafe");l(Lo,"sweepLegacyJson")});function Fo(r){return[...r].sort((e,t)=>{let s=dm[e.section]-dm[t.section];return s!==0?s:um[e.priority]-um[t.priority]})}function dc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var um,dm,Uo=E(()=>{"use strict";um={critical:0,high:1,medium:2,low:3},dm={active:0,previously_active:1,backlog:2};l(Fo,"sortBySectionAndPriority");l(dc,"uniqueBy")});var mc,le,Nt=E(()=>{"use strict";Ct();ja();Uo();K();Vs();as();mc=class extends Xe{static{l(this,"QueueStorage")}constructor(){super("queue.json",dd)}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(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Fo(t)[0]||null}async addTask(e,t){let s={...t,id:z(),createdAt:S(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:S()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=S(),n=t.map(o=>({...o,id:z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:S()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:S()},s):i),lastUpdated:S()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:S()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:S()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:S()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=hs(cs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Ot.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:S()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},le=new mc});import{z as se}from"zod";var nw,mm,rw,ow,iw,aw,cw,lw,uw,pm,gm=E(()=>{"use strict";nw=se.enum(["feature","fix","improvement","refactor"]),mm=se.enum(["pass","warning","fail","skipped"]),rw=se.enum(["added","changed","fixed","removed"]),ow=se.object({hours:se.number(),minutes:se.number(),totalMinutes:se.number()}),iw=se.object({filesChanged:se.number().nullable().optional(),linesAdded:se.number().nullable().optional(),linesRemoved:se.number().nullable().optional(),commits:se.number().nullable().optional()}),aw=se.object({description:se.string(),type:rw.optional()}),cw=se.object({lintStatus:mm.nullable().optional(),lintDetails:se.string().optional(),testStatus:mm.nullable().optional(),testDetails:se.string().optional()}),lw=se.object({hash:se.string().optional(),message:se.string().optional(),branch:se.string().optional()}),uw=se.object({id:se.string(),name:se.string(),version:se.string().nullable().optional(),type:nw,agent:se.string().optional(),description:se.string().optional(),changes:se.array(aw).optional(),codeSnippets:se.array(se.string()).optional(),commit:lw.optional(),codeMetrics:iw.optional(),qualityMetrics:cw.optional(),quantitativeImpact:se.string().optional(),duration:ow.optional(),tasksCompleted:se.number().nullable().optional(),shippedAt:se.string(),featureId:se.string().optional()}),pm=se.object({shipped:se.array(uw),lastUpdated:se.string()})});var pc,qe,Ps=E(()=>{"use strict";Ct();gm();K();Vs();as();pc=class extends Xe{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",pm)}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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:z(),shippedAt:S()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:S()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=hs(cs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Ot.archiveMany(e,n.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)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:S()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},qe=new pc});import{z as ge}from"zod";var dw,mw,fm,oA,iA,aA,Cs,hm,Rr=E(()=>{"use strict";dw=ge.enum(["improving","stable","declining"]),mw=ge.object({sprintNumber:ge.number(),startDate:ge.string(),endDate:ge.string(),pointsCompleted:ge.number(),tasksCompleted:ge.number(),avgVariance:ge.number(),estimationAccuracy:ge.number()}),fm=ge.object({category:ge.string(),avgVariance:ge.number(),taskCount:ge.number()}),oA=ge.object({totalPoints:ge.number(),sprints:ge.number(),estimatedDate:ge.string()}),iA=ge.object({sprints:ge.array(mw),averageVelocity:ge.number(),velocityTrend:dw,estimationAccuracy:ge.number(),overEstimated:ge.array(fm),underEstimated:ge.array(fm),lastUpdated:ge.string()}),aA=ge.object({sprintLengthDays:ge.number().min(1).max(90).default(7),startDay:ge.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ge.number().min(1).max(52).default(6),accuracyTolerance:ge.number().min(0).max(100).default(20)}),Cs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},hm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var gc,Ho,fc=E(()=>{"use strict";Rr();as();gc=class extends Xe{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:hm,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}},Ho=new gc});var Ar,hc,yc,ym=E(()=>{"use strict";Sr();K();Ar=3,hc=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Ar){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Ar} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Ar){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Ar} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.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(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)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>=Ar&&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((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[He.FILE_STRUCTURE,He.ARCHITECTURE],tech_stack:[He.TECH_STACK],architecture:[He.ARCHITECTURE,He.CODE_STYLE],estimation:[He.SHIP_WORKFLOW],workflow:[He.SHIP_WORKFLOW,He.CODE_STYLE],gotcha:[He.TEST_BEHAVIOR,He.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: ${S()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
641
|
+
`)}},yc=new hc});import{z as x}from"zod";var wm,pw,gw,km,fw,hw,yw,ww,kw,Sw,bw,Sm,Tw,vw,kA,bm,Tm,vm,Em,Ew,Wo,Pm=E(()=>{"use strict";wm=x.number().min(1).max(5),pw=x.enum(["exceeded","met","partial","failed"]),gw=x.enum(["definitely","probably","maybe","no"]),km=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),fw=x.object({estimated:x.object({hours:x.number(),confidence:x.enum(["low","medium","high"]).optional(),source:x.enum(["prd","manual","historical"]).optional()}),actual:x.object({hours:x.number(),commits:x.number().optional(),linesAdded:x.number().optional(),linesRemoved:x.number().optional(),sessions:x.number().optional()}),variance:x.object({hours:x.number(),percentage:x.number(),reason:km.optional(),explanation:x.string().optional()})}),hw=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),yw=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),ww=x.object({metrics:x.array(hw),acceptanceCriteria:x.array(yw),overallSuccess:pw,successScore:x.number().min(0).max(100)}),kw=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),Sw=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(kw)}),bw=x.object({valueDelivered:x.number().min(1).max(10),userImpact:x.enum(["none","low","medium","high","critical"]),businessImpact:x.enum(["none","low","medium","high","critical"]),roiScore:x.number(),worthIt:gw,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),Sm=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:wm,blockers:x.array(x.string()),agentUsed:x.string().optional(),skillsUsed:x.array(x.string()).optional(),startedAt:x.string(),completedAt:x.string()}),Tw=x.object({id:x.string(),featureId:x.string(),featureName:x.string(),prdId:x.string().nullable(),version:x.string().optional(),branch:x.string().optional(),prUrl:x.string().optional(),effort:fw,success:ww.optional(),learnings:Sw,roi:bw,rating:wm,taskOutcomes:x.array(Sm).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),vw=x.object({totalFeatures:x.number(),averageEstimationAccuracy:x.number(),averageSuccessRate:x.number(),averageROI:x.number(),bySuccessLevel:x.object({exceeded:x.number(),met:x.number(),partial:x.number(),failed:x.number()}),variancePatterns:x.array(x.object({reason:km,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),kA=x.object({outcomes:x.array(Tw),taskOutcomes:x.array(Sm).optional(),aggregates:vw.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),bm={outcomes:[],taskOutcomes:[],lastUpdated:""},Tm=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),vm=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Em=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Ew=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Wo=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=>Ew(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={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(s.reduce((d,m)=>d+m,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var wc,Cm,xm=E(()=>{"use strict";Pm();as();K();wc=class extends Xe{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...bm,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Wo([t,...s.outcomes]),lastUpdated:S()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:S()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Wo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Wo(t.outcomes),lastAggregated:S(),lastUpdated:S()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&vt(e.duration)||60,s=t/60,n=t/60,o=Tm(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=vm(5,n);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:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Em(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}}},Cm=new wc});import kc from"node:fs/promises";import Go from"node:path";var Sc,bc,Rm,Am=E(()=>{"use strict";W();V();Sc=".prjct/.prjct-state.md",bc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Go.join(e,Sc);await kc.mkdir(Go.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await kc.writeFile(s,n,"utf-8")}async remove(e){try{await kc.unlink(Go.join(e,Sc))}catch(t){if(!D(t))throw t}}async exists(e){let t=Go.join(e,Sc);return C(t)}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 s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${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 s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
642
|
+
`)}},Rm=new bc});var Tc,xt,zs=E(()=>{"use strict";xe();Vs();Z();Tc=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await I.getProjectId(e);if(!o)return;M.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await I.getProjectId(e);return s?M.query(s,"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(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await I.getProjectId(e);return n?M.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).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(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await I.getProjectId(e);if(!t)return;M.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 M.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=M.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=cs.MEMORY_MAX_ENTRIES)return 0;let n=s-cs.MEMORY_MAX_ENTRIES,o=M.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Ot.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&&M.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},xt=new Tc});import Pw from"node:path";function Cw(r){return Us(Pw.resolve(r))}function Dr(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function xw(r){return dc(r,e=>`${Dr(e.name)}::${Dr(e.source)}`)}function Rw(r){return dc(r,e=>`${Dr(e.issue)}::${Dr(e.file)}::${Dr(e.source)}`)}var vc,Aw,Dm,jm=E(()=>{"use strict";Z();Uo();Hs();l(Cw,"repoHash");l(Dr,"normalizeKey");l(xw,"dedupePatterns");l(Rw,"dedupeAntiPatterns");vc=class{static{l(this,"PatternExtractor")}async extract(e){let t=Cw(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=xw([...s,...n]),a=Rw([...o]),c=`analysis:derived-rules:${t}`;return P.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},Aw=new vc,Dm=Aw});import jr from"node:fs/promises";import Dw from"node:os";import Ir from"node:path";function jw(r){return`# ${r.projectName}
|
|
643
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function Iw(r){return r.patterns.length===0?"":`
|
|
644
644
|
## Patterns
|
|
645
645
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
646
646
|
`)}
|
|
647
|
-
`}function
|
|
647
|
+
`}function $w(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
648
648
|
## Anti-Patterns
|
|
649
649
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
650
650
|
`)}
|
|
651
|
-
`}function
|
|
651
|
+
`}function Mw(r){return r.knownGotchas.length===0?"":`
|
|
652
652
|
## Known Gotchas
|
|
653
653
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
654
654
|
`)}
|
|
655
|
-
`}function
|
|
655
|
+
`}function _w(r){return r.recentShipped.length===0?"":`
|
|
656
656
|
## Recent Deliveries
|
|
657
657
|
${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
|
|
658
658
|
`)}
|
|
659
|
-
`}function
|
|
659
|
+
`}function Ow(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
|
|
660
660
|
## Velocity
|
|
661
661
|
${e.join(" | ")}
|
|
662
|
-
`}function
|
|
662
|
+
`}function Nw(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
|
|
663
663
|
## Commands
|
|
664
664
|
| Action | Command |
|
|
665
665
|
|--------|---------|
|
|
666
666
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
667
667
|
`)}
|
|
668
|
-
`}function
|
|
668
|
+
`}function Lw(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
|
|
669
669
|
## State
|
|
670
670
|
${e.join(`
|
|
671
671
|
`)}
|
|
672
|
-
`}function
|
|
672
|
+
`}function Fw(r){return r.userPatterns.length===0?"":`
|
|
673
673
|
## User Patterns
|
|
674
674
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
675
675
|
`)}
|
|
676
|
-
`}function
|
|
676
|
+
`}function Uw(r){return[Iw(r),$w(r),Mw(r),_w(r),Ow(r),Nw(r.commands),Lw(r),Fw(r)].filter(Boolean).join("")}function Hw(r,e){let t=r.userInvocable!==!1;return`---
|
|
677
677
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
678
678
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
679
679
|
user-invocable: ${t}
|
|
680
|
-
---`}function
|
|
680
|
+
---`}function Ww(r,e){return`${Hw(r,e)}
|
|
681
681
|
|
|
682
|
-
${r.body(e)}`}var
|
|
683
|
-
${
|
|
682
|
+
${r.body(e)}`}var Ec,Pc,Im,$m=E(()=>{"use strict";ts();rs();l(jw,"formatProjectHeader");l(Iw,"formatPatterns");l($w,"formatAntiPatterns");l(Mw,"formatGotchas");l(_w,"formatRecentShipped");l(Ow,"formatVelocity");l(Nw,"formatCommands");l(Lw,"formatState");l(Fw,"formatUserPatterns");l(Uw,"formatRichContext");Ec=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${jw(r)}
|
|
683
|
+
${Uw(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
|
|
684
684
|
Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
|
|
685
685
|
`)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
|
|
686
686
|
|
|
@@ -719,6 +719,27 @@ Present results: tables, analysis findings, anti-patterns, conventions.
|
|
|
719
719
|
- Skill regeneration (this skill and others)
|
|
720
720
|
- Index building (BM25, import graph, co-change)
|
|
721
721
|
- Pattern extraction and analysis
|
|
722
|
+
|
|
723
|
+
## Obsidian Integration
|
|
724
|
+
After completing analysis, check if Obsidian is configured:
|
|
725
|
+
\`\`\`bash
|
|
726
|
+
prjct obsidian status --md
|
|
727
|
+
\`\`\`
|
|
728
|
+
If configured, write project insights to the vault using the MCP tool \`prjct_obsidian_write\`:
|
|
729
|
+
- notePath: \`_insights.md\`
|
|
730
|
+
- frontmatter: \`{ prjct_type: "insights", updated: "YYYY-MM-DD" }\`
|
|
731
|
+
- content: Your analysis written in natural language (NOT tables or templates)
|
|
732
|
+
|
|
733
|
+
Write like a PM briefing the team. Include:
|
|
734
|
+
- Project status: active task, queue depth, blockers, what needs attention
|
|
735
|
+
- Architecture: style, key patterns, domains identified
|
|
736
|
+
- Recent progress: last deliveries with their impact
|
|
737
|
+
- Risks: anti-patterns found, tech debt, areas of concern
|
|
738
|
+
- Decisions: key technical choices and rationale
|
|
739
|
+
- Velocity: trend, estimation accuracy, capacity
|
|
740
|
+
- Next priorities: what should be tackled next and why
|
|
741
|
+
|
|
742
|
+
Be specific \u2014 cite issue IDs, file paths, concrete numbers. Skip this step if Obsidian is not configured.
|
|
722
743
|
`,"body")},{name:"prjct-bug",description:"Report and track a bug with auto-priority",allowedTools:["Bash","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
|
|
723
744
|
|
|
724
745
|
1. If no description provided, ASK the user for details
|
|
@@ -763,34 +784,37 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
763
784
|
|
|
764
785
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
765
786
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
766
|
-
`,"body")}];l(
|
|
767
|
-
`).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
|
|
768
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await _('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:ie(t)})}return e}async function Wt(r,e){let t=await C(wc.join(r,e));return t||H.debug("File not found",{filename:e}),t}async function xm(r){let e={fileCount:0,version:"0.0.0",name:wc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await _('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:ie(t)}),e.fileCount=0}try{let t=wc.join(r,"package.json"),s=await Pe(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Wt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ie(t)})}return await Wt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Wt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Wt(r,"requirements.txt")||await Wt(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 Am(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 Wt(r,"bun.lockb")||await Wt(r,"bun.lock")?(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 Wt(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 Wt(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 Wt(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 Wt(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}async function Rm(r){return new No(r).detect()}var Dm=v(()=>{"use strict";Yt();vm();Le();B();es();Pm();l(Cm,"analyzeGit");l(Wt,"fileExistsInProject");l(xm,"gatherStats");l(Am,"detectCommands");l(Rm,"detectStack")});import Im from"node:fs/promises";import Lo from"node:path";var kc,Sc,jm,$m=v(()=>{"use strict";ft();U();Le();B();kc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Lo.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Lo.basename(r);try{await O.read(s)}catch(n){D(n)||t.push(`state: ${y(n)}`)}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=Lo.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Im.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Im.readFile(Lo.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!D(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},Sc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[kc.contextFilesExist(t),kc.jsonFilesValid(t),kc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(p)+1);a+=h.filter(b=>b.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()-n,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await _(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},jm=new Sc});import Mm from"node:fs/promises";import bc from"node:path";var Tc,Gs,vc=v(()=>{"use strict";na();ga();kd();Td();Ad();Ma();Yt();dt();ss();Ce();ye();Ro();yn();Ls();te();ws();fr();Qa();sc();Ht();Hs();ft();ac();q();B();es();im();hm();yr();wm();Ws();Sm();Tm();Dm();$m();Tc=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 s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await j.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Mm.rm(bc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Ds()).installed){let w=await Ao({autoRepair:!0});w.verified||H.warn(`Codex p. router not ready: ${w.message||"verification failed"}`)}try{n=await is.ensureReady()}catch(w){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:ie(w)},error:`Context7 MCP is required but not ready: ${ie(w)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Do(this.projectId);try{let w=await Io(this.projectId);w>0&&H.info("Swept legacy JSON files into SQLite",{swept:w})}catch(w){H.debug("Legacy JSON sweep failed (non-critical)",{error:ie(w)})}let[a,c,u,d]=await Promise.all([Cm(this.projectPath),xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath)]),m=t.full===!0,p,g=!0,h=new Set;if(!m&&bd(this.projectId))try{let{diff:w,currentHashes:M}=await Oa(this.projectPath,this.projectId),N=w.added.length+w.modified.length+w.deleted.length;if(N===0&&!t.changedFiles?.length)g=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:w.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let fe=yd(w,this.projectId);h=wd(fe.allAffected);let Ne=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=fe.allAffected.some(tt=>{let pt=tt.substring(tt.lastIndexOf("."));return Ne.has(pt)}),p={isIncremental:!0,filesChanged:N,filesUnchanged:w.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}_a(this.projectId,M)}catch(w){H.debug("Incremental detection failed, falling back to full sync",{error:ie(w)})}else try{let{currentHashes:w}=await Oa(this.projectPath,this.projectId);_a(this.projectId,w)}catch(w){H.debug("Hash computation failed (non-critical)",{error:ie(w)})}if(g)try{await Promise.all([Vu(this.projectPath,this.projectId),hd(this.projectPath,this.projectId),xd(this.projectPath,this.projectId)])}catch(w){H.debug("File ranking index build failed (non-critical)",{error:ie(w)})}let b;try{let[w,M,N,fe,Ne,Rt,tt,pt,us,Ri,Di]=await Promise.all([Promise.resolve(Lt.getActive(this.projectId)).catch(()=>null),qe.getActive(this.projectId).catch(()=>null),Ye.getRecent(this.projectId,3).catch(()=>[]),Mo.getMetrics(this.projectId).catch(()=>null),pe.getBacklog(this.projectId).catch(()=>[]),O.getTaskHistory(this.projectId).catch(()=>[]),O.getAllPausedTasks(this.projectId).catch(()=>[]),O.getAggregatedFeedback(this.projectId).catch(()=>null),O.getCurrentTask(this.projectId).catch(()=>null),Ue.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Ye.getCount(this.projectId).catch(()=>0)]),Ii={backlogCount:Ne.length,completedTaskCount:Rt.length,pausedTaskCount:tt.length,hasActiveTask:!!us},ji=w?w.patterns.map(ne=>({name:ne.name,description:ne.description,location:ne.locations?.[0]})):(M?.patterns??[]).filter(ne=>ne.source!=="repo").map(ne=>({name:ne.name,description:ne.description,location:ne.location})),$i=w?w.antiPatterns.map(ne=>({issue:ne.issue,file:ne.files?.[0]??"multiple",suggestion:ne.suggestion,severity:ne.severity??"medium"})):(M?.antiPatterns??[]).filter(ne=>ne.source!=="repo").map(ne=>({issue:ne.issue,file:ne.file,suggestion:ne.suggestion,severity:ne.severity??"medium"})),Mi=w?.commands?{install:w.commands.install??u.install,run:u.run,test:w.commands.test??u.test,build:w.commands.build??u.build,dev:w.commands.dev??u.dev,lint:w.commands.lint??u.lint,format:w.commands.format??u.format}:u,_i={version:c.version,fileCount:c.fileCount,patterns:ji,antiPatterns:$i,recentShipped:N.map(ne=>({name:ne.name,type:ne.type??"feature",duration:ne.duration,filesChanged:ne.changes?.length})),velocity:fe?{avgPoints:fe.averageVelocity,trend:fe.velocityTrend,accuracy:fe.estimationAccuracy}:null,backlogCount:Ne.length,completedTaskCount:Rt.length,pausedTaskCount:tt.length,knownGotchas:pt?.knownGotchas??[],userPatterns:pt?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:tt.map(ne=>({description:ne.description,pausedAt:ne.pausedAt??""})),topBacklog:Ne.slice(0,3).map(ne=>({description:ne.description,priority:ne.priority??"medium"})),ideasCount:Ri?.pending??0,shippedCount:Di};b=await bm.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Mi,stack:d},Ii,_i)}catch(w){H.debug("Native skill generation failed (non-critical)",{error:ie(w)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let k=await qe.getActive(this.projectId),E={patterns:k?.patterns?.length||0,antiPatterns:k?.antiPatterns?.length||0,criticalAntiPatterns:k?.antiPatterns?.filter(w=>w.severity==="high").length||0},R=Date.now()-s,W=await this.recordSyncMetrics(c,R);await this.archiveStaleData(),await this.autoLearnFromHistory(),await xe.installGlobalConfig(),await xe.syncCommands();let z;try{let w=await j.readConfig(this.projectPath);z=await jm.verify(this.projectPath,this.globalPath,w?.verification)}catch(w){H.debug("Verification failed (non-critical)",{error:ie(w)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:E,syncMetrics:W,verification:z,incremental:p,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:ie(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Mm.mkdir(bc.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=P.getDoc(this.projectId,"project")||{},n={...s,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:s.createdAt||S(),lastSync:S(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};P.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await O.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=S(),n.lastUpdated=S(),n.context={...n.context||{},lastSession:S(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await O.write(this.projectId,n);try{await ym.generate(this.projectPath,n)}catch(o){H.debug("Local state generation failed (optional)",{error:ie(o)})}}async logToMemory(e,t){P.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=fo(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){H.debug("Could not load BM25 index for metrics",{error:ie(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Tn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){H.debug("Failed to record sync metrics",{error:ie(a)})}let i={};try{let a=fo(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=So(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Cd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){H.debug("Could not load index stats",{error:ie(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await O.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await km.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await qe.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:S(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:ie(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Ye.archiveOldShipped(this.projectId).catch(()=>0),Ue.markDormantIdeas(this.projectId).catch(()=>0),pe.removeStaleCompleted(this.projectId).catch(()=>0),O.archiveStalePausedTasks(this.projectId).catch(()=>[]),Et.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Mt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ie(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await O.getTaskHistory(this.projectId);if(e.length===0)return;let t=new mn,s=await lc.learnFromTaskHistory(this.projectId,e,t);try{let n=await fm.getFeatureOutcomes(this.projectId);n.length>0&&await lc.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:ie(e)})}}async getCliVersion(){try{let e=bc.join(__dirname,"..","..","package.json");return(await Pe(e))?.version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ie(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:[]}}},Gs=new Tc});function $w(){return"---"}function Mw(){return`---
|
|
769
|
-
prjct v${
|
|
770
|
-
`)}function
|
|
787
|
+
`,"body")}];l(Hw,"buildFrontmatter");l(Ww,"buildSkillContent");Pc=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=Ir.join(Dw.homedir(),".claude","skills");for(let c of Ec){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await jr.rm(Ir.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Ww(c,o),d=Ir.join(i,c.name),m=Ir.join(d,"SKILL.md");await jr.mkdir(d,{recursive:!0}),await jr.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){G.debug(`Failed to generate skill ${c.name}`,{error:de(u)}),n.skipped.push({name:c.name,reason:de(u)})}}let a=new Set(Ec.map(c=>c.name));try{let c=await jr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await jr.rm(Ir.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&G.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return Ec}},Im=new Pc});var Mm=E(()=>{"use strict"});import Gw from"node:fs/promises";import _m from"node:path";var Bo,Om=E(()=>{"use strict";V();Bo=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 s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,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(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(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=_m.join(this.projectPath,"package.json"),t=await Gw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(_m.join(this.projectPath,e))}}});import Cc from"node:path";async function Nm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await N("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await N("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await N("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await N("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
788
|
+
`).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 N('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
789
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await N('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){G.debug("Git analysis failed (not a git repo?)",{error:de(t)})}return e}async function Vt(r,e){let t=await C(Cc.join(r,e));return t||G.debug("File not found",{filename:e}),t}async function Lm(r){let e={fileCount:0,version:"0.0.0",name:Cc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await N('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){G.debug("File count failed",{path:r,error:de(t)}),e.fileCount=0}try{let t=Cc.join(r,"package.json"),s=await be(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Vt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:r,error:de(t)})}return await Vt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Vt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Vt(r,"requirements.txt")||await Vt(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 Fm(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 Vt(r,"bun.lockb")||await Vt(r,"bun.lock")?(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 Vt(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 Vt(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 Vt(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 Vt(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}async function Um(r){return new Bo(r).detect()}var Hm=E(()=>{"use strict";ts();Mm();Ue();V();rs();Om();l(Nm,"analyzeGit");l(Vt,"fileExistsInProject");l(Lm,"gatherStats");l(Fm,"detectCommands");l(Um,"detectStack")});import Wm from"node:fs/promises";import Vo from"node:path";var xc,Rc,Gm,Bm=E(()=>{"use strict";gt();W();Ue();V();xc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Vo.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Vo.basename(r);try{await _.read(s)}catch(n){D(n)||t.push(`state: ${y(n)}`)}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=Vo.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Wm.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Wm.readFile(Vo.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!D(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},Rc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[xc.contextFilesExist(t),xc.jsonFilesValid(t),xc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(p)+1);a+=h.filter(b=>b.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()-n,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await N(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Gm=new Rc});import Vm from"node:fs/promises";import Ac from"node:path";var Dc,Ks,jc=E(()=>{"use strict";da();Ta();Dd();$d();Fd();Wa();ts();pt();is();xe();Se();Oo();Tn();Vs();Z();vs();Er();ic();uc();Nt();Ps();gt();fc();K();V();rs();ym();xm();Cr();Am();zs();jm();$m();Hm();Bm();Dc=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 s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await I.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=R.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Vm.rm(Ac.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Ns()).installed){let k=await _o({autoRepair:!0});k.verified||G.warn(`Codex p. router not ready: ${k.message||"verification failed"}`)}try{n=await us.ensureReady()}catch(k){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:de(k)},error:`Context7 MCP is required but not ready: ${de(k)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await No(this.projectId);try{let k=await Lo(this.projectId);k>0&&G.info("Swept legacy JSON files into SQLite",{swept:k})}catch(k){G.debug("Legacy JSON sweep failed (non-critical)",{error:de(k)})}let[a,c,u,d]=await Promise.all([Nm(this.projectPath),Lm(this.projectPath),Fm(this.projectPath),Um(this.projectPath)]),m=t.full===!0,p,g=!0,h=new Set;if(!m&&Id(this.projectId))try{let{diff:k,currentHashes:j}=await Ba(this.projectPath,this.projectId),O=k.added.length+k.modified.length+k.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:k.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let we=Rd(k,this.projectId);h=Ad(we.allAffected);let Fe=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=we.allAffected.some(rt=>{let yt=rt.substring(rt.lastIndexOf("."));return Fe.has(yt)}),p={isIncremental:!0,filesChanged:O,filesUnchanged:k.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}Ga(this.projectId,j)}catch(k){G.debug("Incremental detection failed, falling back to full sync",{error:de(k)})}else try{let{currentHashes:k}=await Ba(this.projectPath,this.projectId);Ga(this.projectId,k)}catch(k){G.debug("Hash computation failed (non-critical)",{error:de(k)})}if(g)try{await Promise.all([td(this.projectPath,this.projectId),xd(this.projectPath,this.projectId),Ld(this.projectPath,this.projectId)])}catch(k){G.debug("File ranking index build failed (non-critical)",{error:de(k)})}let b;try{let[k,j,O,we,Fe,jt,rt,yt,fs,Ni,Li]=await Promise.all([Promise.resolve(Wt.getActive(this.projectId)).catch(()=>null),Ye.getActive(this.projectId).catch(()=>null),qe.getRecent(this.projectId,3).catch(()=>[]),Ho.getMetrics(this.projectId).catch(()=>null),le.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),We.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),qe.getCount(this.projectId).catch(()=>0)]),Fi={backlogCount:Fe.length,completedTaskCount:jt.length,pausedTaskCount:rt.length,hasActiveTask:!!fs},Ui=k?k.patterns.map(oe=>({name:oe.name,description:oe.description,location:oe.locations?.[0]})):(j?.patterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({name:oe.name,description:oe.description,location:oe.location})),Hi=k?k.antiPatterns.map(oe=>({issue:oe.issue,file:oe.files?.[0]??"multiple",suggestion:oe.suggestion,severity:oe.severity??"medium"})):(j?.antiPatterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({issue:oe.issue,file:oe.file,suggestion:oe.suggestion,severity:oe.severity??"medium"})),Wi=k?.commands?{install:k.commands.install??u.install,run:u.run,test:k.commands.test??u.test,build:k.commands.build??u.build,dev:k.commands.dev??u.dev,lint:k.commands.lint??u.lint,format:k.commands.format??u.format}:u,Gi={version:c.version,fileCount:c.fileCount,patterns:Ui,antiPatterns:Hi,recentShipped:O.map(oe=>({name:oe.name,type:oe.type??"feature",duration:oe.duration,filesChanged:oe.changes?.length})),velocity:we?{avgPoints:we.averageVelocity,trend:we.velocityTrend,accuracy:we.estimationAccuracy}:null,backlogCount:Fe.length,completedTaskCount:jt.length,pausedTaskCount:rt.length,knownGotchas:yt?.knownGotchas??[],userPatterns:yt?.patternsDiscovered??[],hasActiveTask:!!fs,activeTaskDescription:fs?.description??"",pausedTasks:rt.map(oe=>({description:oe.description,pausedAt:oe.pausedAt??""})),topBacklog:Fe.slice(0,3).map(oe=>({description:oe.description,priority:oe.priority??"medium"})),ideasCount:Ni?.pending??0,shippedCount:Li};b=await Im.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Wi,stack:d},Fi,Gi)}catch(k){G.debug("Native skill generation failed (non-critical)",{error:de(k)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let w=await Ye.getActive(this.projectId),v={patterns:w?.patterns?.length||0,antiPatterns:w?.antiPatterns?.length||0,criticalAntiPatterns:w?.antiPatterns?.filter(k=>k.severity==="high").length||0},A=Date.now()-s,F=await this.recordSyncMetrics(c,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Re.installGlobalConfig(),await Re.syncCommands();let J;try{let k=await I.readConfig(this.projectPath);J=await Gm.verify(this.projectPath,this.globalPath,k?.verification)}catch(k){G.debug("Verification failed (non-critical)",{error:de(k)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:v,syncMetrics:F,verification:J,incremental:p,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:de(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Vm.mkdir(Ac.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=P.getDoc(this.projectId,"project")||{},n={...s,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:s.createdAt||S(),lastSync:S(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};P.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await _.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=S(),n.lastUpdated=S(),n.context={...n.context||{},lastSession:S(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await Rm.generate(this.projectPath,n)}catch(o){G.debug("Local state generation failed (optional)",{error:de(o)})}}async logToMemory(e,t){P.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=To(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){G.debug("Could not load BM25 index for metrics",{error:de(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await xn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:de(a)})}let i={};try{let a=To(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=xo(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Nd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:de(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Dm.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await Ye.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:S(),status:"draft",commitHash:o??void 0})}catch(o){G.debug("Failed to save draft analysis (non-critical)",{error:de(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([qe.archiveOldShipped(this.projectId).catch(()=>0),We.markDormantIdeas(this.projectId).catch(()=>0),le.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),xt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){G.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Ot.getStats(this.projectId);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:de(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new yn,s=await yc.learnFromTaskHistory(this.projectId,e,t);try{let n=await Cm.getFeatureOutcomes(this.projectId);n.length>0&&await yc.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&G.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){G.debug("Auto-learning failed (non-critical)",{error:de(e)})}}async getCliVersion(){try{let e=Ac.join(__dirname,"..","..","package.json");return(await be(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:de(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:[]}}},Ks=new Dc});var Km={};Lt(Km,{mdActionRequired:()=>ft,mdBadge:()=>qo,mdCallout:()=>qt,mdCodeBlock:()=>Ic,mdDone:()=>ue,mdError:()=>Bw,mdFooter:()=>Jm,mdFrontmatter:()=>zm,mdHeader:()=>qm,mdJoin:()=>Jo,mdList:()=>Ae,mdNextSteps:()=>re,mdObsidianNote:()=>ds,mdOutput:()=>L,mdRelevantFiles:()=>Mc,mdSection:()=>X,mdStats:()=>_e,mdSubtasks:()=>$c,mdTable:()=>xs,mdTaskHeader:()=>Rn,mdWarn:()=>_c});function qm(){return"---"}function Jm(){return`---
|
|
790
|
+
prjct v${Ms()}`}function L(...r){return Jo(qm(),...r.filter(Boolean),Jm())}function xs(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
791
|
+
`)}function Ic(r,e=""){return`\`\`\`${e}
|
|
771
792
|
${r}
|
|
772
|
-
\`\`\``}function
|
|
773
|
-
${e}`}function
|
|
774
|
-
`)}function
|
|
775
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
776
|
-
${
|
|
793
|
+
\`\`\``}function qo(r,e){return`**${r}**: \`${e}\``}function qt(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function X(r,e,t=3){return`### ${r}
|
|
794
|
+
${e}`}function Ae(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
795
|
+
`)}function Rn(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.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
796
|
+
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function $c(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
|
|
797
|
+
${xs(t,s)}`}function Mc(r){return r.length===0?"":`### Relevant Files
|
|
777
798
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
778
|
-
`)}`}function
|
|
779
|
-
${
|
|
780
|
-
> ${e}`:`## ${r}`}function
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
`)
|
|
784
|
-
|
|
785
|
-
`)
|
|
786
|
-
`)
|
|
787
|
-
${
|
|
788
|
-
`),this)},
|
|
789
|
-
`),
|
|
790
|
-
|
|
791
|
-
`)}
|
|
799
|
+
`)}`}function re(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
800
|
+
${xs(e,t)}`}function _e(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return xs(t,s)}function ue(r,e){return e?`## ${r}
|
|
801
|
+
> ${e}`:`## ${r}`}function _c(r){return`> **WARNING:** ${r}`}function Bw(r){return`> **ERROR:** ${r}`}function zm(r){let e=["---"];for(let[t,s]of Object.entries(r))s!=null&&(Array.isArray(s)?e.push(`${t}: [${s.map(n=>String(n)).join(", ")}]`):typeof s=="object"||e.push(`${t}: ${String(s)}`));return e.push("---"),e.join(`
|
|
802
|
+
`)}function ds(r,e,...t){return[zm(r),`# ${e}`,...t.filter(Boolean)].join(`
|
|
803
|
+
|
|
804
|
+
`)}function Jo(...r){return r.filter(Boolean).join(`
|
|
805
|
+
|
|
806
|
+
`)}function ft(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
|
|
807
|
+
`))}var Zt=E(()=>{"use strict";$t();l(qm,"mdHeader");l(Jm,"mdFooter");l(L,"mdOutput");l(xs,"mdTable");l(Ic,"mdCodeBlock");l(qo,"mdBadge");l(qt,"mdCallout");l(X,"mdSection");l(Ae,"mdList");l(Rn,"mdTaskHeader");l($c,"mdSubtasks");l(Mc,"mdRelevantFiles");l(re,"mdNextSteps");l(_e,"mdStats");l(ue,"mdDone");l(_c,"mdWarn");l(Bw,"mdError");l(zm,"mdFrontmatter");l(ds,"mdObsidianNote");l(Jo,"mdJoin");l(ft,"mdActionRequired")});import $r from"chalk";function Rt(r,e={}){if(e.quiet)return;let t=Ym[r]||"idle",s=Bs.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Xm[o]||o}));console.log($r.dim(`
|
|
808
|
+
Next:`));for(let o of n){let i=$r.cyan(o.cmd.padEnd(12));console.log($r.dim(` ${i} \u2192 ${o.desc}`))}}function zo(r,e=!1){let t=Ym[r]||"idle";return Bs.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Xm[n]||n}))}function Mr(r){let e=Bs.getStateInfo(r);console.log($r.dim(`\u{1F4CD} State: ${$r.white(r.toUpperCase())} - ${e.description}`))}var Xm,Ym,An=E(()=>{"use strict";$a();Xm={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"},Ym={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(Rt,"showNextSteps");l(zo,"getNextSteps");l(Mr,"showStateInfo")});import Xs from"chalk";var Qm,Vw,qw,Jt,Zm=E(()=>{"use strict";pt();Qm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Vw=80,qw={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Qm,speed:Vw},cli:{header:l(()=>`${Xs.cyan.bold("\u26A1")} ${Xs.cyan("prjct")}`,"header"),footer:l(()=>Xs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Xs.cyan("\u26A1")} ${Xs.cyan("prjct")} ${Xs.cyan(Qm[r%10])} ${Xs.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")=>to(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>to(r).signature,"getSignature")},Jt=qw});import me from"chalk";function Kw(){return Jw[zw]}var S0,Oc,Jw,zw,Ys,Dn,Nc,At,Rs,Xw,Yw,f,Qe=E(()=>{"use strict";Zm();qs();Ao();Ao();S0=Jt.spinner.frames,Oc=Jt.spinner.speed,Jw={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}},zw="compact";l(Kw,"getTierConfig");Ys={success:me.green("\u2713"),fail:me.red("\u2717"),warn:me.yellow("\u26A0"),info:me.blue("\u2139"),debug:me.dim("\u{1F527}"),bullet:me.dim("\u2022"),arrow:me.dim("\u2192"),check:me.green("\u2713"),cross:me.red("\u2717"),spinner:me.cyan("\u25D0")},Dn=null,Nc=0,At=!1,Rs=l((r,e)=>{let t=e??(Kw().maxCharsPerLine||Gt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Xw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Gt.CLEAR_WIDTH)}\r`):!0,"clear"),Yw={start(){return At||console.log(Jt.cli.header()),this},end(){return At||console.log(Jt.cli.footer()),this},spin(r){return At?this:(this.stop(),process.stdout.isTTY?(Dn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(Nc++,Rs(r,Gt.SPINNER_MSG))}`)},Oc),this):(process.stdout.write(`${Jt.cli.spin(0,Rs(r,Gt.SPINNER_MSG))}
|
|
809
|
+
`),this))},done(r,e){if(this.stop(),!At){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=me.dim(` [${s.join(" | ")}]`))}console.log(`${Ys.success} ${Rs(r,Gt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Ys.fail} ${Rs(r,Gt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Ka(r):r;return console.error(),console.error(`${Ys.fail} ${e.message}`),e.file&&console.error(me.dim(` File: ${e.file}`)),e.hint&&console.error(me.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(me.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),At||console.log(`${Ys.warn} ${Rs(r,Gt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Ys.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Ys.debug} ${me.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),At)return this;let t=e.bullet||Ys.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),At||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(me.dim(n)),console.log(me.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),At)return this;let t=e.split(`
|
|
810
|
+
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(me.dim(`\u250C${n}\u2510`)),console.log(`${me.dim("\u2502")} ${me.bold(r.padEnd(s))} ${me.dim("\u2502")}`),console.log(me.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${me.dim("\u2502")} ${o.padEnd(s)} ${me.dim("\u2502")}`);return console.log(me.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),At?this:(console.log(`
|
|
811
|
+
${me.bold(r)}`),console.log(me.dim("\u2500".repeat(r.length))),this)},stop(){return Dn&&(clearInterval(Dn),Dn=null,Xw()),this},step(r,e,t){if(At)return this;this.stop();let s=me.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Dn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(Nc++,`${s} ${Rs(t,Gt.STEP_MSG)}`)}`)},Oc),this):(process.stdout.write(`${Jt.cli.spin(0,`${s} ${Rs(t,Gt.STEP_MSG)}`)}
|
|
812
|
+
`),this)},progress(r,e,t){if(At)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=me.cyan("\u2588".repeat(n))+me.dim("\u2591".repeat(o)),a=t?` ${Rs(t,Gt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Dn=setInterval(()=>{process.stdout.write(`\r${Jt.cli.spin(Nc++,`[${i}] ${s}%${a}`)}`)},Oc),this):(process.stdout.write(`${Jt.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
813
|
+
`),this)}},f=Yw});import Qw from"node:path";async function Lc(r,e){let t=Date.now()-e;await Re.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${jn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
|
|
814
|
+
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Rt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function ep(r){try{let e=await xt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.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];n=ut(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)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:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function jn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Fc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function tp(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function sp(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.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("## 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("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${jn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${So(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Fc(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## 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("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${jn(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(`
|
|
815
|
+
`)}function np(r,e){let t=[];t.push(`# Repository Analysis
|
|
792
816
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
793
|
-
`);let s=
|
|
817
|
+
`);let s=Qw.basename(e);if(t.push(`## Project: ${s}
|
|
794
818
|
`),t.push(`## Stack Detected
|
|
795
819
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
796
820
|
`),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
|
|
@@ -806,10 +830,10 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
806
830
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
807
831
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
808
832
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
809
|
-
`)}var
|
|
833
|
+
`)}var rp=E(()=>{"use strict";is();bo();zs();K();An();Qe();l(Lc,"showSyncResult");l(ep,"getSessionActivity");l(jn,"formatTokens");l(Fc,"formatDuration");l(tp,"generateSparkline");l(sp,"generateStatsMarkdown");l(np,"generateAnalysisSummary")});var op,ip,ap=E(()=>{"use strict";op=["task","done","ship","resume","bug","enrich"],ip=["init","sync","pause","next","dash","history","undo","redo"]});import es from"chalk";function Zw(r){return cp[r.toLowerCase()]||cp.default}var cp,Uc,lp,up=E(()=>{"use strict";cp={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(Zw,"getIcon");Uc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(es.cyan(`
|
|
810
834
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
811
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
812
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
835
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Zw(t);console.log(es.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(es.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(es.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(es.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?es.green("\u2713"):es.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${es.dim(`(${s})`)}
|
|
836
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${es.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(es.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},lp=new Uc});import dp from"node:fs";import Ko from"node:path";function ek(r){if(Fs()){let{Database:n}=Tt("bun:sqlite");return new n(r,{create:!0})}let e=Tt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Hc,tk,mp=E(()=>{"use strict";kr();l(ek,"openDatabase");Hc=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ko.resolve(e):Ko.join(Tt("node:os").homedir(),".prjct-cli");this.dbPath=Ko.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ko.dirname(this.dbPath);dp.existsSync(e)||dp.mkdirSync(e,{recursive:!0});let t=ek(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
|
|
813
837
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
814
838
|
version INTEGER PRIMARY KEY,
|
|
815
839
|
name TEXT NOT NULL,
|
|
@@ -830,14 +854,14 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
830
854
|
INSERT OR REPLACE INTO mcp_health
|
|
831
855
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
832
856
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
833
|
-
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},
|
|
834
|
-
`)}function op(r){console.log(Yw(r))}var rp,ip=v(()=>{"use strict";rp=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(Kw,"getDomainColor");l(Xw,"formatSubtaskLine");l(Yw,"renderSubtaskProgress");l(op,"printSubtaskProgress")});function Zw(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 ek(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Qw)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Zw(t)};return{detected:!1}}function tk(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function sk(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 nk(r,e,t){let s={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 s[e.type]||s.unknown}function rk(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 Qw,Mc,ok,Cn,ap=v(()=>{"use strict";Qw=[{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(Zw,"getHallucinationSuggestion");l(ek,"detectHallucination");l(tk,"isSimilarError");l(sk,"analyzeErrorPattern");l(nk,"generateEscalationMessage");l(rk,"generateSuggestion");Mc=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="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);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=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>tk(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=sk(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:nk(e,o,this.maxAttempts),suggestion:rk(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return ek(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},ok=new Mc,Cn=ok});function _c(r,e){let t=Ar(e),s=Fu[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function ik(r,e){let t=Ar(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function ak(r,e,t){let s=Ar(t),n=_c(r,t),o=_c(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Bo(r,e=Ss){let t=Ar(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=ck(r,e),n=lk(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=mk(o),a=uk(o),c=dk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=pk(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function lp(r,e,t=Ss){let s=Ar(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function ck(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=ak(i,n,e);if(!t.has(a)){let c=_c(i,e),u=ik(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function lk(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+gk(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Oc(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:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function uk(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function dk(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Oc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function mk(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function pk(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Oc(n),i=n.tags&&n.tags.length>0?n.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=[],s=[];for(let[n,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?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function Oc(r){if(!r.variance)return 0;let e=St(r.estimatedDuration),t=St(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function up(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(`
|
|
835
|
-
`)}function
|
|
857
|
+
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},tk=new Hc});import sk from"node:fs/promises";import pp from"node:os";import Xo from"node:path";function nk(){try{let r=Xo.dirname(Tt.resolve("prjct-cli/package.json"));return{command:"node",args:[Xo.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function ms(){return process.env.PRJCT_TEST_MODE==="1"?Xo.join(pp.tmpdir(),"prjct-context7-test","mcp.json"):Xo.join(pp.homedir(),".claude","mcp.json")}async function gp(r=ms()){try{let e=await sk.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${y(e)}`)}}async function rk(r,e=ms()){await ce(e,r)}async function Gc(r,e,t=ms()){let s=await gp(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await rk(s,t),{path:t,changed:i}}async function Qs(r,e=ms()){return!!(await gp(e)).mcpServers?.[r]}var Yo,Wc,J0,Qo=E(()=>{"use strict";mp();W();V();Yo="mcp-remote@0.1.38";l(nk,"getPrjctMcpConfig");Wc={prjct:nk(),linear:{command:"npx",args:["-y",Yo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Yo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},J0={linear:`npx -y ${Yo} https://mcp.linear.app/mcp`,jira:`npx -y ${Yo} https://mcp.atlassian.com/v1/mcp`};l(ms,"getClaudeMcpConfigPath");l(gp,"readMcpConfig");l(rk,"writeMcpConfig");l(Gc,"upsertMcpServer");l(Qs,"hasMcpServer")});import st from"chalk";function ok(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%fp.length;return fp[t]}function ik(r,e,t="\u25B6"){let s=st.dim(String(r+1).padStart(2)),o=ok(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=st.green("\u2713 Complete");break;case"in_progress":a=st.yellow(`${t} Working...`);break;case"pending":a=st.gray("\u25CB Pending");break;case"failed":a=st.red("\u2717 Failed");break;case"blocked":a=st.gray("\u2298 Blocked");break;default:a=st.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function ak(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${st.bold.white("SUBTASK PROGRESS")}`),e.push(` ${st.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(ik(t,r[t]));return e.push(""),e.join(`
|
|
858
|
+
`)}function hp(r){console.log(ak(r))}var fp,yp=E(()=>{"use strict";fp=[st.cyan,st.magenta,st.yellow,st.blue,st.green,st.redBright,st.magentaBright,st.cyanBright];l(ok,"getDomainColor");l(ik,"formatSubtaskLine");l(ak,"renderSubtaskProgress");l(hp,"printSubtaskProgress")});function lk(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 uk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of ck)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:lk(t)};return{detected:!1}}function dk(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function mk(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 pk(r,e,t){let s={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 s[e.type]||s.unknown}function gk(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 ck,Bc,fk,In,wp=E(()=>{"use strict";ck=[{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(lk,"getHallucinationSuggestion");l(uk,"detectHallucination");l(dk,"isSimilarError");l(mk,"analyzeErrorPattern");l(pk,"generateEscalationMessage");l(gk,"generateSuggestion");Bc=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="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);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=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>dk(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=mk(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:pk(e,o,this.maxAttempts),suggestion:gk(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return uk(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},fk=new Bc,In=fk});function Vc(r,e){let t=_r(e),s=Xu[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function hk(r,e){let t=_r(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function yk(r,e,t){let s=_r(t),n=Vc(r,t),o=Vc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Zo(r,e=Cs){let t=_r(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=wk(r,e),n=kk(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=Tk(o),a=Sk(o),c=bk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=vk(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Sp(r,e,t=Cs){let s=_r(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function wk(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=yk(i,n,e);if(!t.has(a)){let c=Vc(i,e),u=hk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function kk(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Ek(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>qc(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:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Sk(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function bk(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=qc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Tk(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function vk(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=qc(n),i=n.tags&&n.tags.length>0?n.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=[],s=[];for(let[n,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?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function qc(r){if(!r.variance)return 0;let e=vt(r.estimatedDuration),t=vt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function bp(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(`
|
|
859
|
+
`)}function Ek(r){if(!r.estimatedDuration)return 0;let e=vt(r.estimatedDuration);if(e<=0)return 0;let t=kp[0],s=Number.POSITIVE_INFINITY;for(let n of kp){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function _r(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var kp,Jc=E(()=>{"use strict";vr();Rr();K();l(Vc,"getSprintStart");l(hk,"getSprintEnd");l(yk,"getSprintNumber");l(Zo,"calculateVelocity");l(Sp,"projectCompletion");l(wk,"bucketBySprint");l(kk,"buildSprintVelocities");l(Sk,"detectTrend");l(bk,"calculateOverallAccuracy");l(Tk,"calculateAverageVelocity");l(vk,"detectEstimationPatterns");l(qc,"parseVariancePercent");l(bp,"formatVelocityContext");kp=[{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(Ek,"derivePoints");l(_r,"resolveConfig")});import Pk from"node:fs/promises";import ei from"node:path";async function $n(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=zc(r),c=await Ak(e),u=await Dk(e),d=[];for(let p of c){if(!i&&Ik(p))continue;let g=jk(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,n);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function zc(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(s=>!t.has(s)&&s.length>2)}async function Ak(r){let e=[];async function t(s,n=""){try{let o=await Pk.readdir(s,{withFileTypes:!0});for(let i of o){let a=ei.join(s,i.name),c=ei.join(n,i.name);if(i.isDirectory()){if(Rk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=ei.extname(i.name).toLowerCase();xk.has(u)&&e.push(c)}}}catch(o){D(o)}}return l(t,"walk"),await t(r),e}async function Dk(r){let e=new Map;try{let{stdout:t}=await N(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
836
860
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
837
861
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
838
862
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
839
863
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
840
|
-
`).filter(Boolean);for(let o of n){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((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function
|
|
864
|
+
`).filter(Boolean);for(let o of n){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((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function jk(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,n.push(`keyword:${w}`));for(let v of m)if(v.includes(w)||w.includes(v)){o+=.15;break}}o=Math.min(1,o);for(let[w,v]of Object.entries(Ck))for(let A of v)if(d.includes(A)&&e.some(J=>v.includes(J)||J.includes(w)||w.includes(J))){i+=.4,n.push(`domain:${w}`);break}i=Math.min(1,i);let p=t.get(r);p&&(p.daysAgo<=1?(a=1,n.push("recent:1d")):p.daysAgo<=3?(a=.8,n.push("recent:3d")):p.daysAgo<=7?(a=.6,n.push("recent:1w")):p.daysAgo<=30&&(a=.3,n.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=ei.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(w=>w.startsWith("import:"))||n.push("import:1")),s){let w=s.get(r);w!==void 0&&(u=(w+1)/2,w>0?n.push("history:boosted"):w<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function Ik(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 Ck,xk,Rk,ti=E(()=>{"use strict";W();Ue();Ck={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"]},xk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Rk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l($n,"findRelevantFiles");l(zc,"extractKeywords");l(Ak,"getAllCodeFiles");l(Dk,"getGitRecency");l(jk,"scoreFile");l(Ik,"isTestFile")});async function Tp(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await _k(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Mk(r,t);return o=o.filter(c=>!Ok(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function Mk(r,e){let{stdout:t}=await N(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
841
865
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
842
866
|
NF {
|
|
843
867
|
count[$0]++
|
|
@@ -847,8 +871,8 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
847
871
|
for (f in count) print count[f], lastmod[f], f
|
|
848
872
|
}
|
|
849
873
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
850
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){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),h=Math.floor(p/3600),b=Math.max(0,1-g/30),
|
|
851
|
-
`).filter(Boolean),{stdout:n}=await
|
|
874
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){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),h=Math.floor(p/3600),b=Math.max(0,1-g/30),w=u/i,v=b*.6+w*.4,A;h<1?A="just now":h<24?A=`${h}h ago`:g<7?A=`${g}d ago`:g<30?A=`${Math.floor(g/7)}w ago`:A=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(v*100)/100,lastChanged:A,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function _k(r){let e="main";try{await N("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await N(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
|
|
875
|
+
`).filter(Boolean),{stdout:n}=await N(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
852
876
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
853
877
|
NF {
|
|
854
878
|
count[$0]++
|
|
@@ -858,15 +882,15 @@ ${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
858
882
|
for (f in count) print count[f], lastmod[f], f
|
|
859
883
|
}
|
|
860
884
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
861
|
-
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],h=a-p,b=Math.floor(h/86400),
|
|
862
|
-
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:
|
|
885
|
+
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],h=a-p,b=Math.floor(h/86400),w=Math.floor(h/3600),v=Math.max(0,1-b/14),A=m/c,F=v*.5+A*.5,J;w<1?J="just now":w<24?J=`${w}h ago`:J=`${b}d ago`,o.push({path:g,changes:m,heatScore:Math.round(F*100)/100,lastChanged:J,lastChangedAt:new Date(p*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function Ok(r){let e=r.split("/").pop()||"";for(let t of $k)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var $k,vp=E(()=>{"use strict";Ue();$k=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Tp,"getRecentFiles");l(Mk,"getHotFilesFromCommits");l(_k,"getBranchOnlyFiles");l(Ok,"shouldIgnore")});function Kc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Ep(r,e){let t=Nk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Fk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Cp(r,e){let t=Kc(r),s=Kc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Ep(n,Lk),a=Pp.map(c=>({model:c,...Ep(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Fk(i.total),byModel:a}}}function si(r){let e=Kc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Pp.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Nk,Lk,Pp,xp=E(()=>{"use strict";Po();Nk={"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}},Lk="claude-sonnet-4.5";l(Kc,"countTokens");Pp=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Ep,"calculateModelCost");l(Fk,"formatCostSaved");l(Cp,"measureCompression");l(si,"noCompression")});import Uk from"node:fs/promises";import Mn from"node:path";async function Dp(r,e=process.cwd()){let t=Mn.isAbsolute(r)?r:Mn.join(e,r),s=Mn.resolve(e),n=Mn.resolve(t);if(!n.startsWith(s+Mn.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:si("")};let o;try{o=await Uk.readFile(t,"utf-8")}catch(m){if(D(m))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:si("")};throw m}let i=Mn.extname(r).toLowerCase(),a=Hk[i]||"unknown",c=Vk[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:si(o)};let u=qk(o,c),d=u.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
886
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:Cp(o,d)}}function qk(r,e){let t=[],s=r.split(`
|
|
863
887
|
`),n=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(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
864
|
-
`).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:
|
|
865
|
-
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await
|
|
866
|
-
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.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 s=t.filter(n=>{if(!n.variance)return!1;let o=
|
|
867
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.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,s]=await Promise.all([
|
|
868
|
-
`).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:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=
|
|
869
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},
|
|
888
|
+
`).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:Jk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Jk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Hk,Rp,Wk,Gk,Bk,Ap,Vk,jp=E(()=>{"use strict";W();xp();Hk={".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"},Rp=[{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}],Wk=[{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}],Gk=[{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}],Bk=[{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}],Ap=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],Vk={typescript:Rp,javascript:Rp,python:Wk,go:Gk,rust:Bk,java:Ap,csharp:Ap,php:[],ruby:[],unknown:[]};l(Dp,"extractSignatures");l(qk,"extractFromContent");l(Jk,"cleanSignature")});import Xc from"node:path";var zk,Kk,Yc,Xk,kt,_n=E(()=>{"use strict";Se();Ct();K();V();zk="outcomes",Kk="outcomes.jsonl",Yc=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=R.getGlobalProjectPath(e);return Xc.join(t,zk)}getOutcomesPath(e){return Xc.join(this.getOutcomesDir(e),Kk)}async record(e,t){let s={...t,id:z()},n=this.getOutcomesPath(e);return await ze(Xc.dirname(n)),await du(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await $e(t);if(!a.trim())return[];let c=a.trim().split(`
|
|
889
|
+
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await $e(t);return s.trim()?s.trim().split(`
|
|
890
|
+
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.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 s=t.filter(n=>{if(!n.variance)return!1;let o=dn(n.variance),i=vt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Xk=new Yc,kt=Xk});import{z as Oe}from"zod";var ni,On,Yk,jj,Qc,Ip,ri=E(()=>{"use strict";ni=Oe.string(),On=Oe.object({primaryDomain:ni,secondaryDomains:Oe.array(ni),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),Yk=Oe.object({classification:On,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),jj=Oe.object({entries:Oe.record(Oe.string(),Yk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:On,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),Qc={entries:{},confirmedPatterns:[]},Ip={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Zk from"node:fs/promises";import _p from"node:path";function $p(r){return Us(r.toLowerCase().trim())}async function Mp(r){try{let e=_p.join(r,"storage","classification-cache.json"),t=await Zk.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e)?Qc:(console.warn("[classifier] Failed to load cache:",y(e)),Qc)}}async function eS(r,e){try{let t=_p.join(r,"storage","classification-cache.json");await ce(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function tS(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||ks(s.classifiedAt,36e5)?null:s.classification}function sS(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Zc,nS,Op,Np=E(()=>{"use strict";hr();ri();W();Os();V();Hs();l($p,"hashDescription");l(Mp,"loadCache");l(eS,"saveCache");l(tS,"lookupCache");l(sS,"lookupPatterns");Zc=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=$p(e),o=await Mp(s),i=tS(o,n,t);if(i)return{classification:i,source:"cache"};let a=sS(o,n);return a?{classification:a,source:"history"}:{classification:Ip,source:"heuristic"}}async confirmClassification(e,t,s){let n=$p(e),o=await Mp(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await eS(s,o))}},nS=new Zc,Op=nS});import rS from"node:fs/promises";import oS from"node:path";var el,iS,oi,tl=E(()=>{"use strict";Jc();xe();Se();Rr();Tn();Er();gt();ti();vp();jp();W();Ue();_n();Np();el=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await I.getProjectId(s),o=R.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],m=[],p=u.map((J,k)=>{if(J.status==="fulfilled")return J.value;m.push(d[k]),console.warn(`Context tool "${d[k]}" failed: ${y(J.reason)}`)}),[g,h,b]=p,w={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},v=this.shouldFragment(a,t),A=null;v&&e==="task"&&(A=await this.createSubtasks(t,a,[],n));let F=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:v,subtasks:A,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:b??null,contextDegradation:w,rpiContext:F}}resolveRpiPhase(e){try{let{prjctDb:t}=(Z(),lt(co)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),$n(e,t,{maxFiles:10,minScore:.15}),Tp(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Dp(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(`
|
|
891
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.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,s]=await Promise.all([N("git branch --show-current",{cwd:e}),N("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
892
|
+
`).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:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Wt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await Ye.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await kt.getAll(e);if(t.length===0)return null;let s=Zo(t,Cs);return s.sprints.length===0?null:bp(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=oS.join(e,"analysis","repo-analysis.json"),s=await rS.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return D(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let n=R.getGlobalProjectPath(t),{classification:o}=await Op.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,m=i.get(c)||[],p=m.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:p?"in_progress":"pending",dependsOn:m,order:u+1}});return await _.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},iS=new el,oi=iS});function aS(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 sl,cS,Ge,Lp=E(()=>{"use strict";Ct();K();qs();qs();l(aS,"generateApprovalPrompt");sl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ya.includes(e)}isDestructive(e){return Qa.includes(e)}isToolAllowedInPlanning(e){return Io.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Io.includes(s)):t}startPlanning(e,t,s){let n={id:z(),projectId:e,command:t,params:s,status:ie.GATHERING,startedAt:S(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[ie.GATHERING,ie.ANALYZING,ie.PROPOSING,ie.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:S()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ie.APPROVED?s.approvedAt=S():t===ie.EXECUTING?s.executionStartedAt=S():(t===ie.COMPLETED||t===ie.ABORTED)&&(s.completedAt=S()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ie.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ie.PENDING_APPROVAL,this.formatPlanForApproval(s)):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 s=this.getActivePlan(e);return!s||s.status!==ie.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ie.APPROVED,s.approvedAt=S(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=ie.REJECTED,s.userFeedback=t,s.completedAt=S(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==ie.APPROVED?null:(t.status=ie.EXECUTING,t.executionStartedAt=S(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ie.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==ie.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=S(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=ie.COMPLETED,t.completedAt=S();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=ie.ABORTED,s.completedAt=S(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return aS(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ie.GATHERING]:"\u{1F50D}",[ie.ANALYZING]:"\u{1F9E0}",[ie.PROPOSING]:"\u{1F4DD}",[ie.PENDING_APPROVAL]:"\u23F3",[ie.APPROVED]:"\u2705",[ie.EXECUTING]:"\u26A1",[ie.COMPLETED]:"\u{1F389}",[ie.REJECTED]:"\u274C",[ie.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ie.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
|
|
893
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},cS=new sl,Ge=cS});var nl,lS,Fp,Up=E(()=>{"use strict";K();_n();nl=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await kt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,n=await kt.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(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await kt.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,w)=>b+w.qualityScore,0)/a,m=i.filter(b=>{if(!b.variance)return!1;let w=dn(b.variance),v=vt(b.estimatedDuration);return v===0?!1:Math.abs(w)/v<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let b of i.filter(w=>w.completedAsPlanned))for(let w of b.tags||[])g.set(w,(g.get(w)||0)+1);let h=[...g.entries()].sort((b,w)=>w[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:h})}return n}async detectPatterns(e){let t=await kt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>dn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>dn(c.variance)<0);o.length/t.length>.6&&s.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&&s.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&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await kt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+vt(c.actualDuration),0),i=Math.round(o/n.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 n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},lS=new nl,Fp=lS});var Vp={};Lt(Vp,{AgentAssignmentSchema:()=>Hp,OUTPUT_SCHEMAS:()=>Gp,SubtaskBreakdownSchema:()=>Wp,TaskClassificationSchema:()=>On,renderSchemaForPrompt:()=>uS});import{z as Ze}from"zod";function uS(r){let e=Gp[r];return e?`## OUTPUT FORMAT
|
|
870
894
|
|
|
871
895
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
872
896
|
|
|
@@ -875,10 +899,10 @@ ${e.example}
|
|
|
875
899
|
\`\`\`
|
|
876
900
|
|
|
877
901
|
Fields:
|
|
878
|
-
${
|
|
879
|
-
`)}return"(see example above)"}function
|
|
880
|
-
... (truncated to ~${e} tokens)`}function
|
|
881
|
-
`);return
|
|
902
|
+
${dS(e.schema)}`:null}function dS(r){if(r instanceof Ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Bp(s)}`).join(`
|
|
903
|
+
`)}return"(see example above)"}function Bp(r){return r instanceof Ze.ZodString?"string":r instanceof Ze.ZodNumber?"number":r instanceof Ze.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ze.ZodArray?`array of ${Bp(r.element)}`:r instanceof Ze.ZodObject?"object":"any"}var Hp,Wp,Gp,qp=E(()=>{"use strict";ri();ri();Hp=Ze.object({agentName:Ze.string(),reasoning:Ze.string(),confidence:Ze.number().min(0).max(1)}),Wp=Ze.object({subtasks:Ze.array(Ze.object({description:Ze.string(),domain:ni,agent:Ze.string(),dependsOn:Ze.array(Ze.number())})),effort:Ze.enum(["low","medium","high"])}),Gp={classification:{schema:On,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Hp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Wp,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(uS,"renderSchemaForPrompt");l(dS,"describeSchema");l(Bp,"describeField")});import Jp from"node:fs/promises";import Nn from"node:path";function ii(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
904
|
+
... (truncated to ~${e} tokens)`}function zp(r){return Math.ceil(r.length/4)}var rl,ol,il,mS,Kp,Xp=E(()=>{"use strict";Po();Nt();gt();W();V();$t();Up();Gs();rl={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ii,"truncateToTokenBudget");l(zp,"estimateTokens");ol=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...rl,...e}}addSection(e,t){let s=ii(e,t),n=zp(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ii(s,o);return this.used+=zp(i),i}return this.used+=n,s}},il=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await Jp.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){D(n)||console.error(`Template loading warning: ${y(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=wt(`global/modules/${e}`);if(t)return t;let s=Nn.join(dt,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=kn("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=wt(n);if(o){let i=Nn.basename(n,".md");t[i]=o}}}else{let n=Nn.join(dt,"templates","checklists");if(await C(n)){let o=(await Jp.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Nn.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){D(s)||console.error(`Checklist loading warning: ${y(s)}`)}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[s,n]=await Promise.all([_.read(e),le.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(D(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await Fp.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!D(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let n=s.join(`
|
|
905
|
+
`);return ii(n,rl.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=Nn.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=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,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let m=d?.skipNativeContext??!1,p=d?.mcpActive??!1,g=[],h=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
|
|
882
906
|
`),n.role&&g.push(`Role: ${n.role}
|
|
883
907
|
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
884
908
|
`),g.push(`
|
|
@@ -886,122 +910,122 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
886
910
|
|
|
887
911
|
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
888
912
|
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
889
|
-
`);let
|
|
890
|
-
`);let
|
|
913
|
+
`);let w=t;(w.params?.task||w.params?.description)&&g.push(`INPUT: ${w.params.task||w.params.description}
|
|
914
|
+
`);let v=t.projectPath;if(v){let j=[`project: ${Nn.basename(v)}`,`path: ${v}`,"git: true"];u?.realContext?.gitBranch&&j.push(`branch: ${u.realContext.gitBranch}`),j.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
|
|
891
915
|
<env>
|
|
892
|
-
${
|
|
916
|
+
${j.join(`
|
|
893
917
|
`)}
|
|
894
918
|
</env>
|
|
895
|
-
`)}if(u){let
|
|
919
|
+
`)}if(u){let k=u.sealedAnalysis;if(g.push(`
|
|
896
920
|
## PROJECT ANALYSIS (Sealed)
|
|
897
921
|
`),g.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
898
922
|
`),g.push(`**Primary Domain**: ${u.primaryDomain}
|
|
899
923
|
`),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
900
|
-
`),
|
|
901
|
-
`),
|
|
902
|
-
`),
|
|
903
|
-
`),
|
|
904
|
-
`),
|
|
905
|
-
`),g.push(`**Files Analyzed**: ${
|
|
906
|
-
`),g.push(`**Analysis Status**: ${
|
|
907
|
-
`),!m)){if(
|
|
924
|
+
`),k&&(k.languages?.length>0&&g.push(`**Languages**: ${k.languages.join(", ")}
|
|
925
|
+
`),k.frameworks?.length>0&&g.push(`**Frameworks**: ${k.frameworks.join(", ")}
|
|
926
|
+
`),k.packageManager&&g.push(`**Package Manager**: ${k.packageManager}
|
|
927
|
+
`),k.sourceDir&&g.push(`**Source Dir**: ${k.sourceDir}
|
|
928
|
+
`),k.testDir&&g.push(`**Test Dir**: ${k.testDir}
|
|
929
|
+
`),g.push(`**Files Analyzed**: ${k.fileCount}
|
|
930
|
+
`),g.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
|
|
931
|
+
`),!m)){if(k.patterns?.length>0){g.push(`
|
|
908
932
|
### Code Patterns (Follow These)
|
|
909
|
-
`);for(let
|
|
910
|
-
`)}if(
|
|
933
|
+
`);for(let j of k.patterns)g.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
934
|
+
`)}if(k.antiPatterns?.length>0){g.push(`
|
|
911
935
|
### Anti-Patterns (Avoid These)
|
|
912
|
-
`);for(let
|
|
936
|
+
`);for(let j of k.antiPatterns)g.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
913
937
|
`)}}g.push(`
|
|
914
|
-
`)}if(!m){let
|
|
915
|
-
`),g.push(
|
|
938
|
+
`)}if(!m){let k=s?.codePatterns||"";if(b.patterns&&k&&k.trim()){let O=this.extractPatternSummary(k);O&&(g.push(`## CODE PATTERNS
|
|
939
|
+
`),g.push(O),g.push(`
|
|
916
940
|
Full patterns: Read analysis/patterns.md
|
|
917
|
-
`))}let
|
|
941
|
+
`))}let j=s?.analysis||"";if(b.patterns&&j&&j.trim()){let O=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),we=O?O[1].trim():"detected";g.push(`
|
|
918
942
|
## STACK
|
|
919
|
-
Stack: ${
|
|
920
|
-
`),
|
|
921
|
-
`)}}if(b.modules.length>0)for(let
|
|
922
|
-
`),g.push(
|
|
943
|
+
Stack: ${we}
|
|
944
|
+
`),k||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
945
|
+
`)}}if(b.modules.length>0)for(let k of b.modules){let j=await this.loadModule(k);j&&(g.push(`
|
|
946
|
+
`),g.push(j))}if(c?.isPlanning&&(g.push(`
|
|
923
947
|
## PLAN MODE
|
|
924
948
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
925
949
|
`),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
|
|
926
950
|
`)),c?.requiresApproval&&g.push(`
|
|
927
951
|
## APPROVAL REQUIRED
|
|
928
952
|
Show changes, list affected files, ask for confirmation.
|
|
929
|
-
`),
|
|
953
|
+
`),v){g.push(`
|
|
930
954
|
## CONSTRAINTS
|
|
931
|
-
SCOPE: Only files in \`${
|
|
932
|
-
`);let
|
|
933
|
-
`),
|
|
934
|
-
`)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let
|
|
955
|
+
SCOPE: Only files in \`${v}\` are accessible.
|
|
956
|
+
`);let k=u?.sealedAnalysis;if(k){let j=[...k.languages||[],...k.frameworks||[]].filter(Boolean);j.length>0&&g.push(`AVAILABLE: ${j.join(", ")}
|
|
957
|
+
`),k.packageManager&&g.push(`PACKAGE MANAGER: ${k.packageManager}
|
|
958
|
+
`)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let k=u.contextDegradation;g.push(`
|
|
935
959
|
### CONTEXT DEGRADATION NOTICE
|
|
936
960
|
|
|
937
|
-
`),g.push(`**Level**: ${
|
|
938
|
-
`),g.push(`**Unavailable**: ${
|
|
961
|
+
`),g.push(`**Level**: ${k.level}
|
|
962
|
+
`),g.push(`**Unavailable**: ${k.failedTools.join(", ")}
|
|
939
963
|
`),g.push(`Some context tools failed. Explore the codebase manually for missing context.
|
|
940
964
|
|
|
941
|
-
`)}if(u?.realContext){let
|
|
965
|
+
`)}if(u?.realContext){let k=u.realContext;if(g.push(`
|
|
942
966
|
### CODEBASE CONTEXT
|
|
943
967
|
|
|
944
|
-
`),g.push(`**Git State**: Branch \`${
|
|
968
|
+
`),g.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
|
|
945
969
|
|
|
946
|
-
`),
|
|
970
|
+
`),k.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
|
|
947
971
|
`),g.push(`| Score | File | Why |
|
|
948
972
|
`),g.push(`|-------|------|-----|
|
|
949
|
-
`);for(let
|
|
973
|
+
`);for(let j of k.relevantFiles.slice(0,8))g.push(`| ${j.score} | ${j.path} | ${j.reason} |
|
|
950
974
|
`);g.push(`
|
|
951
|
-
`)}if(
|
|
952
|
-
`);for(let
|
|
953
|
-
// ${
|
|
954
|
-
${
|
|
975
|
+
`)}if(k.signatures.length>0){g.push(`**Code Signatures** (top files):
|
|
976
|
+
`);for(let j of k.signatures)g.push(`\`\`\`typescript
|
|
977
|
+
// ${j.path}
|
|
978
|
+
${j.content}
|
|
955
979
|
\`\`\`
|
|
956
980
|
`);g.push(`
|
|
957
|
-
`)}if(
|
|
981
|
+
`)}if(k.recentFiles.length>0){g.push("**Recently Changed**: ");let j=k.recentFiles.slice(0,5).map(O=>`${O.path} (${O.lastChanged})`).join(", ");g.push(`${j}
|
|
958
982
|
|
|
959
|
-
`)}}let
|
|
960
|
-
## FILES: ${
|
|
983
|
+
`)}}let A=t.files||[];if(A.length>0){let k=A.slice(0,5).join(", ");g.push(`
|
|
984
|
+
## FILES: ${A.length} available. Top: ${k}
|
|
961
985
|
`),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
962
986
|
|
|
963
|
-
`)}else
|
|
964
|
-
## PROJECT: ${
|
|
987
|
+
`)}else v&&g.push(`
|
|
988
|
+
## PROJECT: ${v}
|
|
965
989
|
Read files before modifying.
|
|
966
990
|
|
|
967
|
-
`);let
|
|
991
|
+
`);let F=this.filterRelevantState(s);if(F&&(g.push(`
|
|
968
992
|
## PRJCT STATE (Project Management Data)
|
|
969
|
-
`),g.push(
|
|
993
|
+
`),g.push(F),g.push(`
|
|
970
994
|
`)),u?.velocityContext&&(g.push(`
|
|
971
995
|
### VELOCITY (Historical Estimation Data)
|
|
972
996
|
|
|
973
997
|
`),g.push(u.velocityContext),g.push(`
|
|
974
998
|
|
|
975
|
-
`)),o&&Object.keys(o).some(
|
|
999
|
+
`)),o&&Object.keys(o).some(k=>o[k])){g.push(`
|
|
976
1000
|
## PROJECT DEFAULTS (apply automatically)
|
|
977
|
-
`);for(let[
|
|
1001
|
+
`);for(let[k,j]of Object.entries(o))j&&g.push(`- ${k}: ${j}
|
|
978
1002
|
`)}if(i?.plan&&i.plan.length>0){if(g.push(`
|
|
979
1003
|
## THINK FIRST (reasoning from analysis)
|
|
980
1004
|
`),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
|
|
981
|
-
`);for(let
|
|
1005
|
+
`);for(let k of i.conclusions)g.push(` \u2192 ${k}
|
|
982
1006
|
`)}g.push(`Plan:
|
|
983
|
-
`);for(let
|
|
1007
|
+
`);for(let k=0;k<i.plan.length;k++)g.push(` ${k+1}. ${i.plan[k]}
|
|
984
1008
|
`);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
985
1009
|
`)}if(!p&&a&&a.length>0){g.push(`
|
|
986
1010
|
## CONTEXT (apply these)
|
|
987
|
-
`);for(let
|
|
988
|
-
`),
|
|
989
|
-
`)}if(u?.rpiContext){let
|
|
1011
|
+
`);for(let k of a)g.push(`- **${k.title}**: ${k.content}
|
|
1012
|
+
`),k.tags&&k.tags.length>0&&g.push(` Tags: ${k.tags.join(", ")}
|
|
1013
|
+
`)}if(u?.rpiContext){let k=u.rpiContext;switch(g.push(`
|
|
990
1014
|
### RPI PHASE
|
|
991
1015
|
|
|
992
|
-
`),
|
|
1016
|
+
`),k.phase){case"research":g.push(`**Phase: RESEARCH** \u2014 Explore the codebase. Produce a truth snapshot: exact files + lines, function call chains, test locations. Use sub-agents for broad exploration.
|
|
993
1017
|
`);break;case"plan":g.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
|
|
994
|
-
`),
|
|
1018
|
+
`),k.researchDoc&&g.push(`
|
|
995
1019
|
<research-context>
|
|
996
|
-
${
|
|
1020
|
+
${k.researchDoc}
|
|
997
1021
|
</research-context>
|
|
998
1022
|
`);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
|
|
999
|
-
`),
|
|
1023
|
+
`),k.planDoc&&g.push(`
|
|
1000
1024
|
<plan-context>
|
|
1001
|
-
${
|
|
1025
|
+
${k.planDoc}
|
|
1002
1026
|
</plan-context>
|
|
1003
|
-
`),
|
|
1004
|
-
**Scoped Files**: ${
|
|
1027
|
+
`),k.scopedFiles&&k.scopedFiles.length>0&&g.push(`
|
|
1028
|
+
**Scoped Files**: ${k.scopedFiles.map(j=>`\`${j}\``).join(", ")}
|
|
1005
1029
|
`);break}g.push(`
|
|
1006
1030
|
`)}if(g.push(`
|
|
1007
1031
|
---
|
|
@@ -1010,31 +1034,31 @@ ${w.planDoc}
|
|
|
1010
1034
|
|
|
1011
1035
|
`),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
|
|
1012
1036
|
`),g.push(`|---|--------|-------------|--------|
|
|
1013
|
-
`);for(let
|
|
1014
|
-
`)}let
|
|
1015
|
-
**FOCUS ON SUBTASK #${
|
|
1016
|
-
`),g.push(`Agent: ${
|
|
1017
|
-
`),
|
|
1018
|
-
`),
|
|
1037
|
+
`);for(let j of u.subtasks){let O=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${j.order} | ${j.domain} | ${j.description} | ${O} |
|
|
1038
|
+
`)}let k=u.subtasks.find(j=>j.status==="in_progress");if(k&&(g.push(`
|
|
1039
|
+
**FOCUS ON SUBTASK #${k.order}**: ${k.description}
|
|
1040
|
+
`),g.push(`Agent: ${k.agent} | Domain: ${k.domain}
|
|
1041
|
+
`),k.dependsOn.length>0&&g.push(`Dependencies: ${k.dependsOn.join(", ")}
|
|
1042
|
+
`),k.handoff)){let j=k.handoff;g.push(`
|
|
1019
1043
|
### Previous Subtask Handoff
|
|
1020
1044
|
|
|
1021
|
-
`),g.push(`**From:** ${
|
|
1045
|
+
`),g.push(`**From:** ${j.fromSubtask}
|
|
1022
1046
|
|
|
1023
1047
|
`),g.push(`**What was done:**
|
|
1024
|
-
`);for(let
|
|
1025
|
-
`);if(
|
|
1048
|
+
`);for(let O of j.whatWasDone)g.push(`- ${O}
|
|
1049
|
+
`);if(j.filesChanged.length>0){g.push(`
|
|
1026
1050
|
**Files changed:**
|
|
1027
|
-
`);for(let
|
|
1051
|
+
`);for(let O of j.filesChanged)g.push(`- \`${O.path}\` (${O.action})
|
|
1028
1052
|
`)}g.push(`
|
|
1029
1053
|
**Context for this subtask:**
|
|
1030
|
-
${
|
|
1054
|
+
${j.outputForNextAgent}
|
|
1031
1055
|
`)}g.push(`
|
|
1032
|
-
`)}let
|
|
1033
|
-
${
|
|
1034
|
-
`)}if(b.checklist){let
|
|
1056
|
+
`)}let J=this.getSchemaTypeForCommand(h);if(J){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(qp(),Vp)),j=k(J);j&&g.push(`
|
|
1057
|
+
${j}
|
|
1058
|
+
`)}if(b.checklist){let k=await this.loadChecklistRouting(),j=await this.loadChecklists();k&&Object.keys(j).length>0&&(g.push(`
|
|
1035
1059
|
## QUALITY CHECKLISTS
|
|
1036
1060
|
`),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1037
|
-
`),g.push(`Available: ${Object.keys(
|
|
1061
|
+
`),g.push(`Available: ${Object.keys(j).join(", ")}
|
|
1038
1062
|
`),g.push(`Path: templates/checklists/{name}.md
|
|
1039
1063
|
`),g.push(`Use Read tool to load checklists you determine are relevant.
|
|
1040
1064
|
`))}return g.push(`
|
|
@@ -1042,7 +1066,7 @@ ${M}
|
|
|
1042
1066
|
`),g.push(`- Be concise. No preamble, no filler.
|
|
1043
1067
|
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1044
1068
|
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1045
|
-
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new
|
|
1069
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new ol({totalPrompt:rl.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
|
|
1046
1070
|
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
1047
1071
|
|
|
1048
1072
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
@@ -1059,13 +1083,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
|
1059
1083
|
`);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
|
|
1060
1084
|
Avoid:
|
|
1061
1085
|
${a}`)}let o=t.join(`
|
|
1062
|
-
`);return
|
|
1063
|
-
`+
|
|
1064
|
-
`+
|
|
1065
|
-
`+
|
|
1066
|
-
`+
|
|
1067
|
-
`+
|
|
1068
|
-
`}},
|
|
1086
|
+
`);return ii(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},mS=new il,Kp=mS});import al from"node:fs/promises";import pS from"node:os";import cl from"node:path";function Yp(){let r=process.env.PRJCT_CLI_HOME?.trim()||cl.join(pS.homedir(),".prjct-cli");return cl.join(r,".running")}async function gS(r){try{let e=Yp(),t=cl.dirname(e);await C(t)||await al.mkdir(t,{recursive:!0}),await al.writeFile(e,`/p:${r}`)}catch{}}async function fS(){try{let r=Yp();await C(r)&&await al.unlink(r)}catch{}}var ll,hS,ai,ul=E(()=>{"use strict";ap();W();up();V();Qo();yp();io();wp();fo();tl();Lp();Xp();Gs();l(Yp,"getRunningFilePath");l(gS,"signalStart");l(fS,"signalEnd");ll=class{static{l(this,"CommandExecutor")}async signalStart(e){await gS(e)}async signalEnd(){await fS()}requiresOrchestration(e){return op.includes(e)?!0:!ip.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(In.shouldEscalate(e,n)){let o=In.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Uu.load(e),i=await Ls.build(s,t),a=Ge.requiresPlanning(e),c=Ge.isDestructive(e),u=Ge.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ge.startPlanning(i.projectId,e,t):u&&(d=Ge.getActivePlan(i.projectId));let m=t.task||t.description||"",p=null;if(this.requiresOrchestration(e)&&m)try{if(p=await oi.execute(e,m,s),p.detectedDomains.length>0&&lp.orchestrate(p.detectedDomains),p.requiresFragmentation&&p.subtasks){let O=p.subtasks.map(we=>({id:we.id,domain:we.domain,description:we.description,status:we.status}));hp(O)}}catch(O){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(O)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await Ls.loadState(i),b=await Qs("prjct"),w=null,v=null;i.projectId&&(w={commit_footer:await it.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await it.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await it.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await it.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(v=await it.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let A={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ge.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},k=(await(pt(),lt(Mt)).getActiveProvider()).name==="claude",j=await Kp.build(o,g,h,null,w,null,v,A,p,{skipNativeContext:k,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),In.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:j,agenticDelegation:!0,agenticMode:!0,learnedPatterns:w,relevantMemories:v,orchestratorContext:p,memory:{create:l(O=>it.createMemory(i.projectId,O),"create"),autoRemember:l((O,we,Fe)=>it.autoRemember(i.projectId,O,we,Fe),"autoRemember"),search:l(O=>it.searchMemories(i.projectId,O),"search"),findByTags:l(O=>it.findByTags(i.projectId,O),"findByTags"),getStats:l(()=>it.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(O=>Ge.recordGatheredInfo(i.projectId,O),"recordInfo"),setAnalysis:l(O=>Ge.setAnalysis(i.projectId,O),"setAnalysis"),propose:l(O=>Ge.proposePlan(i.projectId,O),"propose"),approve:l(O=>Ge.approvePlan(i.projectId,O),"approve"),reject:l(O=>Ge.rejectPlan(i.projectId,O),"reject"),getApprovalPrompt:l(()=>Ge.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ge.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ge.getNextStep(i.projectId),"getNextStep"),completeStep:l(O=>Ge.completeStep(i.projectId,O),"completeStep"),failStep:l(O=>Ge.failStep(i.projectId,O),"failStep"),abort:l(O=>Ge.abortPlan(i.projectId,O),"abort"),getStatus:l(()=>Ge.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ge.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=In.recordAttempt(e,n,{success:!1,error:y(o)});if(i.shouldEscalate){let a=In.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},hS=new ll,ai=hS});import yS from"node:https";import wS from"node:os";import dl from"node:path";import zt from"chalk";var ml,ci,pl=E(()=>{"use strict";W();V();ml=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=dl.join(wS.homedir(),".prjct-cli","config"),this.cacheFile=dl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=dl.join(__dirname,"..","..","package.json");return(await be(e))?.version??null}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=yS.request(s,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)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await be(this.cacheFile)}catch{}return null}async writeCache(e){try{await ce(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-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 n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1087
|
+
`+zt.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")+`
|
|
1088
|
+
`+zt.yellow("\u2502")+" "+zt.bold("Update available!")+" "+zt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+zt.yellow("\u2502")+`
|
|
1089
|
+
`+zt.yellow("\u2502")+" "+zt.yellow("\u2502")+`
|
|
1090
|
+
`+zt.yellow("\u2502")+" Run: "+zt.cyan("npm update -g prjct-cli")+" "+zt.yellow("\u2502")+`
|
|
1091
|
+
`+zt.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")+`
|
|
1092
|
+
`}},ci=ml});import Qp from"node:path";async function bS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(Qp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Qp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function TS(){return{...kS}}function vS(){return{...SS}}async function Zp(){return li||(li=await bS()?TS():vS(),li)}var li,kS,SS,eg=E(()=>{"use strict";V();li=null,kS={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",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},SS={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",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(bS,"isClaudeEnvironment");l(TS,"getClaudeAgent");l(vS,"getTerminalAgent");l(Zp,"detect")});import ui from"node:fs/promises";var gl,tg,sg=E(()=>{"use strict";W();V();gl=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await ui.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${y(s)}`)}await ui.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await ui.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await ui.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1069
1093
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
1070
1094
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1071
1095
|
|
|
@@ -1110,10 +1134,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
1110
1134
|
|
|
1111
1135
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
1112
1136
|
|
|
1113
|
-
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},
|
|
1114
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n
|
|
1115
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),P.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(P.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),P.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=P.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?
|
|
1116
|
-
`);
|
|
1137
|
+
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},tg=gl});function ng(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&PS.has(e.code))return!0;if(e.code&&og.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 CS(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&og.has(e.code))}function rg(r,e,t){let s=As.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(As.delete(r),!1):!0:!1}function fl(r,e){let t=As.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),As.set(r,t)}function xS(r){As.delete(r)}var PS,og,As,di,ig,p$,ag=E(()=>{"use strict";PS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),og=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(ng,"isTransientError");l(CS,"isPermanentError");As=new Map;l(rg,"isCircuitOpen");l(fl,"recordFailure");l(xS,"recordSuccess");di=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(rg(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return xS(t),o}catch(o){if(s=o,n++,CS(o))throw fl(t,this.options.circuitBreakerThreshold),o;if(!(ng(o)&&n<this.options.maxAttempts))throw fl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw fl(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return ng(e)}isCircuitOpen(e){return rg(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return As.get(e)}resetCircuit(e){As.delete(e)}resetAllCircuits(){As.clear()}},ig=new di({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),p$=new di({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var RS,hl,mi,cg=E(()=>{"use strict";ts();eg();sg();ag();RS=["claude"],hl=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await ig.execute(async()=>{if(this.agentInfo=await Zp(),!this.agentInfo?.isSupported)throw pr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!RS.includes(e))throw pr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new tg,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},mi=new hl});var yl,Ln,wl=E(()=>{"use strict";yl=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Ln=new yl});var kl,nt,Sl=E(()=>{"use strict";Z();kl=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();M.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1138
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=M.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=M.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return M.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),M.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return M.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},nt=new kl});function bl(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Tl,De,pi=E(()=>{"use strict";Sl();Z();l(bl,"rowToRule");Tl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=P.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return P.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
1139
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),P.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(P.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),P.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=P.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?bl(s):null}getRulesForCommand(e,t){let s=nt.getWorkflow(e,t);return!s||!s.enabled?[]:P.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(bl)}getAllRules(e){return P.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(bl)}resetRules(e){let t=P.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return P.run(e,"DELETE FROM workflow_rules"),t?.c??0}},De=new Tl});import at from"node:path";async function AS(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 C(at.join(r,"pnpm-lock.yaml"))?"pnpm":await C(at.join(r,"yarn.lock"))?"yarn":await C(at.join(r,"bun.lockb"))||await C(at.join(r,"bun.lock"))?"bun":(await C(at.join(r,"package-lock.json")),"npm")}function lg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function DS(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Fn(r,e){for(let n of jS)if(await C(at.join(r,n)))return n;let s=(e??await ws(r)).find(n=>n.endsWith(IS));if(s)return s}async function ps(r){for(let e of $S)if(await C(at.join(r,e)))return e}async function gi(r){let e=at.join(r,"package.json"),t=await be(e,null);if(t){let a=await AS(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:lg(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:lg(a,"typecheck")}),c.test&&(u.test={tool:a,command:DS(a)}),u.versionFile=await Fn(r),u.changelogFile=await ps(r),u}if(await C(at.join(r,"pytest.ini"))){let a=await Fn(r),c=await ps(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await $e(at.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Fn(r),c=await ps(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(at.join(r,"Cargo.toml"))){let a=await ps(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(at.join(r,"go.mod"))){let a=await Fn(r),c=await ps(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ws(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Fn(r,n),c=await ps(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(at.join(r,"pom.xml"))){let a=await ps(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(at.join(r,"gradlew"))&&(await C(at.join(r,"build.gradle"))||await C(at.join(r,"build.gradle.kts")))){let a=await ps(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Fn(r),i=await ps(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var jS,IS,$S,vl=E(()=>{"use strict";V();l(AS,"detectPackageManager");l(lg,"pmRun");l(DS,"pmTest");jS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],IS=".csproj",$S=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Fn,"detectVersionFile");l(ps,"detectChangelogFile");l(gi,"detectProjectCommands")});import*as pe from"@clack/prompts";import Zs from"chalk";var fi,ug,Or,dg=E(()=>{"use strict";V();Qe();fi=[{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."}],ug=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Or=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){pe.intro(Zs.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return pe.outro(Zs.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=fi.findIndex(s=>s.value===this.detectedType),t=await pe.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:fi.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?fi[e].value:void 0});return pe.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await pe.multiselect({message:"Which AI agents do you use?",options:ug.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return pe.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);pe.note(e,"Detected stack");let t=await pe.confirm({message:"Is this stack correct?",initialValue:!0});if(pe.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await pe.group({language:l(()=>pe.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>pe.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await pe.group({verbosity:l(()=>pe.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>pe.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Zs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Zs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Zs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Zs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Zs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1140
|
+
`);pe.note(e,"Configuration Summary");let t=await pe.confirm({message:"Generate configuration with these settings?",initialValue:!0});return pe.isCancel(t)||!t?(pe.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"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 s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await ys(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await ys(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Ue(),gu));await n("which codex"),s.push("codex")}catch{await ys(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.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};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,pe.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return fi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return ug.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}}});var mg={};Lt(mg,{PlanningCommands:()=>tn});import hi from"node:fs/promises";import en from"node:path";async function MS(){if(!El){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(wi(),pg));El=new r}return El}var El,tn,yi=E(()=>{"use strict";Yr();is();xe();Se();Ct();vs();Nt();pi();W();K();V();Zt();An();Qe();vl();dg();St();El=null;l(MS,"getAnalysisCommands");tn=class extends he{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await I.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new Or(t).runNonInteractive());else if(a=await new Or(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await gn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await I.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await R.ensureProjectStructure(m);let p=R.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
|
|
1117
1141
|
|
|
1118
1142
|
No current task. Use \`/p:now\` to set focus.
|
|
1119
1143
|
`,"core/next.md":`# NEXT
|
|
@@ -1133,17 +1157,17 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1133
1157
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1134
1158
|
|
|
1135
1159
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1136
|
-
`,"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[
|
|
1160
|
+
`,"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[v,A]of Object.entries(g))await hi.writeFile(en.join(p,v),A);let h=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!h){f.step(3,4,"Analyzing project...");let v=await MS();if((await v.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await v.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let w=s.idea;if(h&&!b){if(!w)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};f.spin("architect mode...");let v=en.join(p,"planning","architect-session.md"),A=`# Architect Session
|
|
1137
1161
|
|
|
1138
1162
|
## Idea
|
|
1139
|
-
${
|
|
1163
|
+
${w}
|
|
1140
1164
|
|
|
1141
1165
|
## Status
|
|
1142
1166
|
Initialized - awaiting stack recommendation
|
|
1143
1167
|
|
|
1144
1168
|
Generated: ${new Date().toLocaleString()}
|
|
1145
|
-
`;return await
|
|
1146
|
-
`);let n=await this.getGlobalProjectPath(t),o=
|
|
1169
|
+
`;return await hi.writeFile(v,A),await Re.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:w,wizard:a}}return await Re.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_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(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await I.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=z();return await le.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:S()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await I.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await le.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:S()}),s.md?console.log(L(X("Bug Reported",e),_e({Severity:i,Priority:c}),re([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Rt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
1170
|
+
`);let n=await this.getGlobalProjectPath(t),o=en.join(n,"planning","architect-session.md"),i;try{i=await $e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1147
1171
|
|
|
1148
1172
|
Create a plan first:
|
|
1149
1173
|
1. Run /p:init in an empty directory
|
|
@@ -1164,7 +1188,7 @@ The architect plan is ready. Claude will now:
|
|
|
1164
1188
|
4. Create starter files with boilerplate
|
|
1165
1189
|
`),console.log(`
|
|
1166
1190
|
\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.
|
|
1167
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:S(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await
|
|
1191
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:S(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await I.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=R.getGlobalProjectPath(o),u=en.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1168
1192
|
|
|
1169
1193
|
## Idea
|
|
1170
1194
|
${e}
|
|
@@ -1179,14 +1203,14 @@ Initialized - awaiting architecture design
|
|
|
1179
1203
|
4. Generate roadmap
|
|
1180
1204
|
|
|
1181
1205
|
Generated: ${new Date().toLocaleString()}
|
|
1182
|
-
`;return await
|
|
1206
|
+
`;return await hi.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:S()}),s.md?console.log(L(X("Idea Captured",e),_e({Mode:"architecture"}),re([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
|
|
1183
1207
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1184
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await
|
|
1208
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await We.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:S()}),s.md?console.log(L(X("Idea Captured",e),_e({Mode:"capture"}),re([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Rt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=R.getGlobalProjectPath(n),m=en.join(d,"planning","specs");try{let h=(await(await import("node:fs/promises")).readdir(m)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return h.length===0?(f.warn("no specs yet"),console.log(`
|
|
1185
1209
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1186
1210
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1187
1211
|
\u{1F4CB} SPECIFICATIONS
|
|
1188
|
-
`),console.log("\u2550".repeat(50)),h.forEach((b,
|
|
1189
|
-
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=
|
|
1212
|
+
`),console.log("\u2550".repeat(50)),h.forEach((b,w)=>{let v=b.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${v}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1213
|
+
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=R.getGlobalProjectPath(n),i=en.join(o,"planning","specs");await ze(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=en.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1190
1214
|
|
|
1191
1215
|
## Overview
|
|
1192
1216
|
[Brief description of the feature]
|
|
@@ -1216,45 +1240,47 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1216
1240
|
---
|
|
1217
1241
|
Created: ${new Date().toLocaleString()}
|
|
1218
1242
|
Status: Draft
|
|
1219
|
-
`;return await
|
|
1243
|
+
`;return await hi.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:S()}),f.done(`spec created: ${a}.md`),console.log(`
|
|
1220
1244
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
1221
|
-
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await
|
|
1222
|
-
`),
|
|
1223
|
-
`),console.log(`\u{1F4C4} Full report: ${
|
|
1224
|
-
`),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:n}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await
|
|
1225
|
-
${
|
|
1226
|
-
`)}catch{k="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=Uo("sync",!0),R=d.syncMetrics?.indexes,W={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${p} generated`,"Files indexed":d.stats.fileCount};if(R?.bm25Files){let w=R.bm25Files*(R.bm25AvgTokens||0);W["Tokens indexed"]=`${Math.round(w/1e3)}K`,W["Import edges"]=R.importEdges||0,W["Co-change commits"]=R.cochangeCommits||0}let z=L(we("Sync Complete"),rt(W),g,d.git.hasChanges?Lm("Uncommitted changes detected"):null,k,de(E.map(w=>({label:w.desc,command:w.cmd}))));return console.log(z),{success:!0,data:d,metrics:{elapsed:m,skillCount:p,fileCount:d.stats.fileCount}}}return Ac(d,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${y(s)}`)):f.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Gs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Lt.isCurrent(n,i))return t.md?console.log(L(we("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await Ra(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Lt.save(o,i),s.md?console.log(L(we("LLM Analysis Saved"),rt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:y(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Lt.getActive(n);if(!o)return t.md?console.log(L("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[we(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Y("Architecture Insights",$e(o.architecture.insights))),o.patterns.length>0&&i.push(Y("Patterns",$e(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Y("Anti-Patterns",$e(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Y("Tech Debt",$e(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Y("Conventions",$e(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Tn.getSummary(n),i=await Tn.getDailyStats(n,30),a=await Gm(n),c=await nt.getPatternsSummary(n);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=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Tn.read(n),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: ${Pn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${po(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Rc(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=Vm(i);if(console.log(` ${p} ${Pn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${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=Bm(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(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=ko(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await qe.getStatus(n);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=rg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,rt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?Y("Analysis",$e(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(L("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(ua(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Lu(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await qe.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(L(we("Analysis Rolled Back"),rt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(L("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await qe.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=y(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=P.getDoc(n,"project")?.repoPath||e}catch{}let i=await qe.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.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(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Bn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1227
|
-
|
|
1228
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function YS(r,e,t,s,n,o=!0){let i=_e.socket();if(!Ke.existsSync(i))return o&&Tg().catch(()=>{}),null;try{return await Ir({id:ki.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function QS(){try{return(await Ir({id:ki.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function ZS(){let r=_e.pid(),e=_e.socket(),t=!1;if(Ke.existsSync(r)){let s=parseInt(Ke.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Ke.existsSync(r)&&Ke.unlinkSync(r)}catch{}try{Ke.existsSync(e)&&Ke.unlinkSync(e)}catch{}return t}async function Tg(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Ke.existsSync(t))o=t,i="bun";else if(Ke.existsSync(s))o=s,i=ea()?"bun":"node";else if(Ke.existsSync(n))o=n,i=ea()?"bun":"node";else return!1;let a=_e.runDir();Ke.mkdirSync(a,{recursive:!0});let c=_e.log(),u=Ke.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Ke.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await bg())return!0;return!1}var Eg=v(()=>{"use strict";ur();Il();l(bg,"isDaemonRunning");l(XS,"getDaemonStatus");l(Ir,"sendRequest");l(YS,"executeViaDaemon");l(QS,"stopDaemon");l(ZS,"forceKillDaemon");l(Tg,"spawnDaemon")});import Oe from"node:fs";import{createServer as qb}from"node:net";ui();Zr();Ce();$a();import PS from"node:fs/promises";import CS from"node:path";te();var hl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){P.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1245
|
+
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await gi(t),n=0;De.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var Pl,sn,gg=E(()=>{"use strict";ts();Yr();xe();Se();W();V();Qe();Pl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await I.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(yi(),mg)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await I.getProjectId(e);if(!t)throw qr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await R.ensureProjectStructure(t),R.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await gn();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(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return D(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ws(e)).some(n=>t.includes(n))}catch(t){return D(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await I.isConfigured(e)}async needsMigration(e){return await I.needsMigration(e)}},sn=new Pl});var he,St=E(()=>{"use strict";ul();pl();cg();wl();zs();gg();he=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ci,this.updateNotificationShown=!1,this.commandExecutor=ai}get agent(){return mi.getAgent()}get agentInfo(){return mi.getInfo()}get currentAuthor(){return sn.getCurrentAuthor()}async initializeAgent(){return mi.initialize()}async ensureProjectInit(e){return sn.ensureInit(e)}async ensureAuthor(){return sn.ensureAuthor()}async getGlobalProjectPath(e){return sn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return xt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return sn.isEmptyDirectory(e)}async _detectExistingCode(e){return sn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ln.breakdownFeature(e)}_detectBugSeverity(e){return Ln.detectBugSeverity(e)}}});var pg={};Lt(pg,{AnalysisCommands:()=>rn});import ki from"node:fs/promises";import fg from"node:path";import*as nn from"@clack/prompts";var rn,wi=E(()=>{"use strict";io();fo();Ou();is();xe();Se();bo();ka();gd();Sd();Ha();jc();Tn();Z();Er();ic();W();K();Zt();An();Qe();rp();St();rn=class extends he{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1246
|
+
`),Ke.init(t);let s=await Ls.build(t,e),n={packageJson:await Ke.readPackageJson(),cargoToml:await Ke.readCargoToml(),goMod:await Ke.readGoMod(),requirements:await Ke.readRequirements(),directories:await Ke.listDirectories(),fileCount:await Ke.countFiles(),gitStats:await Ke.getGitStats(),gitLog:await Ke.getGitLog(20),hasDockerfile:await Ke.fileExists("Dockerfile"),hasDockerCompose:await Ke.fileExists("docker-compose.yml"),hasReadme:await Ke.fileExists("README.md"),hasTsconfig:await Ke.fileExists("tsconfig.json"),hasViteConfig:await Ke.fileExists("vite.config.ts")||await Ke.fileExists("vite.config.js"),hasNextConfig:await Ke.fileExists("next.config.js")||await Ke.fileExists("next.config.mjs")},o=np(n,t),i=await I.getProjectId(t),a=s.paths.analysis||R.getFilePath(i,"analysis","repo-summary.md");await ki.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:S(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(pt(),lt(Mt)).getActiveProvider(),d=await Re.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${R.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1247
|
+
`),console.log(`\u{1F4C4} Full report: ${R.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1248
|
+
`),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:n}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=R.getGlobalProjectPath(n),i=Date.now();if(t.package){let m=await R.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!p){let h=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await Ks.sync(e,{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(L(ue(`Synced package: ${p.name}`))):f.done(`Synced package: ${p.name}`),{success:g.success}}let a=fg.join(o,"context","CLAUDE.md"),c=null;try{c=await ki.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let m=await Ks.sync(e,{full:t.full});if(!m.success)return t.md?(console.log(L("## 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}):(f.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await ki.readFile(a,"utf-8")}catch{p=""}let g=yd(c,p);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(ue("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"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let h=l(async()=>{c!=null&&await ki.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let w=[];for(let A of g.added)w.push(`Added: ${A.name} (${A.lineCount} lines)`);for(let A of g.modified)w.push(`Modified: ${A.name} (${A.lineCount} lines)`);for(let A of g.removed)w.push(`Removed: ${A.name} (${A.lineCount} lines)`);let v=L("## Sync Preview",w.length>0?X("Changes",Ae(w)):"No section changes.",_e({"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(v),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let w={added:g.added.map(v=>({name:v.name,lineCount:v.lineCount})),modified:g.modified.map(v=>({name:v.name,lineCount:v.lineCount})),removed:g.removed.map(v=>({name:v.name,lineCount:v.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:w,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(wd(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await nn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(nn.isCancel(b)||b==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
|
|
1249
|
+
${kd(g)}`);let w=await nn.confirm({message:"Apply these changes?",initialValue:!0});if(nn.isCancel(w)||!w)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),Lc(m,i)}t.md||f.spin("Syncing project...");let d=await Ks.sync(e,{full:t.full});if(!d.success)return t.md?console.log(L("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let m=Date.now()-i,p=d.generatedSkills?.generated?.length??0,g=null;try{let j=await Ye.diff(n);j?.hasChanges&&(g=wa(j))}catch{}let h=d.git.recentCommits[0]?.hash??null,b=h&&Wt.isCurrent(n,h),w=null;if(!b)try{let j=await Na(n,e,d.git,d.stats);w=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(j,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
1250
|
+
`)}catch{w="### Next: Run `prjct analysis-payload --md` to update project analysis"}let v=zo("sync",!0),A=d.syncMetrics?.indexes,F={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${p} generated`,"Files indexed":d.stats.fileCount};if(A?.bm25Files){let j=A.bm25Files*(A.bm25AvgTokens||0);F["Tokens indexed"]=`${Math.round(j/1e3)}K`,F["Import edges"]=A.importEdges||0,F["Co-change commits"]=A.cochangeCommits||0}let J=null;try{let O=(await I.readGlobalConfig(n))?.integrations?.obsidian;O?.vaultPath&&(J=`### Obsidian
|
|
1251
|
+
Configured: \`${O.vaultPath}\`
|
|
1252
|
+
Write \`_insights.md\` to vault after analysis.`)}catch{}let k=L(ue("Sync Complete"),_e(F),g,d.git.hasChanges?_c("Uncommitted changes detected"):null,w,J,re(v.map(j=>({label:j.desc,command:j.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,skillCount:p,fileCount:d.stats.fileCount}}}return Lc(d,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${y(s)}`)):f.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ks.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Wt.isCurrent(n,i))return t.md?console.log(L(ue("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await Na(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Wt.save(o,i),s.md?console.log(L(ue("LLM Analysis Saved"),_e({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:y(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Wt.getActive(n);if(!o)return t.md?console.log(L("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[ue(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(X("Architecture Insights",Ae(o.architecture.insights))),o.patterns.length>0&&i.push(X("Patterns",Ae(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(X("Anti-Patterns",Ae(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(X("Tech Debt",Ae(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(X("Conventions",Ae(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await xn.getSummary(n),i=await xn.getDailyStats(n,30),a=await ep(n),c=await it.getPatternsSummary(n);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=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await xn.read(n),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: ${jn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${So(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Fc(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=tp(i);if(console.log(` ${p} ${jn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${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=sp(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(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Co(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Ye.getStatus(n);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=fg.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&p.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,_e({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?X("Analysis",Ae(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ye.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(L("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(wa(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Ku(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ye.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ye.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(L(ue("Analysis Rolled Back"),_e({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(L("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ye.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=y(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=P.getDoc(n,"project")?.repoPath||e}catch{}let i=await Ye.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.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(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function er(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1253
|
+
`)}var Ne,Dg,jg,Wl=E(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||Tt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Dg=1800*1e3,jg=1024*1024;l(er,"encodeMessage")});var Mg={};Lt(Mg,{executeViaDaemon:()=>ab,forceKillDaemon:()=>lb,getDaemonStatus:()=>ib,isDaemonRunning:()=>Ig,sendRequest:()=>Lr,spawnDaemon:()=>$g,stopDaemon:()=>cb});import xi from"node:crypto";import et from"node:fs";import{connect as ob}from"node:net";async function Ig(){let r=Ne.socket();if(!et.existsSync(r))return!1;try{return(await Lr({id:xi.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{et.unlinkSync(r)}catch{}return!1}}async function ib(){let r=Ne.socket(),e=Ne.pid();if(!et.existsSync(r))return{running:!1};try{let t=await Lr({id:xi.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return et.existsSync(e)?{running:!1,pid:parseInt(et.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Lr(r){return new Promise((e,t)=>{let s=Ne.socket(),n=ob(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(er(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
1254
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ab(r,e,t,s,n,o=!0){let i=Ne.socket();if(!et.existsSync(i))return o&&$g().catch(()=>{}),null;try{return await Lr({id:xi.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function cb(){try{return(await Lr({id:xi.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function lb(){let r=Ne.pid(),e=Ne.socket(),t=!1;if(et.existsSync(r)){let s=parseInt(et.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{et.existsSync(r)&&et.unlinkSync(r)}catch{}try{et.existsSync(e)&&et.unlinkSync(e)}catch{}return t}async function $g(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(et.existsSync(t))o=t,i="bun";else if(et.existsSync(s))o=s,i=ca()?"bun":"node";else if(et.existsSync(n))o=n,i=ca()?"bun":"node";else return!1;let a=Ne.runDir();et.mkdirSync(a,{recursive:!0});let c=Ne.log(),u=et.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),et.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await Ig())return!0;return!1}var _g=E(()=>{"use strict";kr();Wl();l(Ig,"isDaemonRunning");l(ib,"getDaemonStatus");l(Lr,"sendRequest");l(ab,"executeViaDaemon");l(cb,"stopDaemon");l(lb,"forceKillDaemon");l($g,"spawnDaemon")});import Le from"node:fs";import{createServer as rT}from"node:net";wi();io();xe();Ha();import _S from"node:fs/promises";import OS from"node:path";Z();var Cl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){P.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1229
1255
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){P.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
|
|
1230
1256
|
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return P.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=P.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
|
|
1231
1257
|
WHERE project_id = ? AND timestamp >= ?
|
|
1232
1258
|
GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=P.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
|
|
1233
|
-
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},
|
|
1259
|
+
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},hg=new Cl;Z();vs();Nt();Ps();gt();W();K();Zt();Qe();St();xe();Se();W();K();var xl=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,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,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} 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,n)}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 s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.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 I.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:R.getGlobalProjectPath(t),timestamp:S()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:S()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:S()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:S()};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()}},U=new xl;var Un=class extends he{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=OS.basename(t),a=await _.getCurrentTask(o),c=await le.getActiveTasks(o),u=await qe.getRecent(o,5),d=await We.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 f.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=hs(m),g=[];try{let w=p.toISOString();g=P.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(A=>({...JSON.parse(A.data),timestamp:A.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1234
1260
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1235
1261
|
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${h.tasksCompleted}`),console.log(` Features shipped: ${h.featuresShipped}`),console.log(` Total actions: ${h.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,m);return console.log(`
|
|
1236
1262
|
Activity: ${b}
|
|
1237
|
-
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await
|
|
1263
|
+
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await Ls.build(t),p=null;try{p=await _S.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
|
|
1238
1264
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1239
1265
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1240
|
-
`);else{let g=p.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,b)=>{let
|
|
1241
|
-
`)[0].trim();console.log(` ${b+1}. ${
|
|
1242
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
1243
|
-
`+
|
|
1266
|
+
`);else{let g=p.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,b)=>{let w=h.split(`
|
|
1267
|
+
`)[0].trim();console.log(` ${b+1}. ${w}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1268
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${ss(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(w=>{let v=w.priority?` [${w.priority}]`:"";return`${w.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${v}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(w=>{let v=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";return`${w.name}${v?` (${v})`:""}`}):["Nothing shipped yet"],h=null;try{let w=hg.getSummary(o,7);(w.smartPercent<100||w.compactions>0)&&(h=`### Context Health (7d)
|
|
1269
|
+
`+xs(["Zone","%"],[["Smart",`${w.smartPercent}%`],["Warning",`${w.warningPercent}%`],["Dumb",`${w.dumbPercent}%`],["Compactions",`${w.compactions}`]]))}catch{}let b=L(`## Dashboard: ${i}`,X("Current Focus",m),X(`Queue (${c.length})`,Ae(p,!0)),X("Recent Ships",Ae(g)),X("Ideas",`${d.length} pending`),h,re([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
|
|
1244
1270
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1245
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1271
|
+
`),console.log("\u2550".repeat(50));let m=Co(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1246
1272
|
${g}`),console.log(`
|
|
1247
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=
|
|
1248
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,b)=>{let
|
|
1273
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=ss(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1274
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,b)=>{let w=h.priority?`[${h.priority}]`:"";console.log(` ${b+1}. ${h.description.slice(0,40)} ${w}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1249
1275
|
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let b=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${b?`(${b})`:""}`)}),console.log(`
|
|
1250
1276
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1251
1277
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1252
1278
|
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:S()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1253
1279
|
PRJCT COMMANDS
|
|
1254
|
-
`),console.log("=".repeat(50));let i=
|
|
1280
|
+
`),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.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(`
|
|
1255
1281
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1256
1282
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1257
|
-
`),{success:!0,topic:"overview"}}let s=
|
|
1283
|
+
`),{success:!0,topic:"overview"}}let s=U.getByName(e);if(s){if(console.log(`
|
|
1258
1284
|
\u{1F4DA} HELP: /p:${s.name}
|
|
1259
1285
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
|
|
1260
1286
|
Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
|
|
@@ -1264,9 +1290,9 @@ ${"\u2550".repeat(50)}
|
|
|
1264
1290
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1265
1291
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1266
1292
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1267
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);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=>s[Math.floor(a/i*(s.length-1))]).join("")}};
|
|
1268
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(
|
|
1269
|
-
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(
|
|
1293
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);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=>s[Math.floor(a/i*(s.length-1))]).join("")}};tl();xe();Se();gt();W();Zt();import NS from"node:fs/promises";import LS from"node:path";var on=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await I.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=R.getGlobalProjectPath(c),d=await _.read(c),m=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,p=null;if(i)try{p=await oi.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${y(b)}`)}let g=await this.loadRepoAnalysis(u),h={projectId:c,globalPath:u,currentTask:m,domains:p?.detectedDomains||[],primaryDomain:p?.primaryDomain||null,subtasks:p?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(h)):console.log(JSON.stringify(h,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}formatContextMd(e){let t=[];if(t.push(X("Project",Jo(qo("ID",e.projectId),qo("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Rn({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
|
|
1294
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(X("Stack",_e({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),L(...t)}async loadRepoAnalysis(e){try{let t=LS.join(e,"analysis","repo-analysis.json"),s=await NS.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return D(t),null}}},T_=new on;ti();St();xe();Se();zs();Z();vs();Nt();W();K();Qe();import Rl from"node:fs";import yg from"node:path";async function Si(r){let e=await I.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=M.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;M.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(Si,"cleanupMemory");async function bi(r){let e=await I.getProjectId(r);if(!e)return;let s=M.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;M.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}l(bi,"cleanupMemoryInternal");async function Al(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Si(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await I.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=M.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;M.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await We.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${y(a)}`)}try{let c=(await le.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${y(a)}`)}return await bi(e),await xt.log(e,"cleanup_performed",{items:n.length,timestamp:S()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(y(t)),{success:!1,error:y(t)}}}l(Al,"cleanup");var FS=[/^qa-/,/^nonexistent-/,/^test-/];async function wg(r){let e=R.getGlobalBasePath(),t=yg.join(e,"projects");if(!Rl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Rl.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=yg.join(t,a);if(!FS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{M.close(a),Rl.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
|
|
1295
|
+
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(wg,"cleanupProjects");xe();Se();zs();W();K();V();Qe();import kg from"node:path";async function Dl(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await I.getProjectId(t),a=kg.join(R.getGlobalProjectPath(i),"planning","designs");await ze(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1270
1296
|
|
|
1271
1297
|
*Use templates/design/architecture.md for full design*
|
|
1272
1298
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1281,14 +1307,14 @@ ${"\u2550".repeat(50)}
|
|
|
1281
1307
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1282
1308
|
|
|
1283
1309
|
*Use templates/design/flow.md for full design*
|
|
1284
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1310
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=kg.join(a,u);return await Pt(d,c),await xt.log(t,"design_created",{type:s,target:o,timestamp:S()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}l(Dl,"design");xe();Se();zs();import Hn from"node:path";ts();Z();var Je={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:"*"};qs();rs();var jl=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=zd.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 s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&G.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,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(Je.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(Je.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw G.error("Event callback error:",s),s}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){G.debug("Failed to log event:",de(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.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())}},ct=new jl,Nr={sessionStarted:l(r=>ct.emit(Je.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>ct.emit(Je.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>ct.emit(Je.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>ct.emit(Je.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>ct.emit(Je.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>ct.emit(Je.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>ct.emit(Je.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>ct.emit(Je.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>ct.emit(Je.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>ct.emit(Je.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>ct.emit(Je.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>ct.emit(Je.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>ct.emit(Je.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>ct.emit(Je.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>ct.emit(Je.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>ct.emit(Je.ANALYSIS_COMPLETED,r),"analysisCompleted")};xe();Z();W();Ue();Ct();K();var Sg=z;function Ti(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}l(Ti,"calculateDuration");function bg(r){return ut(r*1e3)}l(bg,"formatDuration");function Tg(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}l(Tg,"rowToSession");var vi=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await I.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");P.getDb(this.projectId),this.initialized=!0}generateId(){return Sg()}async getCurrent(){this.initialized||await this.initialize();let e=P.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?Tg(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await Nr.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await Nr.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=Ti(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Nr.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=Ti(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Nr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Ti(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await N(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await N(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1285
1311
|
`),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){D(s)||console.error(`Metrics calculation warning: ${y(s)}`)}return t}saveSession(e){P.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
1286
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),P.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(
|
|
1312
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),P.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Tg)}async logEvent(e,t){try{P.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return bg(e)}};W();K();V();Qe();async function Il(r=process.cwd()){try{if(!await I.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new vi(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1287
1313
|
Found abandoned session:
|
|
1288
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let o=
|
|
1314
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let o=ss(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1289
1315
|
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
|
|
1290
|
-
`),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1291
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await
|
|
1316
|
+
`),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Il,"recover");async function $l(r=process.cwd()){try{f.spin("creating undo point...");let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Hn.join(R.getGlobalProjectPath(e),"snapshots");await ze(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=Hn.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await $e(c);u=JSON.parse(d)}catch(d){if(!D(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Pt(c,JSON.stringify(u,null,2)),await xt.log(r,"undo_performed",{snapshotId:a,timestamp:S()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(o)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l($l,"undo");async function Ml(r=process.cwd()){try{f.spin("restoring changes...");let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Hn.join(R.getGlobalProjectPath(e),"snapshots"),s=Hn.join(t,"history.json"),n;try{let i=await $e(s);n=JSON.parse(i)}catch(i){if(D(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.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(`
|
|
1317
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Pt(s,JSON.stringify(n,null,2)),await xt.log(r,"redo_performed",{timestamp:S()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Ml,"redo");async function _l(r=process.cwd()){try{let e=await I.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Hn.join(R.getGlobalProjectPath(e),"snapshots"),s=Hn.join(t,"history.json"),n;try{let o=await $e(s);n=JSON.parse(o)}catch(o){if(D(o)||o instanceof SyntaxError)return console.log(`
|
|
1292
1318
|
SNAPSHOT HISTORY
|
|
1293
1319
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1294
1320
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1296,40 +1322,96 @@ ${"\u2550".repeat(50)}
|
|
|
1296
1322
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1297
1323
|
`)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1298
1324
|
`)),console.log(`${"=".repeat(50)}
|
|
1299
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1300
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};
|
|
1325
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(_l,"history");var Wn=class extends he{static{l(this,"MaintenanceCommands")}_cleanupMemory=Si;_cleanupMemoryInternal=bi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Al(e,t):s}async cleanupProjects(e={}){return wg(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Dl(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Il(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$l(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ml(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?_l(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await $n(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c,null,2)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
|
|
1326
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};xe();Se();import Bn from"node:path";Z();Nt();Ps();gt();Zt();import Be from"node:fs/promises";import H from"node:path";var Ol=class r{static{l(this,"ObsidianExporter")}getProjectPath(e,t){let s=e.projectFolder||t;return H.join(e.vaultPath,"projects",s)}async exportAll(e,t,s){let n=this.getProjectPath(s,t),o=[],i={success:!0,projectFolder:n,exported:{board:0,queue:0,shipped:0,roadmap:0,daily:!1},errors:o};await this.ensureStructure(n);try{i.exported.board=await this.exportBoard(e,n)}catch(a){o.push(`board: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.queue=await this.exportQueue(e,n)}catch(a){o.push(`queue: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.shipped=await this.exportShipped(e,n)}catch(a){o.push(`shipped: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.roadmap=await this.exportRoadmap(e,n)}catch(a){o.push(`roadmap: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.daily=await this.exportDaily(e,n)}catch(a){o.push(`daily: ${a instanceof Error?a.message:String(a)}`)}try{await this.exportIndex(t,n)}catch(a){o.push(`index: ${a instanceof Error?a.message:String(a)}`)}return i.success=o.length===0,i}async ensureStructure(e){let t=["board","queue","shipped","roadmap","architecture","design","research","meetings","notes","daily","retros"];for(let s of t)await Be.mkdir(H.join(e,s),{recursive:!0})}async writeLink(e,t,s){let n=[`projectId: ${t}`,`projectPath: ${s}`,`linkedAt: ${new Date().toISOString()}`].join(`
|
|
1327
|
+
`);await Be.writeFile(H.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await _.read(e),n=H.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,u=c.subtasks||[],d=c.currentSubtaskIndex??0,m={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},p=u.map((w,v)=>{let A=w.status==="completed"?"x":" ",F=v===d&&w.status!=="completed"?" <- current":"";return`- [${A}] ${w.description}${F}`}),g=u.filter(w=>w.status==="completed").length,h=u.length>0?`${g}/${u.length} (${Math.round(g/u.length*100)}%)`:"",b=ds(m,c.description,p.length>0?`## Subtasks
|
|
1328
|
+
${p.join(`
|
|
1329
|
+
`)}`:null,h?`## Progress
|
|
1330
|
+
${h}`:null);await Be.writeFile(H.join(n,`${c.id}.md`),b,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let u=c.id||`paused_${Date.now()}`,d={prjct_id:u,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},m=ds(d,c.description,"Status: paused");await Be.writeFile(H.join(n,`${u}.md`),m,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let u={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=ds(u,c.description);await Be.writeFile(H.join(n,`${c.id}.md`),d,"utf-8"),o++}return await this.generateKanbanBoard(s,n),o}async generateKanbanBoard(e,t){let s=["---","kanban-plugin: board","---",""],n=[],o=[],i=[];e.currentTask&&n.push(`- [[${e.currentTask.id}]]`);for(let c of e.activeTasks||[])n.push(`- [[${c.id}]]`);for(let c of e.pausedTasks||[])c.id&&o.push(`- [[${c.id}]]`);let a=e.taskHistory||[];for(let c of a.slice(0,5))i.push(`- [[${c.taskId}]]`);s.push("## In Progress"),s.push(...n.length>0?n:[""]),s.push(""),s.push("## Paused"),s.push(...o.length>0?o:[""]),s.push(""),s.push("## Done"),s.push(...i.length>0?i:[""]),await Be.writeFile(H.join(t,"_kanban.md"),s.join(`
|
|
1331
|
+
`),"utf-8")}async exportQueue(e,t){let s=await le.read(e),n=H.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=ds(a,i.description);await Be.writeFile(H.join(n,`${i.id}.md`),c,"utf-8"),o++}return o}async exportShipped(e,t){let s=await qe.read(e),n=H.join(t,"shipped"),o=0;for(let i of s.shipped){let a={prjct_id:i.id,prjct_type:"shipped",name:i.name,version:i.version,type:i.type,shipped_at:i.shippedAt};i.duration&&(a.duration=i.duration),i.codeMetrics?.filesChanged&&(a.files_changed=i.codeMetrics.filesChanged),i.codeMetrics?.linesAdded&&(a.lines_added=i.codeMetrics.linesAdded),i.codeMetrics?.linesRemoved&&(a.lines_removed=i.codeMetrics.linesRemoved);let c=[];if(i.changes&&i.changes.length>0){let d=i.changes.map(m=>`- ${m.type?`**${m.type}**: `:""}${m.description}`);c.push(`## Changes
|
|
1332
|
+
${d.join(`
|
|
1333
|
+
`)}`)}if(i.codeMetrics){let d=i.codeMetrics,m=[];d.filesChanged&&m.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&m.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&m.push(`- **Duration**: ${i.duration}`),m.length>0&&c.push(`## Metrics
|
|
1334
|
+
${m.join(`
|
|
1335
|
+
`)}`)}let u=ds(a,i.name,i.description||null,...c);await Be.writeFile(H.join(n,`${i.id}.md`),u,"utf-8"),o++}return o}async exportRoadmap(e,t){let s=P.getDoc(e,"roadmap");if(!s)return 0;let n=H.join(t,"roadmap"),o=0,i=s.features||[];for(let a of i){let c={prjct_id:a.id,prjct_type:"feature",status:a.status,impact:a.impact,progress:a.progress,updated_at:new Date().toISOString()};a.phase&&(c.phase=a.phase),a.quarter&&(c.quarter=a.quarter),a.dependencies&&a.dependencies.length>0&&(c.dependencies=a.dependencies);let u=(a.tasks||[]).map(m=>`- [${m.completed?"x":" "}] ${m.description}`),d=ds(c,a.name,a.description||null,u.length>0?`## Tasks
|
|
1336
|
+
${u.join(`
|
|
1337
|
+
`)}`:null);await Be.writeFile(H.join(n,`${a.id}.md`),d,"utf-8"),o++}return await this.generateCanvas(i,n),o}async generateCanvas(e,t){let s={shipped:"4",completed:"4",active:"5",planned:"0"},n=e.map((a,c)=>({id:a.id,type:"text",text:`**${a.name}**
|
|
1338
|
+
Status: ${a.status}${a.quarter?`
|
|
1339
|
+
Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(u=>u.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await Be.writeFile(H.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await _.read(e),n=await le.read(e),o=new Date().toISOString().split("T")[0],i=H.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(m=>!m.completed).length},c=[];if(s.currentTask){let m=s.currentTask,p=m.subtasks||[],g=p.filter(h=>h.status==="completed").length;c.push(`## Active Task
|
|
1340
|
+
**${m.description}**
|
|
1341
|
+
`+(m.branch?`Branch: \`${m.branch}\`
|
|
1342
|
+
`:"")+(p.length>0?`Progress: ${g}/${p.length}`:""))}else c.push(`## Active Task
|
|
1343
|
+
No active task.`);let u=n.tasks.filter(m=>!m.completed).slice(0,5);if(u.length>0){let m=u.map(p=>[p.priority,p.type,p.description]);c.push(`## Queue (Top ${u.length})
|
|
1344
|
+
${xs(["Priority","Type","Description"],m)}`)}let d=ds(a,`Daily: ${o}`,...c);return await Be.writeFile(H.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
|
|
1345
|
+
|
|
1346
|
+
## Board
|
|
1347
|
+
\`\`\`dataview
|
|
1348
|
+
TABLE status, type, priority
|
|
1349
|
+
FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/board"
|
|
1350
|
+
WHERE prjct_type = "task"
|
|
1351
|
+
SORT priority DESC
|
|
1352
|
+
\`\`\`
|
|
1353
|
+
|
|
1354
|
+
## Queue (Top 10)
|
|
1355
|
+
\`\`\`dataview
|
|
1356
|
+
TABLE priority, type
|
|
1357
|
+
FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/queue"
|
|
1358
|
+
SORT priority DESC
|
|
1359
|
+
LIMIT 10
|
|
1360
|
+
\`\`\`
|
|
1361
|
+
|
|
1362
|
+
## Recent Shipped
|
|
1363
|
+
\`\`\`dataview
|
|
1364
|
+
TABLE version, type, duration_hours
|
|
1365
|
+
FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/shipped"
|
|
1366
|
+
SORT shipped_at DESC
|
|
1367
|
+
LIMIT 5
|
|
1368
|
+
\`\`\`
|
|
1369
|
+
|
|
1370
|
+
## Knowledge Base
|
|
1371
|
+
\`\`\`dataview
|
|
1372
|
+
TABLE file.mtime as "Updated"
|
|
1373
|
+
FROM "${H.basename(H.dirname(t))}/${H.basename(t)}/architecture" OR "${H.basename(H.dirname(t))}/${H.basename(t)}/research"
|
|
1374
|
+
SORT file.mtime DESC
|
|
1375
|
+
LIMIT 10
|
|
1376
|
+
\`\`\`
|
|
1377
|
+
`;await Be.writeFile(H.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=H.resolve(e,t);if(!s.startsWith(H.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=H.relative(e,s).split(H.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=H.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await Be.readFile(o,"utf-8"),a=null,c=i,u=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return u&&(a=this.parseYamlFrontmatter(u[1]),c=u[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await Be.mkdir(H.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:u}=await Promise.resolve().then(()=>(Zt(),Km));c=`${u(o)}
|
|
1378
|
+
|
|
1379
|
+
${n}`}await Be.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],u=s.toLowerCase(),d=u.split(/\s+/).filter(p=>p.length>1),m=await this.walkDir(i);for(let p of m)if(r.ALLOWED_EXTENSIONS.has(H.extname(p).toLowerCase()))try{let g=await Be.readFile(p,"utf-8"),h=g.toLowerCase(),b=H.relative(o,p),w=0;for(let v of d){let A=0,F=0;for(;(A=h.indexOf(v,A))!==-1;)F++,A+=v.length;F>0&&(w+=Math.log(1+F)),b.toLowerCase().includes(v)&&(w+=2)}if(w>0){let v=g.match(/^#\s+(.+)$/m),A=v?v[1]:H.basename(p,H.extname(p)),F=h.indexOf(u.split(/\s+/)[0]),J=Math.max(0,F-50),k=Math.min(g.length,F+150),j=(J>0?"...":"")+g.slice(J,k).replace(/\n/g," ").trim()+(k<g.length?"...":"");c.push({path:b,title:A,excerpt:j,score:w})}}catch{}return c.sort((p,g)=>g.score-p.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await Be.readdir(o,{withFileTypes:!0}),a=[];for(let c of i){if(r.BLOCKED_DIRS.has(c.name)||c.name.startsWith("."))continue;let u=s?`${s}/${c.name}`:c.name;if(c.isDirectory())a.push({path:u,name:c.name,isDir:!0});else if(r.ALLOWED_EXTENSIONS.has(H.extname(c.name).toLowerCase())){let d=await Be.stat(H.join(o,c.name));a.push({path:u,name:c.name,isDir:!1,size:d.size})}}return a}async getVaultStats(e,t){let s=this.getProjectPath(e,t),n={},o=0,i=0,a=await this.walkDir(s);for(let c of a){if(!r.ALLOWED_EXTENSIONS.has(H.extname(c).toLowerCase()))continue;let u=H.relative(s,c),d=H.dirname(u).split(H.sep)[0]||".";n[d]=(n[d]||0)+1,o++;try{let m=await Be.stat(c);i+=m.size}catch{}}return{totalNotes:o,folders:n,totalSize:i}}parseYamlFrontmatter(e){let t={};for(let s of e.split(`
|
|
1380
|
+
`)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await Be.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=H.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},Gn=new Ol;V();Zt();Qe();St();var Vn=class extends he{static{l(this,"ObsidianCommands")}async obsidian(e=null,t=process.cwd()){let s=(e||"status").split(" ").filter(Boolean),n=s[0],o=s.includes("--md"),i,a=s.indexOf("--vault-path");a!==-1&&s[a+1]&&(i=s[a+1]);let c=!s.includes("--no-auto-export"),u={md:o,vaultPath:i,autoExport:c};switch(n){case"setup":return this.setup(t,u);case"export":return this.export(t,u);case"status":return this.status(t,u);default:return{success:!1,message:u.md?L(qt("error",`Unknown subcommand: ${n}. Use: setup, export, status`)):`Unknown subcommand: ${n}`}}}async setup(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=t.vaultPath;if(!o){let g="Vault path required. Usage: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(g),{success:!1,message:t.md?L(qt("error",g)):""}}if(!await C(o)){let g=`Vault path does not exist: ${o}`;return t.md||f.fail(g),{success:!1,message:t.md?L(qt("error",g)):""}}let i=Bn.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=R.getGlobalProjectPath(n),u=Bn.join(c,"project.json"),d=await be(u)||{},m=d.integrations||{};m.obsidian=a,d.integrations=m,await ce(u,d);let p=Gn.getProjectPath(a,i);return await Gn.ensureStructure(p),await Gn.writeLink(p,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?L(ue("Obsidian Linked"),_e({Vault:o,"Project folder":`projects/${i}/`,"Auto-export":a.autoExport?"enabled":"disabled"}),re([{label:"Export project data to vault",command:"prjct obsidian export"},{label:"Check integration status",command:"prjct obsidian status"}])):""}}async export(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o){let c="Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(c),{success:!1,message:t.md?L(qt("error",c)):""}}let i=Bn.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await Gn.exportAll(n,i,o);if(!t.md)if(a.success)f.done("Export complete"),f.info(`Board: ${a.exported.board} tasks`),f.info(`Queue: ${a.exported.queue} items`),f.info(`Shipped: ${a.exported.shipped} items`),f.info(`Roadmap: ${a.exported.roadmap} features`),f.info(`Daily: ${a.exported.daily?"generated":"skipped"}`);else{f.warn("Export completed with errors");for(let c of a.errors)f.fail(c)}return{success:a.success,message:t.md?L(ue("Obsidian Export",a.success?"All sections exported":"Completed with errors"),_e({Board:`${a.exported.board} tasks`,Queue:`${a.exported.queue} items`,Shipped:`${a.exported.shipped} items`,Roadmap:`${a.exported.roadmap} features`,Daily:a.exported.daily?"generated":"skipped"}),a.errors.length>0?`### Errors
|
|
1381
|
+
${a.errors.map(c=>`- ${c}`).join(`
|
|
1382
|
+
`)}`:null,re([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.warn("Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault"),{success:!0,message:t.md?L(qt("info","Obsidian not configured"),re([{label:"Configure Obsidian vault",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=Bn.basename(e),a=Gn.getProjectPath(o,i),c=await C(Bn.join(a,".prjct-link.yml"));return t.md||(f.done("Obsidian configured"),f.info(`Vault: ${o.vaultPath}`),f.info(`Project folder: projects/${o.projectFolder||i}/`),f.info(`Auto-export: ${o.autoExport?"enabled":"disabled"}`),f.info(`Link file: ${c?"present":"missing"}`)),{success:!0,message:t.md?L(ue("Obsidian Status"),_e({Vault:o.vaultPath,"Project folder":`projects/${o.projectFolder||i}/`,"Auto-export":o.autoExport?"enabled":"disabled","Link file":c?"present":"missing"}),re([{label:"Export data to vault",command:"prjct obsidian export"}])):""}}async getObsidianConfig(e){let t=R.getGlobalProjectPath(e),s=Bn.join(t,"project.json"),n=await be(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}};xe();Ct();Nt();Uo();var Nl=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await le.getActiveTasks(e),o=t.includeBacklog?await le.getBacklog(e):[],i=[...n,...o],c=Fo(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1301
1383
|
`)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1302
1384
|
`)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,m=a[u.priority?.toLowerCase()||"none"]??4;return d-m})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
|
|
1303
|
-
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},
|
|
1385
|
+
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},US=new Nl,qn=US;wr();gt();W();Qe();St();var Jn=null,an=class extends he{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:y(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t),i=this.slugify(e),a=await Ut.create(t,i,{branch:s.branch});await Ut.setup(a.path,t);let c=z();return await _.startTaskInWorkspace(o,{id:z(),description:e,sessionId:z(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:y(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Ut.create(t,a);await Ut.setup(c.path,t);let u=z();await _.startTaskInWorkspace(n,{id:z(),description:i,sessionId:z(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${y(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:y(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=qn.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=qn.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await qn.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Jn=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(qn.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Jn||Jn.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Jn.items){let i=qn.slugify(o);try{let a=await Ut.create(t,i);await Ut.setup(a.path,t);let c=z();await _.startTaskInWorkspace(e,{id:z(),description:o.title,sessionId:z(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Jn.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${y(a)}`)}}Jn=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([_.getActiveTasks(e),Ut.list(t)]),o=await _.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
|
|
1304
1386
|
Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(p=>p.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",m=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${m}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
|
|
1305
|
-
Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await
|
|
1306
|
-
${
|
|
1387
|
+
Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await _.getActiveTasks(e),n=await Ut.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Ut.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},aN=new an;xe();import je from"chalk";Z();var HS=BigInt(300*1e9),Ll=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>HS&&this.marks.delete(t)}recordTiming(e,t,s,n){M.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)M.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){M.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){M.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return M.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.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,h)=>g+h,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=n.filter(p=>"metric"in p&&p.metric==="heap_used"),c=n.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),h=c.map(b=>b.value);o.memory={avgHeapMB:p(g.reduce((b,w)=>b+w,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:h.length>0?p(h.reduce((b,w)=>b+w,0)/h.length):0}}let u=n.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=n.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=n.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let h=g.context?.command||"unknown";p[h]||(p[h]=[]),p[h].push(g.value)}o.commandDurations={};for(let[g,h]of Object.entries(p))o.commandDurations[g]={avg:Math.round(h.reduce((b,w)=>b+w,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},WS=new Ll,vg=WS;W();Qe();St();var Ds={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Ei(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}l(Ei,"statusIcon");var zn=class extends he{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await vg.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1388
|
+
${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1307
1389
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1308
|
-
${
|
|
1309
|
-
${
|
|
1390
|
+
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ei(i.startup.avg,Ds.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: <${Ds.startup.max}ms`)}`)}if(i.memory){let c=Ei(i.memory.peakHeapMB,Ds.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: <${Ds.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ei(i.contextCorrectness.rate,Ds.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: ${Ds.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ei(i.subtaskHandoff.rate,Ds.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: ${Ds.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1391
|
+
${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(s){return f.fail(y(s)),{success:!1,error:y(s)}}}};yi();is();xe();Se();Cr();import YS from"node:fs/promises";import QS from"node:http";import ZS from"node:path";import ne from"chalk";Se();V();import GS from"node:fs/promises";import BS from"node:path";var Pg="https://api.prjct.app",Eg={apiKey:null,apiUrl:Pg,userId:null,email:null,lastAuth:null},Fl=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=R.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await be(this.configPath);return this.cachedConfig=e??{...Eg},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await ze(BS.dirname(this.configPath)),await ce(this.configPath,s),await GS.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Pg}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Eg},await ce(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},VS=new Fl,ht=VS;qs();var qS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function JS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(JS,"camelToSnake");function zS(r){let e={};for(let[t,s]of Object.entries(r))e[JS(t)]=s;return e}l(zS,"snakeCaseKeys");function KS(r,e){let[t,s]=e.type.split("."),n=qS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=zS(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}l(KS,"mapCliEventToWebFormat");function Cg(r,e){return e.map(t=>KS(r,t)).filter(t=>t!==null)}l(Cg,"mapCliEventsToWebFormat");var Ul=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Cg(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Cn("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ht.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([ht.getApiUrl(),ht.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),Cn("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Cn("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Kn=new Ul;Ca();vs();Nt();Ps();gt();var Hl=class{static{l(this,"SyncManager")}async hasAuth(){return await ht.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Kn.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Ts.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await Kn.pushEvents(e,n);if(o.success)return await Ts.clearPending(e),await Ts.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Ts.getLastSync(e))?.timestamp,n=await Kn.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Ts.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await _.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await _.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await le.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await We.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await We.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await qe.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await le.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},XS=new Hl,xg=XS;W();Ue();V();Qo();Qe();$t();St();var Xn=class extends he{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await ht.write({apiKey:o,...i?{apiUrl:i}:{}}),await Kn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1310
1392
|
- **Status**: Connected
|
|
1311
1393
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1312
|
-
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(
|
|
1394
|
+
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`)),f.info(ne.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
1313
1395
|
- **Status**: Key saved (server unreachable)
|
|
1314
|
-
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await
|
|
1315
|
-
- **Status**: Logged out`:""};default:{let o=await
|
|
1396
|
+
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await ht.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
|
|
1397
|
+
- **Status**: Logged out`:""};default:{let o=await ht.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
|
|
1316
1398
|
- **Authenticated**: Yes
|
|
1317
1399
|
- **Email**: ${o.email||"N/A"}
|
|
1318
1400
|
- **Key**: \`${o.apiKeyPrefix}\`
|
|
1319
1401
|
- **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?f.box("Auth Status",`Email: ${o.email||"N/A"}
|
|
1320
1402
|
Key: ${o.apiKeyPrefix}
|
|
1321
|
-
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${
|
|
1322
|
-
Key: ${t.apiKeyPrefix}`),f.info(`Run ${
|
|
1403
|
+
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${ne.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ht.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
|
|
1404
|
+
Key: ${t.apiKeyPrefix}`),f.info(`Run ${ne.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
|
|
1323
1405
|
- **Email**: ${t.email}
|
|
1324
1406
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1325
1407
|
|
|
1326
|
-
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=
|
|
1408
|
+
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=QS.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),m=c.searchParams.get("user_id");if(u){await ht.saveAuth(u,m||"",d||"");let p=`${s}/api`;await ht.write({apiUrl:p}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
|
|
1327
1409
|
Key: ${u.substring(0,12)}...
|
|
1328
1410
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1329
1411
|
- **Email**: ${d}
|
|
1330
1412
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1331
1413
|
Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
|
|
1332
|
-
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(
|
|
1414
|
+
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ne.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await N(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ne.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await ht.getStatus()).authenticated?(await ht.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await I.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await xg.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
|
|
1333
1415
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1334
1416
|
<title>prjct CLI Connected</title>
|
|
1335
1417
|
<style>
|
|
@@ -1384,31 +1466,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1384
1466
|
<h1>Authentication Failed</h1>
|
|
1385
1467
|
<div class="msg">${e}</div>
|
|
1386
1468
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1387
|
-
</div></body></html>`}async start(){let e=await
|
|
1469
|
+
</div></body></html>`}async start(){let e=await Re.checkInstallation(),t=(pt(),lt(Mt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1388
1470
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1389
1471
|
|
|
1390
1472
|
Please install one first:
|
|
1391
1473
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1392
1474
|
- Gemini CLI: https://geminicli.com/docs
|
|
1393
|
-
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await
|
|
1475
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Re.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1394
1476
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1395
|
-
${
|
|
1396
|
-
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(
|
|
1477
|
+
${R.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1478
|
+
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(Oo(),nc));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
|
|
1397
1479
|
\u{1F389} Setup complete!`),console.log(`
|
|
1398
1480
|
Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1399
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1481
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Re.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Re.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1400
1482
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1401
1483
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1402
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1403
|
-
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(
|
|
1484
|
+
\u{1F4DD} Installing global configuration...`);let s=await Re.installGlobalConfig(),n=s.path?R.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(pt(),lt(Mt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1485
|
+
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Oo(),nc));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
|
|
1404
1486
|
\u{1F389} Setup complete!
|
|
1405
1487
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1406
|
-
\u{1F50C} Configuring MCP servers...`);try{await
|
|
1488
|
+
\u{1F50C} Configuring MCP servers...`);try{await us.install();let e=await us.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${y(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ms();await Qs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await Gc("linear",Wc.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${y(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ms();await Qs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await Gc("jira",Wc.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${y(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=R.getClaudeDir(),t=R.getClaudeSettingsPath(),s=ZS.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
|
|
1407
1489
|
# prjct Status Line for Claude Code
|
|
1408
1490
|
# Shows version update notifications and current task
|
|
1409
1491
|
|
|
1410
1492
|
# Current CLI version (embedded at install time)
|
|
1411
|
-
CLI_VERSION="${
|
|
1493
|
+
CLI_VERSION="${Ce}"
|
|
1412
1494
|
|
|
1413
1495
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1414
1496
|
read -r json
|
|
@@ -1459,14 +1541,14 @@ fi
|
|
|
1459
1541
|
|
|
1460
1542
|
# Default: show prjct branding
|
|
1461
1543
|
echo "\u26A1 prjct"
|
|
1462
|
-
`;await
|
|
1544
|
+
`;await YS.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await be(t)??{}}catch{}return o.statusLine={type:"command",command:s},await ce(t,o),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ne.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(ne.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(ne.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(ne.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(ne.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(ne.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(ne.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(` ${ne.bold.cyan("prjct")}${ne.magenta("/")}${ne.green("cli")} ${ne.dim.white(`v${Ce} installed`)}`),console.log(""),console.log(` ${ne.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ne.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ne.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ne.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(ne.bold.cyan("\u{1F680} Quick Start")),console.log(ne.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(` ${ne.bold("1.")} Initialize your project:`),console.log(` ${ne.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ne.bold("2.")} Start your first task:`),console.log(` ${ne.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ne.bold("3.")} Ship & celebrate:`),console.log(` ${ne.green('prjct ship "user login"')}`),console.log(""),console.log(ne.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(` ${ne.dim("Documentation:")} ${ne.cyan("https://prjct.app")}`),console.log(` ${ne.dim("Report issues:")} ${ne.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ne.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};fo();xe();K();V();import Rg from"node:path";var eb=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],tb=`# Changelog
|
|
1463
1545
|
|
|
1464
1546
|
All notable changes to this project will be documented in this file.
|
|
1465
1547
|
|
|
1466
1548
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1467
1549
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1468
|
-
`,
|
|
1469
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await
|
|
1550
|
+
`,Pi=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of eb){let n=Rg.join(this.projectPath,s);if(await C(n)){let o=await $e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Rg.join(this.projectPath,e);return await Pt(t,`${tb}
|
|
1551
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await $e(t.filePath),n=e.date||tu(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Pt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
|
|
1470
1552
|
${a}`}return`${e.trimEnd()}
|
|
1471
1553
|
|
|
1472
1554
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1476,31 +1558,31 @@ ${a}`}return`${n}
|
|
|
1476
1558
|
|
|
1477
1559
|
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1478
1560
|
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1479
|
-
`)}};
|
|
1480
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(
|
|
1481
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1482
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
1483
|
-
${
|
|
1561
|
+
`)}};jc();Ue();V();import Yn from"node:path";var Ci=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=Yn.join(this.projectPath,"package.json"),t=await be(e,null);return t?.version?{current:t.version,next:Qn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Yn.join(this.projectPath,"Cargo.toml"),t=await $e(e,"");if(!t)return null;let s=sb(t);return s?{current:s,next:Qn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Yn.join(this.projectPath,"pyproject.toml"),t=await $e(e,"");if(!t)return null;let s=nb(t);return s?{current:s,next:Qn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ws(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Yn.join(this.projectPath,e[0]),s=await $e(t,"");if(!s)return null;let n=rb(s);return n?{current:n,next:Qn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Yn.join(this.projectPath,e),s=await $e(t,"");if(!s)return null;let n=s.trim();return Ag(n)?{current:n,next:Qn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await N("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1562
|
+
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(Ag(n))return{current:n,next:Qn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Yn.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
|
|
1563
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await _s("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Pt(e.file,`${e.next}
|
|
1564
|
+
`);break}}async writeJsonVersion(e,t){let s=await be(e,{});s&&(s.version=t,await ce(e,s))}async writeTomlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Pt(e,n)}async writeXmlVersion(e,t){let s=await $e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Pt(e,n)}};function Ag(r){return/^\d+\.\d+\.\d+/.test(r)}l(Ag,"isSemver");function Qn(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}l(Qn,"bumpPatch");function sb(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(sb,"parseTomlVersion");function nb(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}l(nb,"parsePyprojectVersion");function rb(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(rb,"parseCsprojVersion");Ps();gt();W();K();Ue();Zt();An();Qe();pi();W();Ue();import Dt from"chalk";async function Kt(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=De.getRulesForCommand(r,e).filter(m=>m.position===t),a=i.filter(m=>m.type==="gate");for(let m of a){let p=m.description||m.action;console.log(`
|
|
1565
|
+
${Dt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await N(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let h=Date.now()-g,b=h>1e3?`${(h/1e3).toFixed(1)}s`:`${h}ms`;console.log(`${Dt.green("\u2713")} ${Dt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${Dt.red("\u2717")} gate failed: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
|
|
1484
1566
|
${y(g)}
|
|
1485
1567
|
`,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
|
|
1486
|
-
${
|
|
1487
|
-
${
|
|
1568
|
+
${Dt.dim(`[instruction] ${t}-${e}: ${p}`)}`),n.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
|
|
1569
|
+
${Dt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await N(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Dt.green("\u2713")} ${Dt.dim(`(${h})`)}`)}catch(p){console.log(`${Dt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
|
|
1488
1570
|
${y(p)}
|
|
1489
1571
|
`}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
|
|
1490
|
-
${
|
|
1572
|
+
${Dt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await N(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Dt.green("\u2713")} ${Dt.dim(`step passed (${h})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${Dt.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
|
|
1491
1573
|
${y(p)}
|
|
1492
|
-
`,n}}return n}l(
|
|
1574
|
+
`,n}}return n}l(Kt,"executeWorkflowRules");St();var Zn=class extends he{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Kt(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new Ci(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new Pi(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await qe.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:S()}),await it.learnDecision(o,"commit_footer","prjct","ship"),await it.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Kt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Ks.sync(t),s.md||f.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(s.md){let w=zo("ship",!0),v=L(ue(`Shipped: ${i}`,`Version: ${d}`),X("Results",Ae([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?X("Agent Instructions",Ae(b)):null,re(w.map(A=>({label:A.desc,command:A.cmd}))));console.log(v)}else f.done(`v${d} shipped`),Rt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async _createShipCommit(e,t){try{await N("git add .");let s=`feat: ${e}
|
|
1493
1575
|
|
|
1494
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1576
|
+
Generated with [p/](https://www.prjct.app/)`;return await _s("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return D(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await N("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return D(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};is();tc();Se();pl();uc();W();Qe();$t();St();import{execSync as Ur}from"node:child_process";import Ri from"node:fs/promises";import Fr from"node:path";import tr from"chalk";function Og(){try{return!!Ur("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(Og,"isHomebrewInstall");function Ng(){try{let e=Ur("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}l(Ng,"getCurrentVersion");var sr=class extends he{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await $o.updateVersion(Ce)}catch{}try{await new ci().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Ng();if(e)return Og()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(Og()){try{Ur("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Ur("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Ur("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Ng();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(y(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await No(i),c=await Lo(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new os().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${y(n)}`)}try{let o=await new os().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${y(n)}`)}try{await new os().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${y(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(pt(),Mt)),o=await n(),i=Fr.join(Tt("node:os").homedir());if(o.gemini.installed){let a=Fr.join(i,".gemini","GEMINI.md");try{let c=await Ri.readFile(a,"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=Fr.join(Fr.dirname(Tt.resolve("../../package.json")),"templates","global","GEMINI.md"),p=await Ri.readFile(m,"utf-8"),g=p.substring(p.indexOf(u),p.indexOf(d)+d.length),h=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),w=h+g+b,v="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",A="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(w.includes(v)&&w.includes(A)){let F=w.substring(0,w.indexOf(v)),J=w.substring(w.indexOf(A)+A.length);w=`${(F+J).replace(/\n{3,}/g,`
|
|
1495
1577
|
|
|
1496
1578
|
`).trim()}
|
|
1497
|
-
`}await
|
|
1498
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1499
|
-
${
|
|
1500
|
-
`),{success:!0,message:"No data"};let a=
|
|
1501
|
-
${
|
|
1502
|
-
${
|
|
1503
|
-
${
|
|
1579
|
+
`}await Ri.writeFile(a,w,"utf-8"),t.details.push("Gemini global config updated")}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(_g(),Mg));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(y(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?tr.green("\u2713"):c?tr.red("\u2717"):tr.yellow("\u26A0");console.log(` ${u} ${tr.bold(i)}`);for(let d of a.details)console.log(` ${tr.dim(d)}`);for(let d of a.errors)console.log(` ${tr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
|
|
1580
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=Fr.join(R.getGlobalBasePath(),"projects");try{return(await Ri.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Jc();xe();Rr();fc();W();Qe();_n();St();import Ie from"chalk";var nr=class extends he{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await I.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await kt.getAll(n);if(i.length===0)return console.log(`
|
|
1581
|
+
${Ie.dim("No velocity data yet.")}`),console.log(`${Ie.dim("Complete tasks with estimates to build velocity history.")}
|
|
1582
|
+
`),{success:!0,message:"No data"};let a=Zo(i,o);await Ho.saveMetrics(n,a),console.log(`
|
|
1583
|
+
${Ie.cyan("Sprint Velocity")} ${Ie.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?Ie.green:m.estimationAccuracy>=60?Ie.yellow:Ie.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ie.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ie.green("\u2191"):a.velocityTrend==="declining"?Ie.red("\u2193"):Ie.dim("\u2192");if(console.log(` Average: ${Ie.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ie.bold(`${a.estimationAccuracy}%`)} ${Ie.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1584
|
+
${Ie.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ie.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ie.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ie.green("\u2713")} ${m.category} tasks estimated within ${Ie.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Sp(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1585
|
+
${Ie.dim("Projection:")}`),console.log(` Backlog: ${Ie.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ie.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await I.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Cs,...s.velocity}}catch{}return Cs}};ul();import hb from"node:fs/promises";import yb from"node:path";vr();K();_n();var Fg=l(r=>Sa.includes(r),"isValidPoint"),cn=l(r=>ba[r],"pointsToMinutes"),Lg=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"),Ug=l(r=>{let e=cn(r);return`${Lg(e.min)}\u2013${Lg(e.max)}`},"pointsToTimeRange"),Hg=l(async(r,e)=>{let s=(await kt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+vt(c.actualDuration),0)/s.length;return{points:ub(o),basedOn:s.length}},"suggestFromHistory"),ub=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Sa){let n=Math.abs(ba[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");xe();Se();W();V();import Gl from"node:fs/promises";import db from"node:os";import Ai from"node:path";var Bl=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ai.join(db.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Gl.mkdir(this.commandsPath,{recursive:!0});let s=Ai.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Gl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=Ai.join(this.commandsPath,`${e}.md`);return await Gl.unlink(t),{success:!0}}catch(t){return D(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=Ai.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
|
|
1504
1586
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1505
1587
|
---
|
|
1506
1588
|
|
|
@@ -1536,46 +1618,46 @@ Suggest relevant actions based on the workflow results:
|
|
|
1536
1618
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1537
1619
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1538
1620
|
- Run again: \`p. ${e}\`
|
|
1539
|
-
`}},
|
|
1540
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(
|
|
1541
|
-
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${
|
|
1621
|
+
`}},Vl=new Bl;Ct();Cr();wl();function mb(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(mb,"complexityToPoints");async function pb(r,e){let t=Ln.detectTaskType(e),s=await Hg(r,t);if(s){let a=cn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Ln.estimateComplexity(e),o=mb(n.level),i=cn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(pb,"estimateTaskForStart");var ql=pb;Ue();async function Di(r){try{let{stdout:e}=await N("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(Di,"getGitBranch");async function Wg(r,e=20){try{let{stdout:t}=await N("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
|
|
1622
|
+
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(Wg,"getModifiedFiles");Se();Z();K();var rr="session-snapshot",gb=30,Jl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Di(t),o=await Wg(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:S(),resumeHint:c};return P.setDoc(e,rr,u),u}getSnapshot(e){try{return P.getDoc(e,rr)}catch{return null}}clearSnapshot(e){try{P.deleteDoc(e,rr)}catch{}}async listAllSnapshots(){let e=await R.listProjects(),t=[];for(let s of e)try{if(!P.exists(s))continue;let n=P.getDoc(s,rr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=gb){let t=await R.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!P.exists(o))continue;let i=P.getDoc(o,rr);i&&new Date(i.timestamp).getTime()<s&&(P.deleteDoc(o,rr),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${ut(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${ut(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
1623
|
+
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${ut(t*1e3)} of work`),s.join(" ")}},js=new Jl;Tn();Z();var zl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){P.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1542
1624
|
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=P.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;P.run(e,`UPDATE context_feedback
|
|
1543
1625
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1544
1626
|
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=P.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let n=P.query(e,`SELECT * FROM context_feedback
|
|
1545
1627
|
WHERE actual_files IS NOT NULL
|
|
1546
|
-
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(
|
|
1628
|
+
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(w=>d.has(w)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let h=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let w of b){let v=i.get(w)??0;i.set(w,v+g)}for(let w of h)if(!b.has(w)){let v=i.get(w)??0;i.set(w,v-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Hr=new zl;Sl();Nt();gt();pi();ti();W();K();Qo();Zt();An();Qe();vl();_n();St();Se();W();K();Hs();Z();import ji from"node:fs/promises";import Gg from"node:path";var or="1.0.0";function fb(){return{version:or,lastUpdated:"",checksums:{}}}l(fb,"getDefaultChecksums");var Kl=class{static{l(this,"IndexStorage")}getIndexPath(e){return Gg.join(R.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await ji.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==or?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 fb()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await ji.readFile(e);return _u(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))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 s={version:or,lastUpdated:S(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{P.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await ji.readdir(t);await Promise.all(s.map(n=>ji.unlink(Gg.join(t,n))))}catch(s){if(!D(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==or?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===or)return 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!==or?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=P.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=P.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Bg=new Kl;function Vg(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(Vg,"rankPatterns");function qg(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=Bg.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}l(qg,"detectDomainsFromTask");function Xl(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Vg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1547
1629
|
|
|
1548
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),p;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let b=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(m.some(
|
|
1630
|
+
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),p;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let b=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(m.some(w=>b.includes(w))){p=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
|
|
1549
1631
|
`)}).join(`
|
|
1550
1632
|
|
|
1551
|
-
`)}`}l(
|
|
1552
|
-
`)}l(
|
|
1553
|
-
${
|
|
1554
|
-
${
|
|
1633
|
+
`)}`}l(Xl,"buildPatternBriefing");function Yl(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
|
|
1634
|
+
`)}l(Yl,"buildContextContract");var wb=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],ir=class extends he{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Kt(o,"task","before",{projectPath:t,skipRules:s.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e)&&(a=e),s.md){try{await us.ensureReady()}catch(ke){return ft("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(ke)}),{success:!1,error:y(ke)}}let p=await ql(o,c),g=await _.getCurrentTask(o),h=await _.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(wr(),no)),w=await b.detect(t);if(w){let ke=h.find(ot=>ot.worktreePath===w.path);if(ke)return ft("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:ke.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:ke}}let v;if(g&&!w){let ke=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let ot=await b.create(t,ke);await b.setup(ot.path,t),v=ot.path,qt("info",`Parallel session created: \`${ot.branch}\` at \`${ot.path}\``)}catch{return ft("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(v||w){let ke=z();await _.startTaskInWorkspace(o,{id:z(),description:c,sessionId:z(),workspaceId:ke,worktreePath:v||w.path,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes},ke)}else await _.startTask(o,{id:z(),description:c,sessionId:z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes});let F=R.getGlobalProjectPath(o),J=zc(c),k;try{k=Hr.getHistoricalBoosts(o,J),k.size===0&&(k=void 0)}catch{}let O=({bug:30,chore:40,improvement:80,feature:100}[p.taskType]??80)>=80?15:10,[we,Fe,,jt]=await Promise.all([Di(t),Ye.getActive(o).catch(()=>null),bb(F),$n(c,t,{maxFiles:O,minScore:.15,historicalBoosts:k}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),rt=null;try{let ke=js.getSnapshot(o);ke&&(rt=js.formatContinuityContext(ke),js.clearSnapshot(o))}catch{}let yt=null;if(Fe?.analyzedAt){let ke=new Date(Fe.analyzedAt),ot=Math.floor((Date.now()-ke.getTime())/(1e3*60*60*24));ot>7&&(yt=qt("warn",`Analysis is ${ot} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Fe||(yt=qt("info","No project analysis found. Run `p. sync` for better context targeting."));let fs=null;if(k&&k.size>0){let ke=[...k.entries()].filter(([,ot])=>ot>.3).sort((ot,Bi)=>Bi[1]-ot[1]).slice(0,5);ke.length>0&&(fs=`### Previously Useful Files
|
|
1635
|
+
${ke.map(([Bi])=>`\`${Bi}\``).join(", ")}`)}let Ni=qg(c,o),Li=Rn({description:c,branch:we,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Ni}),Fi=Mc(jt.files.map(ke=>({path:ke.path,description:ke.reasons.join(", ")}))),Ui=jt.files.map(ke=>ke.path),Hi=Xl(Fe,Ui),Wi=Yl(jt.files,Fe),Gi=re([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),oe=kb(),uf=Sb(o);console.log(L(rt,yt,Li,Wi,Fi,fs,Hi,uf,oe,Gi));try{let ke=await _.getCurrentTask(o);ke&&Hr.recordSuggestions(o,ke.id,J,jt.files.map(ot=>ot.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:S()}),await Kt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await ai.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await ql(o,c);return await _.startTask(o,{id:z(),description:c,sessionId:z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),Mr("working"),Rt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:S()}),await Kt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:Fg,pointsToMinutes:cn,pointsToTimeRange:Ug,storeEstimate:l(async p=>{let g=cn(p);return await _.updateCurrentTask(o,{estimatedPoints:p,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return s.md?ft("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?ss(new Date(i.startedAt)):void 0,c=Rn({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?$c(u,d):"",p=re([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,p))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=y(n);return s.md?o.includes("Cannot run")||o.includes("working state")?ft("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})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(wr(),no)),i=await o.detect(e),a=await _.getCurrentTask(n),c;if(i){let we=(await _.getActiveTasks(n)).find(Fe=>Fe.worktreePath===i.path);we&&(a=we,c=we.workspaceId)}if(!a)return t.md?ft("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await Kt(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,m="",p=0;if(a.startedAt){let O=new Date(a.startedAt);m=ss(O),p=Math.round((Date.now()-O.getTime())/6e4)}let g=a.estimatedMinutes,h=a.estimatedPoints,b=a.type||"feature",w=a.linearId;try{await kt.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:S(),estimatedDuration:g?Jg(g):"0m",actualDuration:m||"0m",variance:g?Eb(p-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,w].filter(Boolean)})}catch{}let v="";if(h&&g){let O=p-g,we=g>0?Math.round((p-g)/g*100):0,Fe=O>=0?"+":"";v=` | est: ${h}pt (${Jg(g)}) \u2192 ${Fe}${we}%`}let A=[],F=null,J=null;try{if(A=await vb(e,a.startedAt),A.length>0){Hr.completeFeedback(n,a.id,A);let O=Hr.getFeedback(n,a.id);O&&(F=O.precision,J=O.recall)}}catch{}c?await _.completeTaskInWorkspace(n,c,t.feedback):await _.completeTask(n,t.feedback);try{js.clearSnapshot(n)}catch{}let k=a.linearId,j=k!=null?await Qs("linear",ms()).catch(()=>!1):!1;if(t.md){let O=m?` (${m})`:"",we=null;if(A.length>0){let rt=A.slice(0,20).map(yt=>`\`${yt}\``);we=`### Files Modified (${A.length})
|
|
1636
|
+
${rt.join(", ")}`}let Fe=null;if(F!==null&&J!==null){let rt=Math.round(F*100),yt=Math.round(J*100);Fe=`### Context Accuracy
|
|
1555
1637
|
| Metric | Value |
|
|
1556
1638
|
|--------|-------|
|
|
1557
|
-
| Precision | ${
|
|
1558
|
-
| Recall | ${
|
|
1559
|
-
Research is available. Create your implementation plan next.`):Rt="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(we("Completed",`${d}${N}`),rt({Duration:m||"unknown",...E?{Variance:E.replace(" | ","")}:{}}),fe,Ne,Rt,de([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let N=m?` (${m}${E})`:"";w&&M?f.done(`${d}${N} \u2192 Linear linked (update via MCP)`):f.done(`${d}${N}`),xr("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:m,estimatedPoints:h,estimatedMinutes:g,actualMinutes:p,timestamp:S()}),await Bt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:m}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await pe.getActiveTasks(n);if(o.length===0)return t.md?ht("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.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.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(Y("Queue",`${o.length} task${o.length!==1?"s":""}`),$e(i,!0),de([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await O.getCurrentTask(o);if(!i)return s.md?ht("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=Qt(new Date(i.startedAt))),await O.pauseTask(o,e);try{await Es.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(L(we("Task Paused",`**Paused:** ${i.description}`),rt({Reason:e||void 0,"Duration worked":a||void 0}),de([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),xr("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:S()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await O.getCurrentTask(o);if(i)return s.md?ht("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await O.resumeTask(o);return a?(s.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),de([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),xr("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:S()}),{success:!0,task:a.description}):(s.md?ht("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await j.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${y(n)}`):f.fail(y(n)),{success:!1,error:y(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of cb){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let u=et.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=et.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ae.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),de([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=et.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=et.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=Ae.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),de([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=et.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=et.getAllWorkflows(t).map(k=>k.name).join(", "),b=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=Ae.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),de([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ae.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(L(we("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ae.resetRules(e);return t.md?console.log(L(we("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=Ae.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return Ae.updateRule(t,o,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),de([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ae.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Ae.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(Y("Multiple matches",`${a.length} rules match "${n}"`),$e(c),de(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(Y("Workflow Help","Manage hooks, gates, and steps for your workflow"),Y("Commands",$e(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Y("Natural Language (EN/ES)",$e(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=Ae.getRulesForCommand(t,e):o=Ae.getAllRules(t),o.length===0)return s.md?console.log(L(Y("Workflow Rules","No rules configured"),de([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(mb(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(Y(c,u),a.length>0?_m(a.join(`
|
|
1560
|
-
|
|
1561
|
-
`),""):null,
|
|
1562
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=
|
|
1563
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1564
|
-
`)))}console.log(L(...i,
|
|
1639
|
+
| Precision | ${rt}% of suggested files were used |
|
|
1640
|
+
| Recall | ${yt}% of modified files were suggested |`}let jt=null;try{let{prjctDb:rt}=(Z(),lt(co)),yt=rt.getDoc(n,"rpi:current:research"),fs=rt.getDoc(n,"rpi:current:plan");yt?fs||(jt=`### RPI Phase: Plan Ready
|
|
1641
|
+
Research is available. Create your implementation plan next.`):jt="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(ue("Completed",`${d}${O}`),_e({Duration:m||"unknown",...v?{Variance:v.replace(" | ","")}:{}}),we,Fe,jt,re([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let O=m?` (${m}${v})`:"";k&&j?f.done(`${d}${O} \u2192 Linear linked (update via MCP)`):f.done(`${d}${O}`),Mr("completed"),Rt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:m,estimatedPoints:h,estimatedMinutes:g,actualMinutes:p,timestamp:S()}),await Kt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:m}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await I.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await le.getActiveTasks(n);if(o.length===0)return t.md?ft("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.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.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(X("Queue",`${o.length} task${o.length!==1?"s":""}`),Ae(i,!0),re([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Rt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?ft("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=ss(new Date(i.startedAt))),await _.pauseTask(o,e);try{await js.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(L(ue("Task Paused",`**Paused:** ${i.description}`),_e({Reason:e||void 0,"Duration worked":a||void 0}),re([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),Mr("paused"),Rt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:S()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return s.md?ft("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(s.md?console.log(L(ue("Task Resumed",`**Resumed:** ${a.description}`),re([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Mr("working"),Rt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:S()}),{success:!0,task:a.description}):(s.md?ft("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${y(n)}`):f.fail(y(n)),{success:!1,error:y(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of wb){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let u=nt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=nt.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=De.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ue("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),re([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=nt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=nt.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=De.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ue("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),re([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=nt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=nt.getAllWorkflows(t).map(w=>w.name).join(", "),b=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=De.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ue("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),re([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!De.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(L(ue("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=De.resetRules(e);return t.md?console.log(L(ue("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=De.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return De.updateRule(t,o,{enabled:!1}),s.md?console.log(L(ue("Rule Disabled",`#${o} [${c.type}] ${c.action}`),re([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=De.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return De.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(ue("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(X("Multiple matches",`${a.length} rules match "${n}"`),Ae(c),re(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(X("Workflow Help","Manage hooks, gates, and steps for your workflow"),X("Commands",Ae(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),X("Natural Language (EN/ES)",Ae(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=De.getRulesForCommand(t,e):o=De.getAllRules(t),o.length===0)return s.md?console.log(L(X("Workflow Rules","No rules configured"),re([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(Tb(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(X(c,u),a.length>0?Ic(a.join(`
|
|
1642
|
+
|
|
1643
|
+
`),""):null,re([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let n=De.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await gi(t),i=0,a=[],c=De.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=De.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=De.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(L(ue("Workflow Initialized",`Added ${a.length} default ship rules`),Ae(a),re([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!nt.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(nt.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(nt.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=nt.createWorkflow(t,{name:i,description:a}),d=await Vl.generateWorkflowTemplate(i,a);if(!d.success){nt.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${m}`):f.fail(m),{success:!1,error:m}}return n.md?console.log(L(ue("Workflow Created",`Created workflow: ${i}`),X("Description",a),X("Template",`Installed at ${d.path}`),re([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1644
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=nt.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Built-in Workflows",a.join(`
|
|
1645
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Custom Workflows",a.join(`
|
|
1646
|
+
`)))}console.log(L(...i,re([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
|
|
1565
1647
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1566
|
-
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!
|
|
1567
|
-
`)}l(
|
|
1568
|
-
`)}catch{return null}}l(
|
|
1569
|
-
`)}l(
|
|
1648
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!nt.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Vl.deleteWorkflowTemplate(n),s.md?console.log(L(ue("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=y(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=nt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await Kt(o,i,"before",{projectPath:t});if(!c.success){if(s.md)ft("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Kt(o,i,"after",{projectPath:t}),s.md?console.log(L(ue(`Workflow: ${i}`,a.description||""),re([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=y(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await js.cleanup();return t.md?console.log(ue("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await js.listAllSnapshots();if(s.length===0)return t.md?ft("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=ut(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(L(X("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Ae(n),re([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=ut(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await I.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?ft("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let m="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(L(X("Tokens",m))):f.fail(m),{success:!1,error:m}}let d=await _.addTokens(o,c,u);return d?(s.md?console.log(L(X("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),_e({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}};function kb(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
|
|
1649
|
+
`)}l(kb,"buildEfficiencySection");function Sb(r){try{let{prjctDb:e}=(Z(),lt(co)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
|
|
1650
|
+
`)}catch{return null}}l(Sb,"buildRpiSection");function Jg(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(Jg,"formatMinutesToDuration");async function bb(r){try{let e=yb.join(r,"analysis","repo-analysis.json"),t=await hb.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e),null}}l(bb,"loadRepoAnalysis");function Tb(r,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),n=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,h)=>{let b=g.map(F=>` ${F.enabled?h:"o"} #${F.id} ${F.action}`),w=[p,...b],A=Math.max(...w.map(F=>F.length))+2;u.push(`+${"-".repeat(A)}+`);for(let F of w)u.push(`| ${F.padEnd(A-1)}|`);u.push(`+${"-".repeat(A)}+`)},"drawBox"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),n.length>0&&(d("HOOKS (before)",n,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),c.length>0&&(m(u),d("STEPS (after)",c,">")),u.join(`
|
|
1651
|
+
`)}l(Tb,"buildFlowDiagram");async function vb(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
|
|
1570
1652
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
|
|
1571
1653
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
|
|
1572
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(pb,"getFilesModifiedSinceTaskStart");function gb(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}l(gb,"formatVariance");var Qn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Yn,this.planning=new Xs,this.shipping=new Vn,this.analytics=new Mn,this.performanceCmds=new Fn,this.maintenance=new On,this.analysis=new Zs,this.setupCmds=new Hn,this.updateCmds=new qn,this.velocityCmds=new zn,this.contextCmds=new en,this.parallelCmds=new tn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}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(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}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 cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}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 enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}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,s){return this.workflow.logToMemory(e,t,s)}},kU=new Qn;ui();var Ng={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}},Lg=[{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,requiresLlm:!0,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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,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,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{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,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,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:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--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"]}];li();ss();ye();U();B();xt();import{execSync as Ei}from"node:child_process";import wt from"node:fs/promises";import fb from"node:os";import ls from"node:path";import hb from"node:readline";import Te from"chalk";var Pi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",_r="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Ug(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ls.join(r,s.name);if(s.isDirectory())e+=await Ug(n);else try{let o=await wt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Ug,"getDirectorySize");function Fg(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Fg,"formatSize");async function yb(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(yb,"countDirectoryItems");function wb(){let r={homebrew:!1,npm:!1};try{Ei("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ei("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(wb,"detectInstallation");async function kb(){let r=[],e=ju(),t=A.getGlobalBasePath(),s=await C(t),n=s?await yb(ls.join(t,"projects")):0,o=s?await Ug(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=ls.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let R=await wt.readFile(i,"utf-8");c=R.includes(Pi)&&R.includes(_r)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=ls.join(e.claude.config,"prjct-statusline.sh"),p=await C(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,h=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let b=ls.join(e.gemini.config,"GEMINI.md"),k=await C(b),E=!1;if(k)try{let R=await wt.readFile(b,"utf-8");E=R.includes(Pi)&&R.includes(_r)}catch{}return k&&E&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(kb,"gatherUninstallItems");async function Sb(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Pi)||!e.includes(_r))return!1;let t=e.indexOf(Pi),s=e.indexOf(_r)+_r.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1573
|
-
|
|
1574
|
-
`).trim(),!n||n.trim().length===0?await
|
|
1575
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
1576
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(
|
|
1577
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1578
|
-
${a.length} errors:`));for(let c of a)console.log(Te.red(` - ${c}`))}return console.log(""),console.log(Te.green("prjct has been uninstalled.")),console.log(Te.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(Eb,"uninstall");var Ci=class extends ke{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Eb(e,t)}};var Ps=new Yn,xi=new Xs,Pb=new Vn,Wg=new Mn,Cb=new Fn,Cs=new On,Zn=new Zs,Or=new Hn,xb=new en,Ab=new zn,Hl=new tn,Rb=new Ci,Db=new qn;function Ib(){for(let[r,e]of Object.entries(Ng))F.registerCategory(r,e)}l(Ib,"registerCategories");function jb(){if(F.has("work"))return;Ib();let r=l(e=>Lg.find(t=>t.name===e),"getMeta");F.registerMethod("task",Ps,"now",r("task")),F.registerMethod("done",Ps,"done",r("done")),F.registerMethod("next",Ps,"next",r("next")),F.registerMethod("pause",Ps,"pause",r("pause")),F.registerMethod("resume",Ps,"resume",r("resume")),F.registerMethod("workflow",Ps,"workflow",r("workflow")),F.registerMethod("tokens",Ps,"tokens",r("tokens")),F.registerMethod("sessions",Ps,"sessions",r("sessions")),F.registerMethod("init",xi,"init",r("init")),F.registerMethod("bug",xi,"bug",r("bug")),F.registerMethod("idea",xi,"idea",r("idea")),F.registerMethod("spec",xi,"spec",r("spec")),F.registerMethod("ship",Pb,"ship",r("ship")),F.registerMethod("dash",Wg,"dash",r("dash")),F.registerMethod("help",Wg,"help",r("help")),F.registerMethod("perf",Cb,"perf",r("perf")),F.registerMethod("velocity",Ab,"velocity",r("velocity")),F.registerMethod("cleanup",Cs,"cleanup",r("cleanup")),F.registerMethod("cleanup-projects",Cs,"cleanupProjects",r("cleanup-projects")),F.registerMethod("design",Cs,"design",r("design")),F.registerMethod("recover",Cs,"recover",r("recover")),F.registerMethod("undo",Cs,"undo",r("undo")),F.registerMethod("redo",Cs,"redo",r("redo")),F.registerMethod("history",Cs,"history",r("history")),F.registerMethod("enrich",Cs,"enrich",r("enrich")),F.registerMethod("analyze",Zn,"analyze",r("analyze")),F.registerMethod("sync",Zn,"sync",r("sync")),F.registerMethod("stats",Zn,"stats",r("stats")),F.registerMethod("status",Zn,"status",r("status")),F.registerMethod("seal",Zn,"seal",r("seal")),F.registerMethod("verify",Zn,"verify",r("verify")),F.registerMethod("start",Or,"start",r("start")),F.registerMethod("setup",Or,"setup",r("setup")),F.registerMethod("login",Or,"login",r("login")),F.registerMethod("logout",Or,"logout",r("logout")),F.registerMethod("auth",Or,"auth",r("auth")),F.registerMethod("uninstall",Rb,"uninstall",r("uninstall")),F.registerMethod("update",Db,"update",r("update")),F.registerMethod("context",xb,"context",r("context")),F.registerMethod("parallel",Hl,"parallel",r("parallel")),F.registerMethod("worktree",Hl,"parallel",r("worktree")),F.registerMethod("conductor",Hl,"parallel",r("conductor"))}l(jb,"registerAllCommands");jb();Ce();ur();It();import{Hono as Gb}from"hono";import{cors as Vb}from"hono/cors";import{logger as Bb}from"hono/logger";import{secureHeaders as Jb}from"hono/secure-headers";ye();te();ws();Ht();Hs();ft();U();es();import $b from"node:fs/promises";import Mb from"node:path";import{Hono as _b}from"hono";function Ob(r){return A.getGlobalProjectPath(r)}l(Ob,"getProjectDataPath");function Gg(r,e){let t=new _b,s=Ob(r);return t.get("/state",async n=>{let o=await O.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await pe.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Ue.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=P.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await Ye.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([O.read(r),pe.read(r),Ue.read(r),Ye.read(r)]),u=P.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await O.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Mb.join(s,"context",`${o}.md`),c=await $b.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return D(a)||H.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Gg,"createRoutes");ye();te();ws();Ht();Hs();ft();import er from"node:fs/promises";import Nb from"node:path";import{Hono as Lb}from"hono";var Fb=A.getGlobalBasePath(),tr=Nb.join(Fb,"projects");function Ai(r){return P.getDoc(r,"project")}l(Ai,"getProjectConfig");async function Wl(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}l(Wl,"calculateDuration");function Vg(){let r=new Lb;return r.get("/projects",async e=>{try{await er.mkdir(tr,{recursive:!0});let s=(await er.readdir(tr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Ai(o),a=await O.read(o),c=await pe.read(o),u=await Ue.read(o),d=await Ye.read(o),m=a?.currentTask,p=await Wl(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 n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Ai(t)),O.read(t),pe.read(t),Ue.read(t),Ye.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Wl(n.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(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=d)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=m)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{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(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await O.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await O.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await O.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:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await O.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await O.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await O.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([O.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===n);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 O.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(m=>typeof m=="string").slice(0,20):[],d=await Ue.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await er.mkdir(tr,{recursive:!0});let s=(await er.readdir(tr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await O.read(c),d=await pe.read(c),m=await Ue.read(c),p=await Ye.read(c);u?.currentTask&&a++,n+=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:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await er.mkdir(tr,{recursive:!0});let n=(await er.readdir(tr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=Ai(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let m=await O.read(d),p=Ai(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Wl(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:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}l(Vg,"createExtendedRoutes");import{streamSSE as Ub}from"hono/streaming";var Bg=3600*1e3,Hb=300*1e3,Wb=3e4;function Jg(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Bg&&t(i)},Hb),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Ub(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"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)}},Wb),p=setTimeout(()=>{t(a)},Bg);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(){n();for(let o of[...r.keys()])t(o)}}}l(Jg,"createSSEManager");function qg(r){let e=new Gb,t=Jg();e.use("*",Jb()),r.enableCors!==!1&&e.use("*",Vb({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",Bb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ee,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 s=Gg(r.projectId,r.projectPath);e.route("/api",s);let n=Vg();e.route("/api",n),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(js())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: ${js()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(qg,"createServer");var zg=3478;te();Il();var zb=50,sr=null,Nr=null,ge=null,ve=null;async function Kg(r){let e=_e.socket(),t=_e.pid(),s=_e.runDir();if(Oe.mkdirSync(s,{recursive:!0}),Oe.existsSync(t)){let i=parseInt(Oe.readFileSync(t,"utf-8").trim(),10);Zb(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Oe.unlinkSync(t)}Oe.existsSync(e)&&Oe.unlinkSync(e),sT();let n=eT(),o=null;if(n)try{o=Oe.statSync(n).mtimeMs}catch{}if(ve={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:kg,idleTimer:null,entryPath:n,entryMtime:o},ge=new Qn,sr=qb(i=>Kb(i)),sr.listen(e,()=>{Oe.chmodSync(e,384),Oe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Xg()}),sr.on("error",i=>{console.error("Daemon socket error:",i.message),nr(1)}),!r.noHttp)try{let i=process.cwd(),a=await j.getProjectId(i);if(a){let c=r.port||zg;Nr=qg({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Nr.start()}}catch{}if(process.on("SIGTERM",()=>nr(0)),process.on("SIGINT",()=>nr(0)),process.on("SIGHUP",()=>{ge=new Qn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Kg,"startDaemon");function Kb(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Sg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Bn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1579
|
-
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await
|
|
1654
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(vb,"getFilesModifiedSinceTaskStart");function Eb(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}l(Eb,"formatVariance");var ar=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new ir,this.planning=new tn,this.shipping=new Zn,this.analytics=new Un,this.performanceCmds=new zn,this.maintenance=new Wn,this.analysis=new rn,this.setupCmds=new Xn,this.updateCmds=new sr,this.velocityCmds=new nr,this.contextCmds=new on,this.obsidianCmds=new Vn,this.parallelCmds=new an,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}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(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}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 cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}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 enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}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,s){return this.workflow.logToMemory(e,t,s)}},KU=new ar;wi();var zg={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}},Kg=[{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,requiresLlm:!0,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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!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,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,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,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!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,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{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,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,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:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--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"]}];yi();is();Se();W();V();St();import{execSync as Ii}from"node:child_process";import bt from"node:fs/promises";import Pb from"node:os";import gs from"node:path";import Cb from"node:readline";import Ee from"chalk";var $i="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Wr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Yg(r){let e=0;try{let t=await bt.readdir(r,{withFileTypes:!0});for(let s of t){let n=gs.join(r,s.name);if(s.isDirectory())e+=await Yg(n);else try{let o=await bt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Yg,"getDirectorySize");function Xg(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(Xg,"formatSize");async function xb(r){try{return(await bt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(xb,"countDirectoryItems");function Rb(){let r={homebrew:!1,npm:!1};try{Ii("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ii("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(Rb,"detectInstallation");async function Ab(){let r=[],e=Gu(),t=R.getGlobalBasePath(),s=await C(t),n=s?await xb(gs.join(t,"projects")):0,o=s?await Yg(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=gs.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let A=await bt.readFile(i,"utf-8");c=A.includes($i)&&A.includes(Wr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=gs.join(e.claude.config,"prjct-statusline.sh"),p=await C(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,h=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let b=gs.join(e.gemini.config,"GEMINI.md"),w=await C(b),v=!1;if(w)try{let A=await bt.readFile(b,"utf-8");v=A.includes($i)&&A.includes(Wr)}catch{}return w&&v&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(Ab,"gatherUninstallItems");async function Db(r){try{let e=await bt.readFile(r,"utf-8");if(!e.includes($i)||!e.includes(Wr))return!1;let t=e.indexOf($i),s=e.indexOf(Wr)+Wr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1655
|
+
|
|
1656
|
+
`).trim(),!n||n.trim().length===0?await bt.unlink(r):await bt.writeFile(r,`${n}
|
|
1657
|
+
`,"utf-8"),!0}catch{return!1}}l(Db,"removePrjctSection");async function jb(){let r=Pb.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=gs.join(r,`.prjct-backup-${e}`);try{await bt.mkdir(t,{recursive:!0});let s=R.getGlobalBasePath();return await C(s)&&await Qg(s,gs.join(t,".prjct-cli")),t}catch{return null}}l(jb,"createBackup");async function Qg(r,e){await bt.mkdir(e,{recursive:!0});let t=await bt.readdir(r,{withFileTypes:!0});for(let s of t){let n=gs.join(r,s.name),o=gs.join(e,s.name);s.isDirectory()?await Qg(n,o):await bt.copyFile(n,o)}}l(Qg,"copyDirectory");async function Ib(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await Db(o.path)&&s.push(o.path):o.type==="directory"?(await bt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await bt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${y(i)}`)}try{await new os().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ii(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Ii("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${y(o)}`)}}return{deleted:s,errors:n}}l(Ib,"performUninstall");async function $b(r){let e=Cb.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l($b,"promptConfirmation");async function Mb(r={},e=process.cwd()){let t=await Ab(),s=Rb(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Ee.yellow(`
|
|
1658
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ee.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ee.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=R.getDisplayPath(c.path),d="";c.type==="section"?d=Ee.dim("(section only)"):c.size&&(d=Ee.dim(`(${Xg(c.size)})`)),console.log(` ${Ee.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ee.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Ee.cyan("Homebrew".padEnd(35))} ${Ee.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Ee.cyan("npm global".padEnd(35))} ${Ee.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ee.dim(` Total size: ${Xg(o)}`)),console.log("")),r.dryRun)return console.log(Ee.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Ee.blue("Creating backup..."));let c=await jb();c?(console.log(Ee.green(`Backup created: ${R.getDisplayPath(c)}`)),console.log("")):console.log(Ee.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ee.yellow('Type "uninstall" to confirm:')),!await $b("> ")))return console.log(Ee.yellow(`
|
|
1659
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ee.blue("Removing prjct..."));let{deleted:i,errors:a}=await Ib(t,s,r);if(console.log(""),i.length>0&&console.log(Ee.green(`Removed ${i.length} items`)),a.length>0){console.log(Ee.yellow(`
|
|
1660
|
+
${a.length} errors:`));for(let c of a)console.log(Ee.red(` - ${c}`))}return console.log(""),console.log(Ee.green("prjct has been uninstalled.")),console.log(Ee.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(Mb,"uninstall");var Mi=class extends he{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Mb(e,t)}};var Is=new ir,_i=new tn,_b=new Zn,Zg=new Un,Ob=new zn,$s=new Wn,cr=new rn,Gr=new Xn,Nb=new on,Lb=new nr,Fb=new Vn,Ql=new an,Ub=new Mi,Hb=new sr;function Wb(){for(let[r,e]of Object.entries(zg))U.registerCategory(r,e)}l(Wb,"registerCategories");function Gb(){if(U.has("work"))return;Wb();let r=l(e=>Kg.find(t=>t.name===e),"getMeta");U.registerMethod("task",Is,"now",r("task")),U.registerMethod("done",Is,"done",r("done")),U.registerMethod("next",Is,"next",r("next")),U.registerMethod("pause",Is,"pause",r("pause")),U.registerMethod("resume",Is,"resume",r("resume")),U.registerMethod("workflow",Is,"workflow",r("workflow")),U.registerMethod("tokens",Is,"tokens",r("tokens")),U.registerMethod("sessions",Is,"sessions",r("sessions")),U.registerMethod("init",_i,"init",r("init")),U.registerMethod("bug",_i,"bug",r("bug")),U.registerMethod("idea",_i,"idea",r("idea")),U.registerMethod("spec",_i,"spec",r("spec")),U.registerMethod("ship",_b,"ship",r("ship")),U.registerMethod("dash",Zg,"dash",r("dash")),U.registerMethod("help",Zg,"help",r("help")),U.registerMethod("perf",Ob,"perf",r("perf")),U.registerMethod("velocity",Lb,"velocity",r("velocity")),U.registerMethod("cleanup",$s,"cleanup",r("cleanup")),U.registerMethod("cleanup-projects",$s,"cleanupProjects",r("cleanup-projects")),U.registerMethod("design",$s,"design",r("design")),U.registerMethod("recover",$s,"recover",r("recover")),U.registerMethod("undo",$s,"undo",r("undo")),U.registerMethod("redo",$s,"redo",r("redo")),U.registerMethod("history",$s,"history",r("history")),U.registerMethod("enrich",$s,"enrich",r("enrich")),U.registerMethod("analyze",cr,"analyze",r("analyze")),U.registerMethod("sync",cr,"sync",r("sync")),U.registerMethod("stats",cr,"stats",r("stats")),U.registerMethod("status",cr,"status",r("status")),U.registerMethod("seal",cr,"seal",r("seal")),U.registerMethod("verify",cr,"verify",r("verify")),U.registerMethod("start",Gr,"start",r("start")),U.registerMethod("setup",Gr,"setup",r("setup")),U.registerMethod("login",Gr,"login",r("login")),U.registerMethod("logout",Gr,"logout",r("logout")),U.registerMethod("auth",Gr,"auth",r("auth")),U.registerMethod("uninstall",Ub,"uninstall",r("uninstall")),U.registerMethod("update",Hb,"update",r("update")),U.registerMethod("context",Nb,"context",r("context")),U.registerMethod("obsidian",Fb,"obsidian",r("obsidian")),U.registerMethod("parallel",Ql,"parallel",r("parallel")),U.registerMethod("worktree",Ql,"parallel",r("worktree")),U.registerMethod("conductor",Ql,"parallel",r("conductor"))}l(Gb,"registerAllCommands");Gb();xe();kr();$t();import{Hono as eT}from"hono";import{cors as tT}from"hono/cors";import{logger as sT}from"hono/logger";import{secureHeaders as nT}from"hono/secure-headers";Se();Z();vs();Nt();Ps();gt();W();rs();import Bb from"node:fs/promises";import Vb from"node:path";import{Hono as qb}from"hono";function Jb(r){return R.getGlobalProjectPath(r)}l(Jb,"getProjectDataPath");function ef(r,e){let t=new qb,s=Jb(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await le.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await We.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=P.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await qe.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),le.read(r),We.read(r),qe.read(r)]),u=P.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await _.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Vb.join(s,"context",`${o}.md`),c=await Bb.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return D(a)||G.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(ef,"createRoutes");Se();Z();vs();Nt();Ps();gt();import lr from"node:fs/promises";import zb from"node:path";import{Hono as Kb}from"hono";var Xb=R.getGlobalBasePath(),ur=zb.join(Xb,"projects");function Oi(r){return P.getDoc(r,"project")}l(Oi,"getProjectConfig");async function Zl(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}l(Zl,"calculateDuration");function tf(){let r=new Kb;return r.get("/projects",async e=>{try{await lr.mkdir(ur,{recursive:!0});let s=(await lr.readdir(ur,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=Oi(o),a=await _.read(o),c=await le.read(o),u=await We.read(o),d=await qe.read(o),m=a?.currentTask,p=await Zl(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 n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(Oi(t)),_.read(t),le.read(t),We.read(t),qe.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Zl(n.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(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=d)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=m)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{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(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([_.read(t),le.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===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(m=>typeof m=="string").slice(0,20):[],d=await We.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await lr.mkdir(ur,{recursive:!0});let s=(await lr.readdir(ur,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await _.read(c),d=await le.read(c),m=await We.read(c),p=await qe.read(c);u?.currentTask&&a++,n+=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:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await lr.mkdir(ur,{recursive:!0});let n=(await lr.readdir(ur,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=Oi(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let m=await _.read(d),p=Oi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Zl(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:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}l(tf,"createExtendedRoutes");import{streamSSE as Yb}from"hono/streaming";var sf=3600*1e3,Qb=300*1e3,Zb=3e4;function nf(){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 s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>sf&&t(i)},Qb),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Yb(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"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)}},Zb),p=setTimeout(()=>{t(a)},sf);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(){n();for(let o of[...r.keys()])t(o)}}}l(nf,"createSSEManager");function rf(r){let e=new eT,t=nf();e.use("*",nT()),r.enableCors!==!1&&e.use("*",tT({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",sT()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ce,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 s=ef(r.projectId,r.projectPath);e.route("/api",s);let n=tf();e.route("/api",n),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(Fs())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: ${Fs()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(rf,"createServer");var of=3478;Z();Wl();var oT=50,dr=null,Br=null,ye=null,Pe=null;async function af(r){let e=Ne.socket(),t=Ne.pid(),s=Ne.runDir();if(Le.mkdirSync(s,{recursive:!0}),Le.existsSync(t)){let i=parseInt(Le.readFileSync(t,"utf-8").trim(),10);uT(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Le.unlinkSync(t)}Le.existsSync(e)&&Le.unlinkSync(e),pT();let n=dT(),o=null;if(n)try{o=Le.statSync(n).mtimeMs}catch{}if(Pe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Dg,idleTimer:null,entryPath:n,entryMtime:o},ye=new ar,dr=rT(i=>iT(i)),dr.listen(e,()=>{Le.chmodSync(e,384),Le.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),cf()}),dr.on("error",i=>{console.error("Daemon socket error:",i.message),mr(1)}),!r.noHttp)try{let i=process.cwd(),a=await I.getProjectId(i);if(a){let c=r.port||of;Br=rf({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Br.start()}}catch{}if(process.on("SIGTERM",()=>mr(0)),process.on("SIGINT",()=>mr(0)),process.on("SIGHUP",()=>{ye=new ar,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(af,"startDaemon");function iT(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>jg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(er(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1661
|
+
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await aT(o);r.write(er(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(er(i))}}}),r.on("error",()=>{})}l(iT,"handleConnection");async function aT(r){if(!Pe||!ye)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(cf(),Pe.commandsServed++,Pe.lastActivity=Date.now(),Pe.commandsServed%oT===0&&M.checkpointAll(),lf()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),mr(0)},200)),r.command==="daemon")return lT(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await cT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1580
1662
|
`)||o.message||void 0,stderr:t.join(`
|
|
1581
|
-
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(
|
|
1663
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(aT,"handleRequest");async function cT(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return ye.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return ye.status(r.cwd,{json:t.json===!0,md:s});case"stats":return ye.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ye.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return ye.seal(r.cwd,{json:t.json===!0});case"rollback":return ye.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return ye.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ye.task(e,r.cwd,{md:s});case"done":return ye.done(r.cwd,{md:s});case"next":return ye.next(r.cwd,{md:s});case"pause":return ye.pause(e||"",r.cwd,{md:s});case"resume":return ye.resume(e,r.cwd,{md:s});case"bug":return ye.bug(e||"",r.cwd,{md:s});case"idea":return ye.idea(e||"",r.cwd,{md:s});case"ship":return ye.ship(e,r.cwd,{md:s});case"dash":return ye.dash(e||"default",r.cwd,{md:s});case"workflow":return ye.workflowPrefs(e,r.cwd,{md:s});case"sessions":return ye.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ye.design(e||"",t,r.cwd);case"analysis-payload":return ye.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ye.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return ye.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return ye.analyze(t,r.cwd);case"cleanup":return ye.cleanup(t,r.cwd);case"cleanup-projects":return ye.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return U.execute(r.command,e,r.cwd)}}l(cT,"executeCommand");function lT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ne.socket(),uptime:Pe?Date.now()-Pe.startedAt:0,commandsServed:Pe?.commandsServed??0,lastActivity:Pe?new Date(Pe.lastActivity).toISOString():null,registeredCommands:U.list().length,stale:lf()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>mr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(lT,"handleDaemonCommand");function cf(){Pe&&(Pe.idleTimer&&clearTimeout(Pe.idleTimer),Pe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Pe.idleTimeoutMs/1e3/60} minutes, shutting down`),mr(0)},Pe.idleTimeoutMs),Pe.idleTimer.unref&&Pe.idleTimer.unref())}l(cf,"resetIdleTimer");function mr(r){console.log("Daemon shutting down..."),Pe?.idleTimer&&clearTimeout(Pe.idleTimer),Br&&(Br.stop(),Br=null),dr&&(dr.close(),dr=null),M.close();let e=Ne.socket(),t=Ne.pid();try{Le.existsSync(e)&&Le.unlinkSync(e)}catch{}try{Le.existsSync(t)&&Le.unlinkSync(t)}catch{}process.exit(r)}l(mr,"shutdown");function uT(r){try{return process.kill(r,0),!0}catch{return!1}}l(uT,"isProcessRunning");function dT(){let r=Tt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Le.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Le.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Le.existsSync(n))return n;let s=process.argv[1];return s&&Le.existsSync(s)?s:null}l(dT,"resolveEntryPath");var mT=1024*1024;function pT(){let r=Ne.log();try{if(Le.statSync(r).size>mT){let t=`${r}.1`;try{Le.unlinkSync(t)}catch{}Le.renameSync(r,t)}}catch{}}l(pT,"rotateLog");function lf(){if(!Pe?.entryPath||Pe.entryMtime===null)return!1;try{return Le.statSync(Pe.entryPath).mtimeMs!==Pe.entryMtime}catch{return!1}}l(lf,"isCodeStale");var eu=process.argv.slice(2),gT=parseInt(eu.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,fT=eu.includes("--no-http"),hT=eu.includes("--foreground");af({port:gT,noHttp:fT,foreground:hT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|