prjct-cli 1.52.3 → 1.54.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 +21 -0
- package/README.md +180 -166
- package/dist/bin/prjct-core.mjs +304 -295
- package/dist/daemon/entry.mjs +328 -319
- package/dist/mcp/server.mjs +145 -141
- package/package.json +2 -2
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,9 +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 x(r){try{return await ht.access(r),!0}catch(e){if(A(e))return!1;throw e}}async function as(r){try{return(await ht.stat(r)).isDirectory()}catch(e){if(A(e))return!1;throw e}}async function We(r){await ht.mkdir(r,{recursive:!0})}async function cs(r,e={}){try{let s=await ht.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(A(t))return[];throw t}}var J=v(()=>{"use strict";Ei();Nl();H();l(sn,"walkDir");l(nn,"batchProcess");l(Ee,"readJson");l(ce,"writeJson");l(Ae,"readFile");l(yt,"writeFile");l(Ll,"appendLine");l(x,"fileExists");l(as,"dirExists");l(We,"ensureDir");l(cs,"listFiles")});var Ri={};Bt(Ri,{PACKAGE_ROOT:()=>at,VERSION:()=>ve,compareVersions:()=>Fl,getPackageInfo:()=>Wg,getPackageRoot:()=>xi,getVersion:()=>vs,isCompatible:()=>Vg,needsMigration:()=>Bg});import Pi from"node:fs";import Nr from"node:path";function xi(){if(sr)return sr;let r=__dirname;for(let e=0;e<5;e++){let t=Nr.join(r,"package.json");if(Pi.existsSync(t))try{if(JSON.parse(Pi.readFileSync(t,"utf-8")).name==="prjct-cli")return sr=r,r}catch{}r=Nr.dirname(r)}return sr=Nr.join(__dirname,"..","..",".."),sr}function vs(){if(Or)return Or;try{let r=Nr.join(xi(),"package.json"),e=JSON.parse(Pi.readFileSync(r,"utf-8"));return Or=e.version,Ci=e,Or}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function Wg(){return Ci||vs(),Ci}function Fl(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 Vg(r){let e=vs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Bg(r,e=null){let t=e||vs();return Fl(r,t)<0}var Or,Ci,sr,ve,at,Pt=v(()=>{"use strict";H();Or=null,Ci=null,sr=null;l(xi,"getPackageRoot");l(vs,"getVersion");l(Wg,"getPackageInfo");l(Fl,"compareVersions");l(Vg,"isCompatible");l(Bg,"needsMigration");ve=vs(),at=xi()});var Hl={};Bt(Hl,{execAsync:()=>N,execFileAsync:()=>Es});import{exec as Jg,execFile as zg}from"node:child_process";import{promisify as Ul}from"node:util";var N,Es,Ue=v(()=>{"use strict";N=Ul(Jg),Es=Ul(zg)});async function Lr(r){try{let{stdout:e}=await N(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function qg(){let r=await Lr("gh api user --jq .login");return r.success&&r.output||(r=await Lr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kg(){let r=await Lr("git config user.name");return r.success&&r.output?r.output:null}async function Xg(){let r=await Lr("git config user.email");return r.success&&r.output?r.output:null}async function rn(){let[r,e,t]=await Promise.all([qg(),Kg(),Xg()]);return{github:r,email:t,name:e||r||"Unknown"}}var Fr=v(()=>{"use strict";Ue();l(Lr,"execCommand");l(qg,"detectGitHubUsername");l(Kg,"detectGitName");l(Xg,"detectGitEmail");l(rn,"detect")});var nr=v(()=>{"use strict"});import{z as Ht}from"zod";function Gl(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 vT,ET,PT,on,CT,Ur=v(()=>{"use strict";vT=Ht.enum(["opus","sonnet","haiku"]),ET=Ht.enum(["2.5-pro","2.5-flash","2.0-flash"]),PT=Ht.string().min(1),on=Ht.object({provider:Ht.string(),model:Ht.string(),cliVersion:Ht.string().optional(),recordedAt:Ht.string()}),CT=Ht.object({preferredModel:Ht.string().optional(),lastAnalysisModel:on.optional()});l(Gl,"compareSemver")});function ls(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var an,Ps=v(()=>{"use strict";l(ls,"isExpired");an=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 Yg from"node:fs/promises";import Qg from"node:os";import Wl from"node:path";async function Bl(){try{let r=await Yg.readFile(Vl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||ls(e.timestamp,ef)?null:e.detection}catch{return null}}async function Jl(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(Vl,e)}var Zg,Vl,ef,zl=v(()=>{"use strict";Ps();J();Zg=Wl.join(Qg.homedir(),".prjct-cli","cache"),Vl=Wl.join(Zg,"providers.json"),ef=600*1e3;l(Bl,"readProviderCache");l(Jl,"writeProviderCache")});var Ct={};Bt(Ct,{AntigravityProvider:()=>ji,ClaudeProvider:()=>Hr,CodexProvider:()=>Ii,CursorProvider:()=>Kl,GeminiProvider:()=>Di,Providers:()=>ct,WindsurfProvider:()=>Xl,detectAllProviders:()=>rr,detectAntigravity:()=>Vr,detectCodex:()=>Cs,detectCursorProject:()=>Zl,detectProvider:()=>Gr,detectWindsurfProject:()=>eu,getActiveProvider:()=>rf,getCapabilities:()=>sf,getCommandsDir:()=>mf,getGlobalContextPath:()=>lf,getGlobalSettingsPath:()=>uf,getProjectCommandsPath:()=>pf,getProviderBranding:()=>Wr,getSkillsPath:()=>df,hasProviderConfig:()=>of,needsCursorRouterRegeneration:()=>af,needsWindsurfRouterRegeneration:()=>cf,selectProvider:()=>$i,validateCliVersion:()=>Ql});import us from"node:os";import He from"node:path";function sf(r,e){return{...tf[r],...e}}async function Yl(r){try{let{stdout:e}=await N(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function nf(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 Gr(r){let e=ct[r];if(!e.cliCommand)return{installed:!1};let t=await Yl(e.cliCommand);if(!t)return{installed:!1};let s=await nf(e.cliCommand),n=Ql(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Ql(r,e){let t=ct[r];return!t.minCliVersion||!e?null:Gl(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 rr(r=!1){if(!r){let i=await Bl();if(i)return i}let[e,t,s]=await Promise.all([Gr("claude"),Gr("gemini"),Cs()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await Jl(o).catch(()=>{}),o}async function rf(r){if(r&&ct[r])return ct[r];let e=await rr();return e.claude.installed&&!e.gemini.installed?Hr:e.gemini.installed&&!e.claude.installed?Di:Hr}async function of(r){let e=ct[r];return e.configDir?x(e.configDir):!1}function Wr(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 Zl(r){let e=He.join(r,".cursor"),t=He.join(e,"rules"),s=He.join(t,"prjct.mdc"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function af(r){let e=await Zl(r);return e.detected&&!e.routerInstalled}async function eu(r){let e=He.join(r,".windsurf"),t=He.join(e,"rules"),s=He.join(t,"prjct.md"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function cf(r){let e=await eu(r);return e.detected&&!e.routerInstalled}async function Vr(){let r=ji.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=He.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([x(r),x(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Cs(){let r=Ii.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Yl("codex"),t=He.join(r,"skills","prjct","SKILL.md"),s=await x(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function lf(r){let e=ct[r];return e.configDir?He.join(e.configDir,e.contextFile):null}function uf(r){let e=ct[r];return!e.configDir||!e.settingsFile?null:He.join(e.configDir,e.settingsFile)}function df(r){return ct[r].skillsDir}function mf(r){return ct[r].commandsDir}function pf(r,e){let t=ct[r];return He.join(e,t.commandsDir)}async function $i(){let r=await rr(),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 tf,Hr,Di,ji,Kl,Xl,Ii,ct,lt=v(()=>{"use strict";nr();Ur();Ue();J();zl();tf={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");Hr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:He.join(us.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:He.join(us.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"},Di={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:He.join(us.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:He.join(us.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"},ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:He.join(us.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:He.join(us.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"},Kl={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"},Xl={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ii={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:He.join(us.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:He.join(us.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"},ct={claude:Hr,gemini:Di,cursor:Kl,antigravity:ji,windsurf:Xl,codex:Ii};l(Yl,"whichCommand");l(nf,"getCliVersion");l(Gr,"detectProvider");l(Ql,"validateCliVersion");l(rr,"detectAllProviders");l(rf,"getActiveProvider");l(of,"hasProviderConfig");l(Wr,"getProviderBranding");l(Zl,"detectCursorProject");l(af,"needsCursorRouterRegeneration");l(eu,"detectWindsurfProject");l(cf,"needsWindsurfRouterRegeneration");l(Vr,"detectAntigravity");l(Cs,"detectCodex");l(lf,"getGlobalContextPath");l(uf,"getGlobalSettingsPath");l(df,"getSkillsPath");l(mf,"getCommandsDir");l(pf,"getProjectCommandsPath");l($i,"selectProvider")});import gf from"node:crypto";import Gt from"node:fs/promises";import Mi from"node:os";import B from"node:path";import{globSync as ff}from"glob";var _i,hf,R,fe=v(()=>{"use strict";z();J();_i=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?B.resolve(e):B.join(Mi.homedir(),".prjct-cli"),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=B.resolve(e),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}generateProjectId(e){return gf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return B.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return B.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return B.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return B.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await as(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await We(this.globalBaseDir),await We(this.globalProjectsDir),await We(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 We(B.join(t,n));return await We(B.join(t,"planning","tasks")),await We(B.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Al(t);return B.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 We(s),s}async listSessions(e,t=null,s=null){let n=B.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Gt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=B.join(n,a.name),u=await Gt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=B.join(c,d.name),m=await Gt.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:B.join(p,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 B.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Gt.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 as(t)}getDisplayPath(e){let t=Mi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return B.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return B.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return B.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return B.join(this.globalBaseDir,".running")}getDocsPath(){return B.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),ot(Ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),ot(Ct)).getActiveProvider();return(lt(),ot(Ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return B.join(Mi.homedir(),".claude")}getClaudeSettingsPath(){return B.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return B.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return B.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=B.join(e,n.file);if(await x(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=B.join(e,"package.json");if(await x(n))try{let o=await Gt.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 Gt.readFile(B.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=
|
|
8
|
+
var Lr=Object.defineProperty;var Zg=Object.getOwnPropertyDescriptor;var ef=Object.getOwnPropertyNames;var tf=Object.prototype.hasOwnProperty;var l=(r,e)=>Lr(r,"name",{value:e,configurable:!0}),kt=(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 v=(r,e)=>()=>(r&&(e=r(r=0)),e);var Jt=(r,e)=>{for(var t in e)Lr(r,t,{get:e[t],enumerable:!0})},sf=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ef(e))!tf.call(r,n)&&n!==t&&Lr(r,n,{get:()=>e[n],enumerable:!(s=Zg(e,n))||s.enumerable});return r};var at=r=>sf(Lr({},"__esModule",{value:!0}),r);import{z as be}from"zod";function nf(r){return r instanceof nn}function ie(r){return nf(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var rn,cT,lT,uT,dT,mT,pT,nn,Fr,Ur,rr,Yt=v(()=>{"use strict";rn={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}},cT=rn.create("FileError",be.object({path:be.string(),operation:be.enum(["read","write","delete","create","copy"]),reason:be.string().optional()})),lT=rn.create("ValidationError",be.object({field:be.string(),expected:be.string(),received:be.string().optional(),message:be.string().optional()})),uT=rn.create("PermissionError",be.object({action:be.string(),resource:be.string(),reason:be.string().optional()})),dT=rn.create("TaskError",be.object({taskId:be.string().optional(),operation:be.enum(["create","update","complete","pause","resume","delete"]),reason:be.string()})),mT=rn.create("SessionError",be.object({sessionId:be.string().optional(),reason:be.string()})),pT=rn.create("SyncError",be.object({projectId:be.string().optional(),operation:be.enum(["push","pull","auth","connect"]),reason:be.string()})),nn=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)}},Fr=class r extends nn{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")}},Ur=class r extends nn{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")}},rr=class r extends nn{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(nf,"isPrjctError");l(ie,"getErrorMessage")});function rf(r){return r instanceof Error&&"code"in r}function D(r){return rf(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var U=v(()=>{"use strict";l(rf,"isNodeError");l(D,"isNotFoundError");l(y,"getErrorMessage")});import{formatDistanceToNowStrict as kT}from"date-fns";function Vl(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 Bl(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 ds(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ct(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 Qt(r,e=new Date){let t=e.getTime()-r.getTime();return ct(t)}function on(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 St(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 q=v(()=>{"use strict";l(Vl,"formatDate");l(Bl,"getYearMonthDay");l(S,"getTimestamp");l(ds,"getDaysAgo");l(ct,"formatDuration");l(Qt,"calculateDuration");l(on,"parseVarianceMinutes");l(St,"parseDurationMinutes")});var Jl,ql,zl,Ni=v(()=>{"use strict";Jl=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"]),ql=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zl=/(?:import|from)\s+['"]([^'"]+)['"]/g});import Yl from"node:fs/promises";async function Ql(r,e){let t;try{t=await Yl.readFile(r,"utf-8")}catch(o){if(D(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Kl(r,t),Xl(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Kl(r,t),Xl(r,of(n.error)),null)}async function Kl(r,e){let t=`${r}.backup`;try{await Yl.writeFile(t,e,"utf-8")}catch{}}function Xl(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 of(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zl=v(()=>{"use strict";U();l(Ql,"safeRead");l(Kl,"createBackup");l(Xl,"logCorruption");l(of,"formatZodError")});import bt from"node:fs/promises";import or from"node:path";async function an(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 bt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Jl.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=or.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(or.relative(r,d))}}return l(o,"walk"),await o(r),t}async function cn(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 Pe(r,e=null,t){if(t)return await Ql(r,t)??e;try{let s=await bt.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(D(s))return e;throw s}}async function le(r,e,t=2){let s=or.dirname(r);await bt.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await bt.writeFile(r,n,"utf-8")}async function Ie(r,e=""){try{return await bt.readFile(r,"utf-8")}catch(t){if(D(t))return e;throw t}}async function Tt(r,e){let t=or.dirname(r);await bt.mkdir(t,{recursive:!0}),await bt.writeFile(r,e,"utf-8")}async function eu(r,e){let t=or.dirname(r);await bt.mkdir(t,{recursive:!0}),await bt.appendFile(r,`${e}
|
|
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=V.join(e,"package.json"),i=await zt.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=V.join(e,"lerna.json");if(await C(c)){let u=await zt.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=V.join(e,"package.json"),i=await zt.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=jf(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),u=V.join(c,"package.json");if(await C(u))try{let d=await zt.readFile(u,"utf-8"),m=JSON.parse(d),p=V.join(c,"PRJCT.md");s.push({name:m.name||V.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=V.resolve(e);for(let n of t.packages){let o=V.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=V.resolve(e),s=V.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=V.dirname(t)}return null}},$f=new zi,A=$f});var Xr={};Jt(Xr,{default:()=>Ot,worktreeService:()=>wu});import Ki from"node:fs/promises";import Kt from"node:path";var yu,Xi,wu,Ot,lr=v(()=>{"use strict";Le();B();yu=".worktrees",Xi=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=Kt.join(n,yu,t),i=s.branch||`feat/${t}`;await Ki.mkdir(Kt.join(n,yu),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await _(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await _("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 _("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await _(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await _(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await _("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await _("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await _("git rev-parse --git-dir",{cwd:e}),n=Kt.resolve(e,t.trim()),o=Kt.resolve(e,s.trim());if(n!==o){let{stdout:i}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await _("git rev-parse HEAD",{cwd:e}),{stdout:c}=await _("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=Kt.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 _("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 _("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=Kt.join(t,".env");await C(s)&&await Ki.copyFile(s,Kt.join(e,".env"));let n=Kt.join(t,".prjct"),o=Kt.join(e,".prjct");await C(n)&&!await C(o)&&await Ki.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await _("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
|
+
|
|
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":Kt.basename(a)})}}return s}},wu=new Xi,Ot=wu});import Yi from"node:fs/promises";import Mf from"node:path";import*as Yr from"jsonc-parser";function ku(r){let e=[],t=Yr.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}: ${Yr.printParseErrorCode(s.error)}`)}return t}var Qi,_f,j,Ce=v(()=>{"use strict";Yt();U();q();B();It();Vr();ye();l(ku,"parseJsonc");Qi=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await Yi.readFile(t,"utf-8");return ku(s)}catch(t){return D(t)||console.warn(`Warning: Could not read config at ${e}: ${ie(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await Yi.readFile(t,"utf-8");return ku(s)}catch(t){return D(t)||console.warn(`Warning: Could not read global config for ${e}: ${ie(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=S();t={projectId:e,authors:[],version:Ee,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),n=A.getGlobalProjectPath(s),o=A.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:Ee,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 A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=A.getGlobalProjectPath(n.projectId);try{return(await Yi.readdir(Mf.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(()=>(lr(),Xr));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 A.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 ln(),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=A.generateProjectId(e);return{projectId:s,dataPath:A.getDisplayPath(A.getGlobalProjectPath(s))}}},_f=new Qi,j=_f});import Qr from"node:fs/promises";var Zi,Of,Is,Zr=v(()=>{"use strict";Ce();ye();U();Rs();B();Zi=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new dn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await j.getProjectId(e),n=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.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 Qr.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([Qr.readFile(d,"utf-8"),Qr.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 Qr.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()}},Of=new Zi,Is=Of});function Su(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function ea(){if(Su()==="bun")return!0;try{let{execSync:r}=kt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function js(){return Su()==="bun"}var ur=v(()=>{"use strict";l(Su,"detectRuntime");l(ea,"isBunAvailable");l(js,"isBun")});var to={};Jt(to,{PrjctDatabase:()=>eo,default:()=>$,prjctDb:()=>P});import ta from"node:fs";import bu from"node:path";function Nf(r){if(js()){let{Database:n}=kt("bun:sqlite");return new n(r,{create:!0})}let e=kt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Lf,Ff,eo,P,$,te=v(()=>{"use strict";ye();ur();l(Nf,"openDatabase");Lf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
11
15
|
-- =======================================================================
|
|
12
16
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
13
17
|
-- =======================================================================
|
|
@@ -457,47 +461,47 @@ var $r=Object.defineProperty;var Og=Object.getOwnPropertyDescriptor;var Ng=Objec
|
|
|
457
461
|
|
|
458
462
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
|
|
459
463
|
CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
|
|
460
|
-
`);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")}],Ff=3,eo=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return bu.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Ff&&this.evictLru();let s=this.getDbPath(e),n=bu.dirname(s);ta.existsSync(n)||ta.mkdirSync(n,{recursive:!0});let o=Nf(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 ta.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(`
|
|
461
465
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
462
466
|
version INTEGER PRIMARY KEY,
|
|
463
467
|
name TEXT NOT NULL,
|
|
464
468
|
applied_at TEXT NOT NULL
|
|
465
469
|
)
|
|
466
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of
|
|
467
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let
|
|
470
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Lf)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 eo,$=P});function so(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Fe,dr=v(()=>{"use strict";Fe={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(so,"calculateConfidence")});var no,ro,oo,sa=v(()=>{"use strict";te();dr();q();no=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=$.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();$.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}},ro=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()}},oo=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:S(),...t,type:t.type};$.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return $.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var io,Tu=v(()=>{"use strict";te();dr();q();sa();io=class r extends no{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=so(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=so(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:so(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=$.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return $.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import Uf from"node:crypto";import{homedir as Hf}from"node:os";import{join as Wf}from"node:path";function J(){return Uf.randomUUID()}var dE,vt=v(()=>{"use strict";l(J,"generateUUID");dE=Wf(Hf(),".prjct-cli","projects")});import{createHash as vu}from"node:crypto";function mr(r){return vu("sha256").update(r).digest("hex")}function $s(r){return mr(r).slice(0,16)}function Eu(r){return vu("md5").update(r).digest("hex")}var Ms=v(()=>{"use strict";l(mr,"sha256");l($s,"sha256Short");l(Eu,"md5")});function Zt(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 mn,na=v(()=>{"use strict";vt();te();dr();q();Ms();l(Zt,"rowToMemory");mn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Fe));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=$s(s),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=$.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return $.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=J();return $.run(e,`INSERT INTO memories
|
|
468
472
|
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
469
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
470
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,
|
|
471
|
-
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=$.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?$s(i):n.content_hash;return $.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 $.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?($.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 $.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
|
|
475
|
+
AND (${a}) ORDER BY updated_at DESC`,...c).map(Zt)}async searchMemories(e,t,s=20,n=0){try{return $.query(e,`SELECT m.* FROM memories m
|
|
472
476
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
473
477
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
474
|
-
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(Zt)}catch{let o=`%${t}%`;return $.query(e,`SELECT * FROM memories
|
|
475
479
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
476
480
|
AND (title LIKE ? OR content LIKE ?)
|
|
477
|
-
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(Zt)}}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 $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Zt);let o=n.join(" ");try{return $.query(e,`SELECT m.* FROM memories m
|
|
478
482
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
479
483
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
480
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(
|
|
481
|
-
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(Zt)}catch{return $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Zt)}}async getRelevantMemoriesWithMetrics(e,t){let n=$.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:[Fe.COMMIT_STYLE],branch_naming:[Fe.BRANCH_NAMING],test_before_ship:[Fe.TEST_BEHAVIOR,Fe.SHIP_WORKFLOW],preferred_agent:[Fe.AGENT_PREFERENCE],code_style:[Fe.CODE_STYLE],verbosity:[Fe.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 $.query(e,`SELECT m.* FROM memories m
|
|
482
486
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
483
487
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
484
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(
|
|
488
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Zt)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=$.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
485
489
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
486
|
-
GROUP BY title HAVING cnt > 1`,e),n=
|
|
490
|
+
GROUP BY title HAVING cnt > 1`,e),n=S();for(let o of s){let i=$.query(e,`SELECT * FROM memories
|
|
487
491
|
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
488
|
-
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(
|
|
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(`
|
|
489
493
|
|
|
490
494
|
---
|
|
491
495
|
|
|
492
|
-
`),d=new Set;for(let
|
|
493
|
-
`).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
|
|
494
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
495
|
-
`).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)&&$.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)$.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=$.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Zt(s):null}async getAllMemories(e){return $.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Zt)}async getMemoryStats(e){let t=$.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 ra,Gf,nt,ao=v(()=>{"use strict";sa();Tu();na();ra=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new mn,this._patternStore=new io,this._historyStore=new oo,this._sessionStore=new ro}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()}},Gf=new ra,nt=Gf});import $t from"node:fs/promises";import Nt from"node:path";var oa,Vf,Be,Pu=v(()=>{"use strict";U();Le();B();oa=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Nt.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=Nt.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=Nt.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=Nt.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=Nt.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=Nt.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=Nt.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=Nt.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=Nt.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 _('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 _(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await _("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await _('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await _('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 _('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(Nt.join(this.projectPath,e))}async readFile(e){try{let t=Nt.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 _(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
498
|
+
`).filter(Boolean)}catch{return[]}}},Vf=new oa,Be=Vf});import aa from"node:fs";import Bf from"node:fs/promises";import co from"node:path";function ca(){if(Cu)return ia;Cu=!0;let r=co.join(lt,"dist","templates.json");try{let e=aa.readFileSync(r,"utf-8");return ia=JSON.parse(e),ia}catch{return null}}function qf(r){let e=_s.indexOf(r);e>-1&&_s.splice(e,1),_s.push(r)}function zf(){for(;pn.size>=Jf&&_s.length>0;){let r=_s.shift();r&&pn.delete(r)}}function xu(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 Au(r){if(pn.has(r))return qf(r),pn.get(r);let e,t=ca();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=co.join(lt,"templates","commands",`${r}.md`);try{e=await Bf.readFile(n,"utf-8")}catch{throw Ur.notFound(r)}}let s=xu(e);return zf(),pn.set(r,s),_s.push(r),s}async function Kf(r){return(await Au(r)).frontmatter["allowed-tools"]||[]}function Xf(){pn.clear(),_s.length=0}function gt(r){let e=ca();if(e?.[r])return e[r];let t=co.join(lt,"templates",r);try{return aa.readFileSync(t,"utf-8")}catch{return null}}function gn(r){let e=ca();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=co.join(lt,"templates",r);try{return aa.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Jf,pn,_s,ia,Cu,Yf,Ru,Os=v(()=>{"use strict";Yt();It();Jf=50,pn=new Map,_s=[],ia=null,Cu=!1;l(ca,"loadBundle");l(qf,"updateLruOrder");l(zf,"evictLru");l(xu,"parseFrontmatter");l(Au,"load");l(Kf,"getAllowedTools");l(Xf,"clearCache");l(gt,"getTemplateContent");l(gn,"listTemplates");Yf={load:Au,parseFrontmatter:xu,getAllowedTools:Kf,clearCache:Xf,getTemplateContent:gt,listTemplates:gn},Ru=Yf});function Zf(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Qf.has(r)||r.includes("prjct"))return{level:fn.debug,name:"debug"};let e=fn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function lo(r,e,t){return Du>=r?(...s)=>console[t](e,...s):th}var fn,Qf,Du,eh,th,sh,H,es=v(()=>{"use strict";fn={error:0,warn:1,info:2,debug:3},Qf=new Set(["1","true","*"]);l(Zf,"getLogLevel");({level:Du,name:eh}=Zf()),th=l(()=>{},"noop");l(lo,"createLogMethod");sh={error:lo(fn.error,"[prjct:error]","error"),warn:lo(fn.warn,"[prjct:warn]","warn"),info:lo(fn.info,"[prjct:info]","log"),debug:lo(fn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Du>=0,"isEnabled"),level:l(()=>eh,"level")},H=sh});function uo(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
|
|
496
500
|
|
|
497
|
-
${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 la=v(()=>{"use strict";Os();U();B();es();It();l(uo,"mergeWithMarkers")});import Xe from"node:fs/promises";import mo from"node:os";import Se from"node:path";async function nh(){try{let r=Se.join(mo.homedir(),".prjct-cli","docs");await Xe.mkdir(r,{recursive:!0});let e=gn("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=gt(n);if(o){let i=Se.basename(n);await Xe.writeFile(Se.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(It(),at(Hi)),s=Se.join(t,"templates/global/docs");try{let n=await Xe.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Se.join(s,o),a=Se.join(r,o),c=await Xe.readFile(i,"utf-8");await Xe.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function rh(){let r=(dt(),at(jt)),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 Xe.mkdir(e.configDir,{recursive:!0});let n=Se.join(e.configDir,e.contextFile),o=Iu;if(t!=="claude"){let g=gt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(It(),at(Hi)),b=Se.join(h,"templates","global",e.contextFile);try{o=await Xe.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Iu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Xe.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,`
|
|
498
502
|
|
|
499
503
|
`).trim()}
|
|
500
|
-
`}let
|
|
504
|
+
`}let p=uo(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Xe.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:y(n),action:"failed"}}}function ju(){let r=mo.homedir();return{claude:{commands:Se.join(r,".claude","commands"),config:Se.join(r,".claude"),router:Se.join(r,".claude","commands","p.md")},gemini:{commands:Se.join(r,".gemini","commands"),config:Se.join(r,".gemini"),router:Se.join(r,".gemini","commands","p.toml")}}}var Iu,ts,oh,xe,ss=v(()=>{"use strict";Os();U();B();la();Iu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
|
|
501
505
|
# p/ \u2014 Context layer for AI agents
|
|
502
506
|
|
|
503
507
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -513,22 +517,22 @@ Data:
|
|
|
513
517
|
|
|
514
518
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
515
519
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
516
|
-
`;l(
|
|
520
|
+
`;l(nh,"installDocs");l(rh,"installGlobalConfig");ts=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=mo.homedir()}async ensureInit(){if(this._initialized)return;let t=await(dt(),at(jt)).getActiveProvider();this.commandsPath=Se.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(dt(),at(jt)).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=Se.join(this.commandsPath,t);try{await Xe.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=Se.join(this.commandsPath,t);try{await Xe.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Se.join(this.commandsPath,"p");try{if((await Xe.stat(e).catch(()=>null))?.isDirectory())return await Xe.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return rh()}async cleanupAllLegacy(){let e=mo.homedir(),t=[],s=[Se.join(e,".claude","commands","p.md"),Se.join(e,".claude","commands","p.toml"),Se.join(e,".gemini","commands","p.md"),Se.join(e,".gemini","commands","p.toml")];for(let i of s)try{await Xe.unlink(i),t.push(i)}catch{}let n=[Se.join(e,".claude","commands","p"),Se.join(e,".gemini","commands","p")];for(let i of n)try{(await Xe.stat(i).catch(()=>null))?.isDirectory()&&(await Xe.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Se.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Xe.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return nh()}};l(ju,"getProviderPaths");oh=new ts,xe=oh});import{z as je}from"zod";function Ou(r,e="default"){let t=$u[e]||$u.default;return r/1e3*t}function po(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var ih,ah,Mu,_u,$u,go=v(()=>{"use strict";ih=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),ah=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),Mu=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(ah),dailyStats:je.array(ih),firstSync:je.string(),lastUpdated:je.string()}),_u={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},$u={"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(Ou,"estimateCostSaved");l(po,"formatCost")});function Nu(r,e){let t=[];pr("Languages",r.languages,e.languages,t),pr("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)"}),pr("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);pr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);pr("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 ua(r){if(!r.hasChanges)return`## Analysis Diff
|
|
517
521
|
|
|
518
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(`
|
|
519
|
-
`)}function
|
|
520
|
-
`)}function cr(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 Xi=v(()=>{"use strict";l(ku,"generateAnalysisDiff");l(Ki,"formatAnalysisDiffMd");l(Su,"formatAnalysisDiffText");l(cr,"diffStringArray")});var Yi,Qi,bu,lr=v(()=>{"use strict";Yi=[1,2,3,5,8,13,21],Qi={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}},bu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Bf from"node:fs/promises";import Jf from"node:path";function mn(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 zf(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...mn(m));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 m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(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 m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...mn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...mn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Eu.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function qf(r){return r.split(/\s+/).flatMap(e=>mn(e)).filter(e=>e.length>1&&!Eu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kf(r){let e=await sn(r),t={},s={},n=0,o=await nn(e,50,async a=>{try{let c=await Bf.readFile(Jf.join(r,a),"utf-8"),u=zf(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,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Xf(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Yf(r,e){let t=qf(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=Xf(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),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Qf(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]))};I.setDoc(r,Pu,t)}function co(r){let e=I.getDoc(r,Pu);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 Cu(r,e){let t=await Kf(r);return Qf(e,t),t}function xu(r,e,t=15){let s=co(r);return s?Yf(e,s).slice(0,t):[]}var Eu,Pu,Zi=v(()=>{"use strict";lr();ee();J();Eu=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(mn,"splitIdentifier");l(zf,"tokenizeFile");l(qf,"tokenizeQuery");l(Kf,"buildIndex");l(Xf,"idf");l(Yf,"score");Pu="bm25-index";l(Qf,"saveIndex");l(co,"loadIndex");l(Cu,"indexProject");l(xu,"queryFiles")});import ea from"node:fs/promises";import ds from"node:path";import{z as q}from"zod";async function nh(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=ds.join(e,"package.json"),n=await ea.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(m=>m.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 A(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 rh(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 ch(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=sh[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 oh(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=ds.join(e,a);await x(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 ih(r,e){let t=Date.now();try{let s=await lh(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 ah(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=ds.join(e,o.file);await x(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 Ru(r,e){let t=Date.now(),s=await Promise.all([nh(r,e),rh(r,e),oh(r,e),ih(r,e),ah(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 ch(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ds.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function lh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.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 Zf,eh,th,ta,sP,sh,Au=v(()=>{"use strict";H();J();Ur();Zf=q.enum(["draft","verified","sealed"]),eh=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),th=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),ta=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(eh),antiPatterns:q.array(th),analyzedAt:q.string(),modelMetadata:on.optional(),status:Zf.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),sP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sh={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(nh,"verifyFrameworks");l(rh,"verifyLanguages");l(oh,"verifyPatternLocations");l(ih,"verifyFileCount");l(ah,"verifyAntiPatternFiles");l(Ru,"semanticVerify");l(ch,"getProjectExtensions");l(lh,"countProjectFiles")});var sa,ms,na=v(()=>{"use strict";fe();z();J();sa=class{static{l(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await Ee(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await Ee(t,[])??[]}async clearPending(e){let t=R.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=R.getLastSyncPath(e),s={timestamp:b(),success:!0};await ce(t,s)}async getLastSync(e){let t=R.getLastSyncPath(e);return await Ee(t,null)}},ms=new sa});var Be,Qt=v(()=>{"use strict";na();Ps();z();ee();Be=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new an({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:b(),projectId:e};await ms.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:b()};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 ra,Je,pn=v(()=>{"use strict";Au();Xi();z();Ds();Qt();ra=class extends Be{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"};ta.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:b()})),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=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ta.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=b();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:ku(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 Ru(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 ar(JSON.stringify(t))}},Je=new ra});var oa,uh,Mt,ur=v(()=>{"use strict";z();ee();oa=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=b();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}})}},uh=new oa,Mt=uh});import{z as T}from"zod";var dh,lo,mh,ph,gh,ia,ju,Iu,$u,Mu,Du,fh,hh,_u,Ou,Nu,yh,wh,RP,aa=v(()=>{"use strict";Ur();dh=T.enum(["low","medium","high","critical"]),lo=T.enum(["feature","bug","improvement","chore"]),mh=T.enum(["active","backlog","previously_active"]),ph=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),gh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ia=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()}),ju=T.object({output:T.string().min(1,"Subtask output is required"),summary:ia}),Iu=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:ph,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:ia.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),$u=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Mu=T.object({id:T.string(),description:T.string(),type:lo.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),Du=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:lo.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),fh=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()}),hh=T.object({taskId:T.string(),title:T.string(),classification:lo,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(ia),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:fh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),_u=T.object({currentTask:Mu.nullable(),previousTask:Du.nullable().optional(),pausedTasks:T.array(Du).optional(),taskHistory:T.array(hh).optional(),lastUpdated:T.string()}),Ou=T.object({id:T.string(),description:T.string(),priority:dh,type:lo,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:mh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Nu=T.object({tasks:T.array(Ou),lastUpdated:T.string()}),yh=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),wh=T.object({type:gh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),RP=T.object({projectId:T.string(),currentTask:Mu.nullable(),queue:T.array(Ou),stats:yh,recentActivity:T.array(wh),lastSync:T.string()})});var dr,ca,$s,la=v(()=>{"use strict";dr={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"}},ca=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=dr[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 dr[e]}getPrompt(e){return dr[e].prompt}getValidCommands(e){return dr[e].transitions}formatNextSteps(e){return dr[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}`}})}},$s=new ca});var Zt,ua,At,Ms=v(()=>{"use strict";xt();z();ee();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ua=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=pe(),n=b();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=b();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(pe(),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}},At=new ua});var da,_,wt=v(()=>{"use strict";xt();aa();z();la();Ms();Qt();da=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",_u)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=$s.getCurrentState(e),n=$s.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:b()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),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:b()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=b(),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:b(),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:b()})),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,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??pe()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}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[];At.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:b()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:b()}))}async hasTask(e){let t=await this.read(e),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(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}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:b()})),{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?b():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:b()})),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=ju.safeParse(t);if(!s.success){let h=s.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
523
|
+
`)}function Lu(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 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:
|
|
521
525
|
${h.join(`
|
|
522
|
-
`)}`)}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:
|
|
523
|
-
// ... 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}},O=new xa});import td from"node:fs/promises";import sd from"node:path";async function Ra(r,e,t,s){let[n,o,i,a]=await Promise.all([Fh(r,e,s),Uh(r),Hh(r),Wh(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,Nh).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 Fh(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Bu(r,n,Aa*2);for(let a of o){if(s.length>=Aa)break;try{let c=sd.join(e,a.path),u=await td.readFile(c,"utf-8");u.length>yo*3?s.push({path:a.path,content:`${u.slice(0,yo)}
|
|
527
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,yo),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>=Aa)break;if(!s.some(c=>c.path===a))try{let c=sd.join(e,a),u=await td.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,yo),reason:"entry point"})}catch{}}return s}async function Uh(r){try{let e=await qe.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 Hh(r){try{return(await O.getTaskHistory(r)).slice(0,Lh).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Wh(r){try{let e=Lt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var yo,Aa,Nh,Lh,nd=v(()=>{"use strict";ga();yn();fr();ft();es();yo=3e3,Aa=15,Nh=15,Lh=10;l(Ra,"buildAnalysisPayload");l(Fh,"selectCodeSamples");l(Uh,"getExistingPatterns");l(Hh,"getTaskHistory");l(Wh,"getPreviousAnalysisSummary")});var wo=v(()=>{"use strict"});import os from"chalk";function rd(r){return Math.ceil(r.length/4)}function od(r){let e=r.split(`
|
|
524
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+=`
|
|
525
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
526
|
-
`).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 Da(r){return r.includes("<!-- prjct:preserve")}function id(r,e){let t=od(r),s=od(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:rd(r),tokensAfter:rd(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)Da(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()&&(Da(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
527
531
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
528
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
529
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
530
|
-
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let
|
|
531
|
-
`)}function
|
|
532
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Da(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 ad(r,e={}){let{colorize:t=!0}=e,s=[],n=t?os.green:p=>p,o=t?os.red:p=>p,i=t?os.yellow:p=>p,a=t?os.dim:p=>p,c=t?os.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
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 cd(r,e={}){let{colorize:t=!0}=e,s=[],n=t?os.green:c=>c,o=t?os.red:c=>c,i=t?os.cyan:c=>c,a=t?os.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
532
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(`
|
|
533
537
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
534
538
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -539,19 +543,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function ga(r){return r.incl
|
|
|
539
543
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
540
544
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
541
545
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
542
|
-
`)}var
|
|
546
|
+
`)}var ld=v(()=>{"use strict";wo();l(rd,"estimateTokens");l(od,"parseMarkdownSections");l(Da,"isPreservedSection");l(id,"generateSyncDiff");l(ad,"formatDiffPreview");l(cd,"formatFullDiff")});var ud,dd,Ia,md,pd=v(()=>{"use strict";ar();te();Rs();q();ud=50,dd=200,Ia=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 gs(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>ud&&(n.current.commands=n.current.commands.slice(-ud)),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>dd&&(n.current.files=n.current.files.slice(-dd)),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:ct(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:ct(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}},md=new Ia});var Vh,ja,ko,$a=v(()=>{"use strict";te();U();Le();pd();Vh={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ja=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Vh,...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 _("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([_(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),_(`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(`
|
|
543
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(`
|
|
544
|
-
`)}async getSessionInfo(e){return
|
|
548
|
+
`)}async getSessionInfo(e){return md.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
545
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(`
|
|
546
|
-
`)}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}},
|
|
547
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&
|
|
548
|
-
`);throw new
|
|
549
|
-
${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}},ko=l((r,e)=>new ja(r,e),"createStalenessChecker")});import gd from"node:fs/promises";import kn from"node:path";function Bh(r){let e=[],t,s=new RegExp(zl.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function Jh(r,e,t){let s;if(r.startsWith("@/"))s=kn.join(t,"src",r.slice(2));else{let n=kn.dirname(kn.join(t,e));s=kn.resolve(n,r)}for(let n of ql){let o=s+n;try{if((await gd.stat(o)).isFile())return kn.relative(t,o)}catch{}}return null}async function qh(r){let e=await an(r),t={},s={},n=0,o=await cn(e,50,async i=>{try{let a=await gd.readFile(kn.join(r,i),"utf-8"),c=Bh(a),u=[];for(let d of c){let m=await Jh(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 zh(r,e){$.setDoc(r,fd,e)}function So(r){return $.getDoc(r,fd)}async function hd(r,e){let t=await qh(r);return zh(e,t),t}var fd,Ma=v(()=>{"use strict";Ni();te();B();l(Bh,"extractImportSources");l(Jh,"resolveImport");l(qh,"buildGraph");fd="import-graph";l(zh,"saveGraph");l(So,"loadGraph");l(hd,"indexImports")});function yd(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=So(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 wd(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 kd=v(()=>{"use strict";Ma();l(yd,"propagateChanges");l(wd,"affectedDomains")});import Sd from"node:fs/promises";import Kh from"node:path";function Xh(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 Yh(r){let e=await an(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await cn(e,100,async n=>{try{let o=Kh.join(r,n),[i,a]=await Promise.all([Sd.readFile(o,"utf-8"),Sd.stat(o)]);return{path:n,hash:Xh(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function Qh(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 _a(r,e){let t=$.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)})(),$.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Zh(r){let e=new Map;try{let t=$.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 Oa(r,e){let[t,s]=await Promise.all([Yh(r),Promise.resolve(Zh(e))]);return{diff:Qh(t,s),currentHashes:t}}function bd(r){return $.hasDoc(r,"file-hashes-meta")}var Td=v(()=>{"use strict";te();B();l(Xh,"hashContent");l(Yh,"computeHashes");l(Qh,"diffHashes");l(_a,"saveHashes");l(Zh,"loadHashes");l(Oa,"detectChanges");l(bd,"hasHashRegistry")});async function ty(r,e=100){try{let{stdout:t}=await _(`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&&sy(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function sy(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 ny(r,e=100){let t=await ty(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=ry(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 ry(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function oy(r,e){$.setDoc(r,Pd,e)}function Cd(r){return $.getDoc(r,Pd)}async function xd(r,e,t=100){let s=await ny(r,t);return oy(e,s),s}var Pd,Ad=v(()=>{"use strict";gr();te();Le();l(ty,"parseGitLog");l(sy,"isSourceFile");l(ny,"buildMatrix");l(ry,"pairKey");Pd="cochange-index";l(oy,"saveMatrix");l(Cd,"loadMatrix");l(xd,"indexCoChanges")});import jd from"node:fs/promises";import Rd from"node:os";import Na from"node:path";function ay(){let r=gt("mcp-config.json");if(!r)return{mcpServers:{context7:La}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:La}}}}function $d(){return ay().mcpServers?.context7||La}function Dd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Na.join(Rd.tmpdir(),"prjct-context7-test","mcp.json"):Na.join(Rd.homedir(),".claude","mcp.json")}async function Id(r){try{let e=await jd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e))return{};throw e}}async function cy(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=$d(),e=[...r.args||[],"--help"];await As(r.command||"npx",e,{timeout:15e3})}var La,Sn,Fa,ly,is,yr=v(()=>{"use strict";Os();ar();U();Le();B();La={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Sn=null;l(ay,"parseTemplateConfig");l($d,"getContext7Config");l(Dd,"getConfigPath");l(Id,"readConfig");l(cy,"runSmokeCheck");Fa=class{static{l(this,"Context7Service")}async install(){let e=Dd(),t=Na.dirname(e);await jd.mkdir(t,{recursive:!0});let s=await Id(e),n=s.mcpServers||{};return n.context7=$d(),s.mcpServers=n,await le(e,s),Sn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Sn&&Date.now()-Sn.at<3e5)return Sn.status;let e=Dd(),n=((await Id(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 cy();let o={installed:!0,verified:!0,configPath:e};return Sn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return Sn={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}},ly=new Fa,is=ly});var bo,Ua=v(()=>{"use strict";bo={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 Ha(r,e){return{...bo[r],...e}}function wr(r,e,t){return{message:r,hint:e,...t}}var To=v(()=>{"use strict";Ua();Ua();l(Ha,"getError");l(wr,"createError")});import{execFileSync as Md,execSync as uy}from"node:child_process";var vo,Wa,Eo,_d,Od=v(()=>{"use strict";Rs();To();vo={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"}},Wa=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=vo[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=vo[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Eo(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=vo[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
552
|
+
`);throw new Eo({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(vo),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=uy(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:wr(`${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:wr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Md(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Md(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:wr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?gs(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())}},Eo=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}},_d=new Wa});function bn(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 dy[r]}var re,Ga,Va,Po,dy,Ft,Nd,Fs=v(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Ga=["feature","spec","design","refactor","migrate"],Va=["ship","cleanup","git","migrate"],Po=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],dy={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(bn,"getTimeout");Ft={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},Nd={HISTORY_MAX:100}});import Ba from"node:fs/promises";import my from"node:os";import Ld from"node:path";var Ja,py,Co,qa=v(()=>{"use strict";U();B();Ja=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=my.homedir(),this.configDir=Ld.join(this.homeDir,".prjct-cli","config"),this.configFile=Ld.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ba.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Ba.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 le(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 le(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 Ba.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},py=new Ja,Co=py});var Ka={};Jt(Ka,{installAntigravitySkill:()=>Gd,installCodexSkill:()=>za,needsAntigravityInstallation:()=>wy,run:()=>Wd,verifyCodexPRouterReady:()=>Ao});import{execFileSync as gy}from"node:child_process";import Q from"node:fs/promises";import Us from"node:os";import oe from"node:path";import me from"chalk";async function fy(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_d.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${r.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gy("npm",["install","-g",e],{stdio:"inherit",timeout:bn("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Wd(){let r=await cr(),e=await Ji(),t=ut[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=ut[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await fy(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await xe.detectActiveProvider()){let p=await xe.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await xe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await xe.installDocs(),await Ty(),await is.ensureReady()}}else if(a==="gemini"){await hy()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await yy();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Kr()).installed&&(await Gd()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await Ds()).installed){if(!(await za()).success)throw new Error("Codex skill installation failed");let c=await Ao({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${me.green("\u2713")} Codex skill installed`),console.log(` ${me.green("\u2713")} Codex p. router ready`)}await Co.saveConfig(Ee,await xe.getInstallPath(),e.provider),await by();for(let a of s.providers)vy(a,ut[a.provider]);return s}async function hy(){try{let r=oe.join(Us.homedir(),".gemini","commands"),e=oe.join(r,"p.toml");try{return await Q.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return H.warn(`Gemini router cleanup warning: ${y(r)}`),!1}}async function yy(){try{let r=oe.join(Us.homedir(),".gemini"),e=oe.join(r,"GEMINI.md");await Q.mkdir(r,{recursive:!0});let t=gt("global/GEMINI.md");if(!t){let c=oe.join(lt,"templates","global","GEMINI.md");t=await Q.readFile(c,"utf-8")}let s="",n=!1;try{s=await Q.readFile(e,"utf-8"),n=!0}catch(c){if(D(c))n=!1;else throw c}let a=uo(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Q.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return H.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function Gd(){try{let r=oe.join(Us.homedir(),".gemini","antigravity","skills"),e=oe.join(r,"prjct"),t=oe.join(e,"SKILL.md");await Q.mkdir(e,{recursive:!0});let s=await C(t),n=gt("antigravity/SKILL.md");if(!n){let o=oe.join(lt,"templates","antigravity","SKILL.md");if(!await C(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await Q.readFile(o,"utf-8")}return await Q.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function wy(){let r=await Kr();return r.installed&&!r.skillInstalled}function Bd(){return oe.join(Us.homedir(),".codex","skills","prjct","SKILL.md")}function ky(r){return`<!-- ${Vd}: ${JSON.stringify({version:Ee,templateHash:r})} -->`}function Fd(r){let e=r.match(new RegExp(`<!--\\s*${Vd}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Sy(r){return mr(r)}async function Jd(){let r=gt("codex/SKILL.md");if(r)return r;let e=oe.join(lt,"templates","codex","SKILL.md");return await C(e)?Q.readFile(e,"utf-8"):null}function qd(r){let e=r.trimEnd(),t=Sy(e),s=ky(t);return{content:`${e}
|
|
550
554
|
|
|
551
555
|
${s}
|
|
552
|
-
`,templateHash:t}}async function
|
|
556
|
+
`,templateHash:t}}async function za(){try{let r=Bd(),e=oe.dirname(r);await Q.mkdir(e,{recursive:!0});let t=await C(r),s=await Jd();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=qd(s);return t&&await Q.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await Q.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return H.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function Ao(r={}){let e=Bd();if(!(await Ds()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Jd();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=qd(s),o=l(async()=>r.autoRepair?(await za()).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 Q.readFile(e,"utf-8").catch(()=>"");let a=Fd(i);if(!(a?.version===Ee&&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 Q.readFile(e,"utf-8").catch(()=>""),a=Fd(i),!(a?.version===Ee&&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 by(){try{let r=oe.join(Us.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await Q.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!==Ee&&(n.cliVersion=Ee,P.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${Ee}`)}catch(r){D(r)||H.warn(`Migration warning: ${y(r)}`)}}async function Ud(r,e){let t={};if(await C(r))try{t=await Pe(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await le(r,t)}async function Ty(){try{let r=oe.join(Us.homedir(),".claude"),e=oe.join(r,"settings.json"),t=oe.join(r,"prjct-statusline.sh"),s=oe.join(Us.homedir(),".prjct-cli","statusline"),n=oe.join(s,"statusline.sh"),o=oe.join(s,"themes"),i=oe.join(s,"lib"),a=oe.join(s,"components"),c=oe.join(s,"config.json"),u=oe.join(lt,"assets","statusline"),d=oe.join(u,"statusline.sh"),m=oe.join(u,"themes"),p=oe.join(u,"lib"),g=oe.join(u,"components"),h=oe.join(u,"default-config.json");if(await C(r)||await Q.mkdir(r,{recursive:!0}),await C(s)||await Q.mkdir(s,{recursive:!0}),await C(o)||await Q.mkdir(o,{recursive:!0}),await C(i)||await Q.mkdir(i,{recursive:!0}),await C(a)||await Q.mkdir(a,{recursive:!0}),await C(n)){let b=await Q.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let k=b.match(/CLI_VERSION="([^"]*)"/);if(k&&k[1]!==Ee){let E=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ee}"`);await Q.writeFile(n,E,{mode:493})}await xo(p,i),await xo(g,a),await Hd(t,n),await Ud(e,t);return}}if(await C(d)){let b=await Q.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Ee}"`),await Q.writeFile(n,b,{mode:493}),await xo(p,i),await xo(g,a),await C(m)){let k=await Q.readdir(m);for(let E of k){let R=oe.join(m,E),W=oe.join(o,E);await Q.copyFile(R,W)}}!await C(c)&&await C(h)&&await Q.copyFile(h,c)}else{let b=`#!/bin/bash
|
|
553
557
|
# prjct Status Line for Claude Code
|
|
554
|
-
CLI_VERSION="${
|
|
558
|
+
CLI_VERSION="${Ee}"
|
|
555
559
|
input=$(cat)
|
|
556
560
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
557
561
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -580,7 +584,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
580
584
|
fi
|
|
581
585
|
fi
|
|
582
586
|
echo "prjct"
|
|
583
|
-
`;await Y.writeFile(n,S,{mode:493})}await Ed(t,n),await vd(e,t)}catch(r){A(r)||G.warn(`Status line warning: ${y(r)}`)}}async function bo(r,e){if(!await x(r))return;let t=await Y.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=re.join(r,s),o=re.join(e,s);await Y.copyFile(n,o),await Y.chmod(o,493)}}async function Ed(r,e){try{if(await x(r)){if((await Y.lstat(r)).isSymbolicLink()&&await Y.readlink(r)===e)return;await Y.unlink(r)}await Y.symlink(e,r)}catch{try{await x(e)&&(await Y.copyFile(e,r),await Y.chmod(r,493))}catch(s){A(s)||G.warn(`Symlink fallback warning: ${s.message}`)}}}function oy(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${de.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var xd,iy,vo=v(()=>{"use strict";Is();mr();kd();ee();H();_s();J();Ds();Kt();Pt();lt();Yt();ja();qi();l(Yh,"installAICLI");l(Pd,"run");l(Qh,"installGeminiRouter");l(Zh,"installGeminiGlobalConfig");l(Cd,"installAntigravitySkill");l(ey,"needsAntigravityInstallation");xd="prjct-codex-router";l(Rd,"getCodexSkillPath");l(ty,"getCodexSkillMetadata");l(Td,"parseCodexSkillMetadata");l(sy,"hashContent");l(Ad,"loadCodexSkillTemplate");l(Dd,"buildCodexSkillContent");l(Ia,"installCodexSkill");l(To,"verifyCodexPRouterReady");l(ny,"migrateProjectsCliVersion");l(vd,"ensureStatusLineSettings");l(ry,"installStatusLine");l(bo,"installStatusLineModules");l(Ed,"ensureStatusLineSymlink");l(oy,"showResults");iy=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");iy&&Pd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as W}from"zod";var ay,cy,jd,ly,uy,dy,my,py,Id,_x,$d=v(()=>{"use strict";ay=W.enum(["low","medium","high"]),cy=W.enum(["pending","converted","completed","archived","dormant"]),jd=W.enum(["high","medium","low"]),ly=W.object({impact:jd,effort:jd}),uy=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),dy=W.object({name:W.string(),description:W.string()}),my=W.object({name:W.string(),description:W.string().optional()}),py=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:ay,status:cy,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:ly.optional(),implementationNotes:W.string().optional(),stack:uy.optional(),modules:W.array(dy).optional(),roles:W.array(my).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Id=W.object({ideas:W.array(py),lastUpdated:W.string()}),_x={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Ma,Le,ps=v(()=>{"use strict";$d();xt();z();Ms();Qt();Ma=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Id)}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:pe(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:b()})),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:b()})),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:b()})),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:b()}))}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:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:b()}))}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:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=is(Zt.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Le=new Ma});var _a,wn,Oa=v(()=>{"use strict";ao();z();Qt();_a=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",hu)}getDefault(){return{...yu}}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,p=[...i.dailyStats],m=p.findIndex(E=>E.date===o);if(m>=0){let E=p[m];p[m]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+n)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else p.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],S=p.filter(E=>E.date>=h),w=[...i.agentUsage];if(t.agents)for(let E of t.agents){let D=w.findIndex(V=>V.agentName===E);D>=0?w[D]={...w[D],usageCount:w[D].usageCount+1,tokensSaved:w[D].tokensSaved+Math.floor(s/t.agents.length)}:w.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:w,dailyStats:S,firstSync:i.firstSync||b(),lastUpdated:b()}})}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:wu(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)}},wn=new _a});import Q from"node:fs/promises";import K from"node:path";async function Eo(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=K.join(s,"storage"),o=K.join(s,"index"),i=K.join(s,"memory");t.backupDir=await gy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of Fa){let d=K.join(n,c),p=await Ot(d);if(p===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,p),Md(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of La){let d=K.join(o,c),p=await Ot(d);if(p===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(p),new Date().toISOString()),_d(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await Ty(r,o,t),await vy(r,o,t),await Ey(r,i,t),await Py(r,i,t);let a=K.join(s,"sessions");return await Cy(r,a,t),t.errors.length===0&&await xy(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=K.join(r,"backup");return await Q.mkdir(s,{recursive:!0}),await Q.mkdir(K.join(s,"index"),{recursive:!0}),await Q.mkdir(K.join(s,"memory"),{recursive:!0}),await Na(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Na(e,K.join(s,"index")),await Na(t,K.join(s,"memory")),s}async function Na(r,e,t){try{let s=await Q.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=K.join(r,n.name),i=K.join(e,n.name);await Q.copyFile(o,i)}}catch(s){if(!A(s))throw s}}function Md(r,e,t){switch(e){case"state":fy(r,t);break;case"queue":hy(r,t);break;case"ideas":yy(r,t);break;case"shipped":wy(r,t);break;case"metrics":ky(r,t);break;case"analysis":Sy(r,t);break}}function fy(r,e){let t=P.getDb(r),s=t.prepare(`
|
|
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(`
|
|
584
588
|
INSERT OR REPLACE INTO tasks
|
|
585
589
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
586
590
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -591,92 +595,92 @@ echo "prjct"
|
|
|
591
595
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
592
596
|
depends_on, started_at, completed_at, output, summary)
|
|
593
597
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
594
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(
|
|
598
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(I(a.id)??`task-${Date.now()}`,I(a.description??a.parentDescription)??"",I(a.type),I(c??a.status)??"unknown",I(a.parentDescription),I(a.branch),I(a.linearId),I(a.linearUuid),I(a.sessionId),I(a.featureId),I(a.startedAt)??new Date().toISOString(),I(a.completedAt),I(a.shippedAt),I(a.pausedAt),I(a.pauseReason),I(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(I(m.id)??`subtask-${d}`,I(a.id),I(m.description)??"",I(m.status)??"pending",I(m.domain),I(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,I(m.startedAt),I(m.completedAt),I(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 My(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
595
599
|
INSERT OR REPLACE INTO queue_tasks
|
|
596
600
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
597
601
|
feature_id, feature_name)
|
|
598
602
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
599
|
-
`);for(let o of t)n.run(
|
|
603
|
+
`);for(let o of t)n.run(I(o.id)??`queue-${Date.now()}`,I(o.description)??"",I(o.type),I(o.priority),I(o.section),I(o.createdAt)??new Date().toISOString(),o.completed?1:0,I(o.completedAt),I(o.featureId),I(o.featureName))}function _y(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
600
604
|
INSERT OR REPLACE INTO ideas
|
|
601
605
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
602
606
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
603
|
-
`);for(let o of t)n.run(
|
|
607
|
+
`);for(let o of t)n.run(I(o.id)??`idea-${Date.now()}`,I(o.text)??"",I(o.status)??"pending",I(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,I(o.addedAt)??new Date().toISOString(),I(o.convertedTo),I(o.details),JSON.stringify(o))}function Oy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
604
608
|
INSERT OR REPLACE INTO shipped_features
|
|
605
609
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
606
610
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
607
|
-
`);for(let o of t)n.run(
|
|
611
|
+
`);for(let o of t)n.run(I(o.id)??`ship-${Date.now()}`,I(o.name)??"",I(o.shippedAt)??new Date().toISOString(),I(o.version)??"0.0.0",I(o.description),I(o.type),I(o.duration),JSON.stringify(o))}function Ny(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
608
612
|
INSERT OR REPLACE INTO metrics_daily
|
|
609
613
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
610
614
|
VALUES (?, ?, ?, ?, ?)
|
|
611
|
-
`);for(let o of t)n.run(
|
|
615
|
+
`);for(let o of t)n.run(I(o.date)??new Date().toISOString().slice(0,10),ks(o.tokensSaved)??0,ks(o.syncs)??0,ks(o.avgCompressionRate)??0,ks(o.totalDuration)??0)}function Ly(r,e){let s=P.getDb(r).prepare(`
|
|
612
616
|
INSERT OR REPLACE INTO analysis
|
|
613
617
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
614
618
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
615
|
-
`),n=l((o,i)=>{o&&s.run(i,
|
|
619
|
+
`),n=l((o,i)=>{o&&s.run(i,I(o.status)??"unknown",I(o.commitHash),I(o.signature),I(o.sealedAt),I(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function Qd(r,e,t){e==="categories-cache"&&Fy(r,t)}function Fy(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
616
620
|
INSERT OR REPLACE INTO index_files
|
|
617
621
|
(path, categories, domain, score, size, mtime, language)
|
|
618
622
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
619
|
-
`);for(let o of t){let i=
|
|
623
|
+
`);for(let o of t){let i=I(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function Uy(r,e,t){let s=X.join(e,"checksums.json"),n=await Ut(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 Hy(r,e,t){let s=X.join(e,"file-scores.json"),n=await Ut(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(`
|
|
620
624
|
INSERT OR REPLACE INTO index_files
|
|
621
625
|
(path, score, size, mtime, language, categories, domain)
|
|
622
626
|
VALUES (?, ?, ?, ?, NULL,
|
|
623
627
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
624
628
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
625
|
-
`);i.transaction(()=>{for(let c of o){let u=
|
|
626
|
-
`).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=
|
|
627
|
-
`).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=I(c.path);u&&a.run(u,ks(c.score)??0,ks(c.size),I(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 Wy(r,e,t){let s=X.join(e,"events.jsonl");try{let o=(await Z.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=I(u.type??u.action)??"unknown",m=I(u.taskId??u.task_id),p=I(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 Gy(r,e,t){let s=X.join(e,"learnings.jsonl");try{let o=(await Z.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:${I(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?I(m[0]):null;a.run(d,p,c,1,I(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 Vy(r,e,t){let n=P.getDb(r).prepare(`
|
|
628
632
|
INSERT OR IGNORE INTO sessions
|
|
629
633
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
630
634
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
631
|
-
`),o=l(u=>{!u||!u.id||n.run(
|
|
632
|
-
`).filter(
|
|
635
|
+
`),o=l(u=>{!u||!u.id||n.run(I(u.id),I(u.projectId)??r,I(u.task)??"",I(u.status)??"completed",I(u.startedAt)??new Date().toISOString(),I(u.pausedAt),I(u.completedAt),ks(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=X.join(e,"current.json"),a=await Ut(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Z.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=X.join(e,"archive");try{let u=await Z.readdir(c);for(let m of u){let p=X.join(c,m);try{if(!(await Z.stat(p)).isDirectory())continue;let h=await Z.readdir(p);for(let k of h){if(!k.endsWith(".json"))continue;let E=X.join(p,k),R=await Ut(E);if(R!==null)try{o(R),t.migratedFiles.push(`sessions/archive/${m}/${k}`),await Z.unlink(E).catch(()=>{})}catch(W){t.errors.push({file:`sessions/archive/${m}/${k}`,error:String(W)})}}(await Z.readdir(p)).length===0&&await Z.rmdir(p).catch(()=>{})}catch{}}(await Z.readdir(c).catch(()=>[])).length===0&&await Z.rmdir(c).catch(()=>{})}catch{}try{(await Z.readdir(e)).length===0&&await Z.rmdir(e).catch(()=>{})}catch{}}async function By(r,e,t,s){let n=l(async(i,a)=>{try{await Z.unlink(i)}catch(c){D(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of tc)await n(X.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(X.join(e,i),`cleanup:index/${i}`);await n(X.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(X.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function I(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function ks(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 Ut(r){try{let e=await Z.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(D(e)||e instanceof SyntaxError)return null;throw e}}async function Io(r){let e=A.getGlobalProjectPath(r),t=X.join(e,"storage"),s=0;P.getDb(r);for(let{filename:h,key:b}of tc){let k=X.join(t,h),E=await Ut(k);if(E!==null){P.setDoc(r,b,E),Yd(r,b,E);try{await Z.unlink(k)}catch{}s++}}let n=X.join(e,"project.json"),o=await Ut(n);if(o!==null){P.setDoc(r,"project",o);try{await Z.unlink(n)}catch{}s++}let i=X.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let b=X.join(i,h);try{let E=(await Z.readFile(b,"utf-8")).split(`
|
|
636
|
+
`).filter(W=>W.trim());if(E.length===0){await Z.unlink(b),s++;continue}let R=P.getDb(r);if(h==="events.jsonl"){let W=R.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");R.transaction(()=>{for(let z of E)try{let w=JSON.parse(z);W.run(I(w.type??w.action)??"unknown",I(w.taskId??w.task_id),z,I(w.timestamp??w.ts)??new Date().toISOString())}catch{}})()}else{let W=R.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");R.transaction(()=>{for(let z of E)try{let w=JSON.parse(z),M=`learning:${I(w.taskId??w.timestamp)??Date.now()}`,N=w.tags;W.run(M,I(N?.[0]),z,1,I(w.timestamp)??new Date().toISOString())}catch{}})()}await Z.unlink(b),s++}catch{}}let a=X.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;P.getDb(r).prepare(`
|
|
633
637
|
INSERT OR IGNORE INTO sessions
|
|
634
638
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
635
639
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
636
|
-
`).run(j(h.id),j(h.projectId)??r,j(h.task)??"",j(h.status)??"completed",j(h.startedAt)??new Date().toISOString(),j(h.pausedAt),j(h.completedAt),gs(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Ot(u);d!==null&&(c(d),await Q.unlink(u).catch(()=>{}),s++);let p=K.join(a,"archive");try{let h=await Q.readdir(p);for(let w of h){let E=K.join(p,w);try{if(!(await Q.stat(E)).isDirectory())continue;let V=await Q.readdir(E);for(let k of V){if(!k.endsWith(".json"))continue;let $=await Ot(K.join(E,k));$!==null&&(c($),await Q.unlink(K.join(E,k)).catch(()=>{}),s++)}(await Q.readdir(E)).length===0&&await Q.rmdir(E).catch(()=>{})}catch{}}(await Q.readdir(p).catch(()=>[])).length===0&&await Q.rmdir(p).catch(()=>{})}catch{}try{(await Q.readdir(a)).length===0&&await Q.rmdir(a).catch(()=>{})}catch{}let m=K.join(e,"index"),g=[...La.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=K.join(m,h),w=await Ot(S);if(w===null)continue;let E=La.find(D=>D.filename===h);E&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(w),new Date().toISOString()),_d(r,E.key,w));try{await Q.unlink(S)}catch{}s++}return s}var Fa,La,Ua=v(()=>{"use strict";fe();H();ee();Fa=[{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"}],La=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Eo,"migrateJsonToSqlite");l(gy,"createBackup");l(Na,"copyFiles");l(Md,"populateNormalized");l(fy,"populateTasksFromState");l(hy,"populateQueueTasks");l(yy,"populateIdeas");l(wy,"populateShippedFeatures");l(ky,"populateMetricsDaily");l(Sy,"populateAnalysis");l(_d,"populateIndexTables");l(by,"populateCategoriesIndex");l(Ty,"migrateChecksums");l(vy,"migrateFileScores");l(Ey,"migrateEventsJsonl");l(Py,"migrateLearningsJsonl");l(Cy,"migrateSessionFiles");l(xy,"cleanupJsonFiles");l(j,"toStr");l(gs,"toNum");l(Ot,"readJsonSafe");l(Po,"sweepLegacyJson")});function Ld(r){return[...r].sort((e,t)=>{let s=Nd[e.section]-Nd[t.section];return s!==0?s:Od[e.priority]-Od[t.priority]})}function Ha(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Od,Nd,Ga=v(()=>{"use strict";Od={critical:0,high:1,medium:2,low:3},Nd={active:0,previously_active:1,backlog:2};l(Ld,"sortBySectionAndPriority");l(Ha,"uniqueBy")});var Wa,we,Wt=v(()=>{"use strict";xt();aa();Ga();z();Ms();Qt();Wa=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",Nu)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(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 Ld(t)[0]||null}async addTask(e,t){let s={...t,id:pe(),createdAt:b(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:b()})),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=b(),n=t.map(o=>({...o,id:pe(),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:b()})),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:b()},s):i),lastUpdated:b()})),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:b()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}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:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=is(Zt.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},we=new Wa});import{z as Z}from"zod";var Ry,Fd,Ay,Dy,jy,Iy,$y,My,_y,Ud,Hd=v(()=>{"use strict";Ry=Z.enum(["feature","fix","improvement","refactor"]),Fd=Z.enum(["pass","warning","fail","skipped"]),Ay=Z.enum(["added","changed","fixed","removed"]),Dy=Z.object({hours:Z.number(),minutes:Z.number(),totalMinutes:Z.number()}),jy=Z.object({filesChanged:Z.number().nullable().optional(),linesAdded:Z.number().nullable().optional(),linesRemoved:Z.number().nullable().optional(),commits:Z.number().nullable().optional()}),Iy=Z.object({description:Z.string(),type:Ay.optional()}),$y=Z.object({lintStatus:Fd.nullable().optional(),lintDetails:Z.string().optional(),testStatus:Fd.nullable().optional(),testDetails:Z.string().optional()}),My=Z.object({hash:Z.string().optional(),message:Z.string().optional(),branch:Z.string().optional()}),_y=Z.object({id:Z.string(),name:Z.string(),version:Z.string().nullable().optional(),type:Ry,agent:Z.string().optional(),description:Z.string().optional(),changes:Z.array(Iy).optional(),codeSnippets:Z.array(Z.string()).optional(),commit:My.optional(),codeMetrics:jy.optional(),qualityMetrics:$y.optional(),quantitativeImpact:Z.string().optional(),duration:Dy.optional(),tasksCompleted:Z.number().nullable().optional(),shippedAt:Z.string(),featureId:Z.string().optional()}),Ud=Z.object({shipped:Z.array(_y),lastUpdated:Z.string()})});var Va,Xe,Ns=v(()=>{"use strict";xt();Hd();z();Ms();Qt();Va=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ud)}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:pe(),shippedAt:b()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:b()})),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=is(Zt.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;At.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:b()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},Xe=new Va});import{z as le}from"zod";var Oy,Ny,Gd,ER,PR,CR,fs,Wd,gr=v(()=>{"use strict";Oy=le.enum(["improving","stable","declining"]),Ny=le.object({sprintNumber:le.number(),startDate:le.string(),endDate:le.string(),pointsCompleted:le.number(),tasksCompleted:le.number(),avgVariance:le.number(),estimationAccuracy:le.number()}),Gd=le.object({category:le.string(),avgVariance:le.number(),taskCount:le.number()}),ER=le.object({totalPoints:le.number(),sprints:le.number(),estimatedDate:le.string()}),PR=le.object({sprints:le.array(Ny),averageVelocity:le.number(),velocityTrend:Oy,estimationAccuracy:le.number(),overEstimated:le.array(Gd),underEstimated:le.array(Gd),lastUpdated:le.string()}),CR=le.object({sprintLengthDays:le.number().min(1).max(90).default(7),startDay:le.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:le.number().min(1).max(52).default(6),accuracyTolerance:le.number().min(0).max(100).default(20)}),fs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Wd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ba,Co,Ja=v(()=>{"use strict";gr();Qt();Ba=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Wd,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}},Co=new Ba});var fr,za,qa,Vd=v(()=>{"use strict";ir();z();fr=3,za=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>=fr){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}/${fr} 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>=fr){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}/${fr} 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>=fr&&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:[Ne.FILE_STRUCTURE,Ne.ARCHITECTURE],tech_stack:[Ne.TECH_STACK],architecture:[Ne.ARCHITECTURE,Ne.CODE_STYLE],estimation:[Ne.SHIP_WORKFLOW],workflow:[Ne.SHIP_WORKFLOW,Ne.CODE_STYLE],gotcha:[Ne.TEST_BEHAVIOR,Ne.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
637
|
-
`)}},
|
|
638
|
-
`)}},
|
|
639
|
-
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function
|
|
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
|
+
`)}},lc=new cc});import{z as x}from"zod";var am,sw,nw,cm,rw,ow,iw,aw,cw,lw,uw,lm,dw,mw,cR,um,dm,mm,pm,pw,_o,gm=v(()=>{"use strict";am=x.number().min(1).max(5),sw=x.enum(["exceeded","met","partial","failed"]),nw=x.enum(["definitely","probably","maybe","no"]),cm=x.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),rw=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:cm.optional(),explanation:x.string().optional()})}),ow=x.object({name:x.string(),baseline:x.number().nullable(),target:x.number(),actual:x.number(),unit:x.string(),achieved:x.boolean(),percentOfTarget:x.number()}),iw=x.object({criteria:x.string(),met:x.boolean(),notes:x.string().optional()}),aw=x.object({metrics:x.array(ow),acceptanceCriteria:x.array(iw),overallSuccess:sw,successScore:x.number().min(0).max(100)}),cw=x.object({category:x.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:x.string(),actionable:x.boolean(),action:x.string().optional()}),lw=x.object({whatWorked:x.array(x.string()),whatDidnt:x.array(x.string()),surprises:x.array(x.string()),recommendations:x.array(cw)}),uw=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:nw,worthItReason:x.string().optional(),alternativeConsidered:x.string().optional(),betterAlternativeExists:x.boolean().optional()}),lm=x.object({id:x.string(),taskId:x.string(),description:x.string(),estimatedMinutes:x.number().optional(),actualMinutes:x.number(),completedAsPlanned:x.boolean(),qualityScore:am,blockers:x.array(x.string()),agentUsed:x.string().optional(),skillsUsed:x.array(x.string()).optional(),startedAt:x.string(),completedAt:x.string()}),dw=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:rw,success:aw.optional(),learnings:lw,roi:uw,rating:am,taskOutcomes:x.array(lm).optional(),startedAt:x.string(),shippedAt:x.string(),reviewedAt:x.string().optional(),reviewedBy:x.string().optional(),legacy:x.boolean().optional()}),mw=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:cm,count:x.number(),averageVariance:x.number()})),topLearnings:x.array(x.object({insight:x.string(),frequency:x.number()}))}),cR=x.object({outcomes:x.array(dw),taskOutcomes:x.array(lm).optional(),aggregates:mw.optional(),lastUpdated:x.string(),lastAggregated:x.string().optional()}),um={outcomes:[],taskOutcomes:[],lastUpdated:""},dm=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"),mm=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),pm=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),pw=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),_o=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=>pw(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 uc,fm,hm=v(()=>{"use strict";gm();ns();q();uc=class extends Je{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...um,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:_o([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?_o(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:_o(t.outcomes),lastAggregated:S(),lastUpdated:S()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&St(e.duration)||60,s=t/60,n=t/60,o=dm(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=mm(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:pm(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}}},fm=new uc});import dc from"node:fs/promises";import Oo from"node:path";var mc,pc,ym,wm=v(()=>{"use strict";U();B();mc=".prjct/.prjct-state.md",pc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Oo.join(e,mc);await dc.mkdir(Oo.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await dc.writeFile(s,n,"utf-8")}async remove(e){try{await dc.unlink(Oo.join(e,mc))}catch(t){if(!D(t))throw t}}async exists(e){let t=Oo.join(e,mc);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
|
+
`)}},ym=new pc});var gc,Et,Ws=v(()=>{"use strict";Ce();Ls();te();gc=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await j.getProjectId(e);if(!o)return;$.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 j.getProjectId(e);return s?$.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 j.getProjectId(e);return n?$.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 j.getProjectId(e);if(!t)return;$.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return $.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(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=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=rs.MEMORY_MAX_ENTRIES)return 0;let n=s-rs.MEMORY_MAX_ENTRIES,o=$.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Mt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&$.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Et=new gc});import gw from"node:path";function fw(r){return $s(gw.resolve(r))}function br(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function hw(r){return nc(r,e=>`${br(e.name)}::${br(e.source)}`)}function yw(r){return nc(r,e=>`${br(e.issue)}::${br(e.file)}::${br(e.source)}`)}var fc,ww,km,Sm=v(()=>{"use strict";te();$o();Ms();l(fw,"repoHash");l(br,"normalizeKey");l(hw,"dedupePatterns");l(yw,"dedupeAntiPatterns");fc=class{static{l(this,"PatternExtractor")}async extract(e){let t=fw(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=hw([...s,...n]),a=yw([...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}}},ww=new fc,km=ww});import Tr from"node:fs/promises";import kw from"node:os";import vr from"node:path";function Sw(r){return`# ${r.projectName}
|
|
643
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function bw(r){return r.patterns.length===0?"":`
|
|
640
644
|
## Patterns
|
|
641
645
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
642
646
|
`)}
|
|
643
|
-
`}function
|
|
647
|
+
`}function Tw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
644
648
|
## Anti-Patterns
|
|
645
649
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
646
650
|
`)}
|
|
647
|
-
`}function
|
|
651
|
+
`}function vw(r){return r.knownGotchas.length===0?"":`
|
|
648
652
|
## Known Gotchas
|
|
649
653
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
650
654
|
`)}
|
|
651
|
-
`}function
|
|
655
|
+
`}function Ew(r){return r.recentShipped.length===0?"":`
|
|
652
656
|
## Recent Deliveries
|
|
653
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(`
|
|
654
658
|
`)}
|
|
655
|
-
`}function
|
|
659
|
+
`}function Pw(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?"":`
|
|
656
660
|
## Velocity
|
|
657
661
|
${e.join(" | ")}
|
|
658
|
-
`}function
|
|
662
|
+
`}function Cw(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?"":`
|
|
659
663
|
## Commands
|
|
660
664
|
| Action | Command |
|
|
661
665
|
|--------|---------|
|
|
662
666
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
663
667
|
`)}
|
|
664
|
-
`}function
|
|
668
|
+
`}function xw(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?"":`
|
|
665
669
|
## State
|
|
666
670
|
${e.join(`
|
|
667
671
|
`)}
|
|
668
|
-
`}function
|
|
672
|
+
`}function Aw(r){return r.userPatterns.length===0?"":`
|
|
669
673
|
## User Patterns
|
|
670
674
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
671
675
|
`)}
|
|
672
|
-
`}function
|
|
676
|
+
`}function Rw(r){return[bw(r),Tw(r),vw(r),Ew(r),Pw(r),Cw(r.commands),xw(r),Aw(r)].filter(Boolean).join("")}function Dw(r,e){let t=r.userInvocable!==!1;return`---
|
|
673
677
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
674
678
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
675
679
|
user-invocable: ${t}
|
|
676
|
-
---`}function
|
|
680
|
+
---`}function Iw(r,e){return`${Dw(r,e)}
|
|
677
681
|
|
|
678
|
-
${r.body(e)}`}var
|
|
679
|
-
${
|
|
682
|
+
${r.body(e)}`}var hc,yc,bm,Tm=v(()=>{"use strict";Yt();es();l(Sw,"formatProjectHeader");l(bw,"formatPatterns");l(Tw,"formatAntiPatterns");l(vw,"formatGotchas");l(Ew,"formatRecentShipped");l(Pw,"formatVelocity");l(Cw,"formatCommands");l(xw,"formatState");l(Aw,"formatUserPatterns");l(Rw,"formatRichContext");hc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Sw(r)}
|
|
683
|
+
${Rw(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(`
|
|
680
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(`
|
|
681
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
|
|
682
686
|
|
|
@@ -759,34 +763,34 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
759
763
|
|
|
760
764
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
761
765
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
762
|
-
`,"body")}];l(
|
|
763
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),
|
|
764
|
-
`).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});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:oe(t)})}return e}async function Nt(r,e){let t=await x(nc.join(r,e));return t||G.debug("File not found",{filename:e}),t}async function dm(r){let e={fileCount:0,version:"0.0.0",name:nc.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:oe(t)}),e.fileCount=0}try{let t=nc.join(r,"package.json"),s=await Ee(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 Nt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:r,error:oe(t)})}return await Nt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Nt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Nt(r,"requirements.txt")||await Nt(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 mm(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 Nt(r,"bun.lockb")||await Nt(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 Nt(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 Nt(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 Nt(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 Nt(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 pm(r){return new Ao(r).detect()}var gm=v(()=>{"use strict";Jt();am();Ue();J();Kt();lm();l(um,"analyzeGit");l(Nt,"fileExistsInProject");l(dm,"gatherStats");l(mm,"detectCommands");l(pm,"detectStack")});import fm from"node:fs/promises";import Do from"node:path";var rc,oc,hm,ym=v(()=>{"use strict";wt();H();Ue();J();rc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Do.join(r,n);await x(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=Do.basename(r);try{await _.read(s)}catch(n){A(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=Do.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 fm.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await fm.readFile(Do.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(!A(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}}},oc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[rc.contextFilesExist(t),rc.jsonFilesValid(t),rc.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(m)+1);a+=h.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,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}}}},hm=new oc});import wm from"node:fs/promises";import ic from"node:path";var ac,Fs,cc=v(()=>{"use strict";Gi();Zi();sd();od();dd();wa();Jt();lt();Yt();De();fe();vo();pn();Ms();ee();ps();ur();Oa();Ua();Wt();Ns();wt();Ja();z();J();Kt();Vd();em();mr();sm();Ls();rm();im();gm();ym();ac=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 M.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 wm.rm(ic.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Cs()).installed){let k=await To({autoRepair:!0});k.verified||G.warn(`Codex p. router not ready: ${k.message||"verification failed"}`)}try{n=await ts.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:oe(k)},error:`Context7 MCP is required but not ready: ${oe(k)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Eo(this.projectId);try{let k=await Po(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:oe(k)})}let[a,c,u,d]=await Promise.all([um(this.projectPath),dm(this.projectPath),mm(this.projectPath),pm(this.projectPath)]),p=t.full===!0,m,g=!0,h=new Set;if(!p&&rd(this.projectId))try{let{diff:k,currentHashes:$}=await Sa(this.projectPath,this.projectId),O=k.added.length+k.modified.length+k.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:k.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let ge=ed(k,this.projectId);h=td(ge.allAffected);let rt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=ge.allAffected.some(os=>{let Qs=os.substring(os.lastIndexOf("."));return rt.has(Qs)}),m={isIncremental:!0,filesChanged:O,filesUnchanged:k.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}ka(this.projectId,$)}catch(k){G.debug("Incremental detection failed, falling back to full sync",{error:oe(k)})}else try{let{currentHashes:k}=await Sa(this.projectPath,this.projectId);ka(this.projectId,k)}catch(k){G.debug("Hash computation failed (non-critical)",{error:oe(k)})}if(g)try{await Promise.all([Cu(this.projectPath,this.projectId),Zu(this.projectPath,this.projectId),ud(this.projectPath,this.projectId)])}catch(k){G.debug("File ranking index build failed (non-critical)",{error:oe(k)})}let S;try{let[k,$,O,ge,rt,Ts,os,Qs,Qn,Si,bi]=await Promise.all([Promise.resolve(Mt.getActive(this.projectId)).catch(()=>null),Je.getActive(this.projectId).catch(()=>null),Xe.getRecent(this.projectId,3).catch(()=>[]),Co.getMetrics(this.projectId).catch(()=>null),we.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Le.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Xe.getCount(this.projectId).catch(()=>0)]),Ti={backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,hasActiveTask:!!Qn},vi=k?k.patterns.map(se=>({name:se.name,description:se.description,location:se.locations?.[0]})):($?.patterns??[]).filter(se=>se.source!=="repo").map(se=>({name:se.name,description:se.description,location:se.location})),Oe=k?k.antiPatterns.map(se=>({issue:se.issue,file:se.files?.[0]??"multiple",suggestion:se.suggestion,severity:se.severity??"medium"})):($?.antiPatterns??[]).filter(se=>se.source!=="repo").map(se=>({issue:se.issue,file:se.file,suggestion:se.suggestion,severity:se.severity??"medium"})),jt=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,Zn={version:c.version,fileCount:c.fileCount,patterns:vi,antiPatterns:Oe,recentShipped:O.map(se=>({name:se.name,type:se.type??"feature",duration:se.duration,filesChanged:se.changes?.length})),velocity:ge?{avgPoints:ge.averageVelocity,trend:ge.velocityTrend,accuracy:ge.estimationAccuracy}:null,backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,knownGotchas:Qs?.knownGotchas??[],userPatterns:Qs?.patternsDiscovered??[],hasActiveTask:!!Qn,activeTaskDescription:Qn?.description??"",pausedTasks:os.map(se=>({description:se.description,pausedAt:se.pausedAt??""})),topBacklog:rt.slice(0,3).map(se=>({description:se.description,priority:se.priority??"medium"})),ideasCount:Si?.pending??0,shippedCount:bi};S=await om.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:jt,stack:d},Ti,Zn)}catch(k){G.debug("Native skill generation failed (non-critical)",{error:oe(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 Je.getActive(this.projectId),E={patterns:w?.patterns?.length||0,antiPatterns:w?.antiPatterns?.length||0,criticalAntiPatterns:w?.antiPatterns?.filter(k=>k.severity==="high").length||0},D=Date.now()-s,V=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Pe.installGlobalConfig(),await Pe.syncCommands();let F;try{let k=await M.readConfig(this.projectPath);F=await hm.verify(this.projectPath,this.globalPath,k?.verification)}catch(k){G.debug("Verification failed (non-critical)",{error:oe(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:E,syncMetrics:V,verification:F,incremental:m,generatedSkills:S}}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:oe(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>wm.mkdir(ic.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||b(),lastSync:b(),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=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await tm.generate(this.projectPath,n)}catch(o){G.debug("Local state generation failed (optional)",{error:oe(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=co(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:oe(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await wn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:oe(a)})}let i={};try{let a=co(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=go(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ld(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:oe(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 nm.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 Je.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){G.debug("Failed to save draft analysis (non-critical)",{error:oe(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Xe.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),we.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),kt.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=At.getStats(this.projectId);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:oe(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new cn,s=await qa.learnFromTaskHistory(this.projectId,e,t);try{let n=await Zd.getFeatureOutcomes(this.projectId);n.length>0&&await qa.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:oe(e)})}}async getCliVersion(){try{let e=ic.join(__dirname,"..","..","package.json");return(await Ee(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:oe(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:[]}}},Fs=new ac});function fw(){return"---"}function hw(){return`---
|
|
765
|
-
prjct v${
|
|
766
|
-
`)}function
|
|
766
|
+
`,"body")}];l(Dw,"buildFrontmatter");l(Iw,"buildSkillContent");yc=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=vr.join(kw.homedir(),".claude","skills");for(let c of hc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await Tr.rm(vr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Iw(c,o),d=vr.join(i,c.name),m=vr.join(d,"SKILL.md");await Tr.mkdir(d,{recursive:!0}),await Tr.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}catch(u){H.debug(`Failed to generate skill ${c.name}`,{error:ie(u)}),n.skipped.push({name:c.name,reason:ie(u)})}}let a=new Set(hc.map(c=>c.name));try{let c=await Tr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await Tr.rm(vr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&H.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return hc}},bm=new yc});var vm=v(()=>{"use strict"});import jw from"node:fs/promises";import Em from"node:path";var No,Pm=v(()=>{"use strict";B();No=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=Em.join(this.projectPath,"package.json"),t=await jw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Em.join(this.projectPath,e))}}});import wc from"node:path";async function Cm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await _("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await _("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await _("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await _("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
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 _('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
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${xs()}`}function L(...r){return Pc($w(),...r.filter(Boolean),Mw())}function Er(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
770
|
+
`)}function _m(r,e=""){return`\`\`\`${e}
|
|
767
771
|
${r}
|
|
768
|
-
\`\`\``}function
|
|
769
|
-
${e}`}function
|
|
770
|
-
`)}function
|
|
771
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
772
|
-
${
|
|
772
|
+
\`\`\``}function Ec(r,e){return`**${r}**: \`${e}\``}function Fo(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function Y(r,e,t=3){return`### ${r}
|
|
773
|
+
${e}`}function $e(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
774
|
+
`)}function Pr(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?`
|
|
775
|
+
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Om(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
|
|
776
|
+
${Er(t,s)}`}function Nm(r){return r.length===0?"":`### Relevant Files
|
|
773
777
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
774
|
-
`)}`}function
|
|
775
|
-
${
|
|
776
|
-
> ${e}`:`## ${r}`}function
|
|
777
|
-
|
|
778
|
-
`)}function
|
|
779
|
-
`))}var
|
|
780
|
-
Next:`));for(let o of n){let i=
|
|
781
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
782
|
-
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(
|
|
783
|
-
${
|
|
784
|
-
`),this)},progress(r,e,t){if(
|
|
785
|
-
`),this)}},f=
|
|
786
|
-
`));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
|
|
787
|
-
`)}function
|
|
778
|
+
`)}`}function de(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
779
|
+
${Er(e,t)}`}function rt(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 Er(t,s)}function we(r,e){return e?`## ${r}
|
|
780
|
+
> ${e}`:`## ${r}`}function Lm(r){return`> **WARNING:** ${r}`}function Pc(...r){return r.filter(Boolean).join(`
|
|
781
|
+
|
|
782
|
+
`)}function ht(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(`
|
|
783
|
+
`))}var Vs=v(()=>{"use strict";It();l($w,"mdHeader");l(Mw,"mdFooter");l(L,"mdOutput");l(Er,"mdTable");l(_m,"mdCodeBlock");l(Ec,"mdBadge");l(Fo,"mdCallout");l(Y,"mdSection");l($e,"mdList");l(Pr,"mdTaskHeader");l(Om,"mdSubtasks");l(Nm,"mdRelevantFiles");l(de,"mdNextSteps");l(rt,"mdStats");l(we,"mdDone");l(Lm,"mdWarn");l(Pc,"mdJoin");l(ht,"mdActionRequired")});import Cr from"chalk";function Pt(r,e={}){if(e.quiet)return;let t=Um[r]||"idle",s=Ns.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Fm[o]||o}));console.log(Cr.dim(`
|
|
784
|
+
Next:`));for(let o of n){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function Uo(r,e=!1){let t=Um[r]||"idle";return Ns.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Fm[n]||n}))}function xr(r){let e=Ns.getStateInfo(r);console.log(Cr.dim(`\u{1F4CD} State: ${Cr.white(r.toUpperCase())} - ${e.description}`))}var Fm,Um,vn=v(()=>{"use strict";Pa();Fm={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"},Um={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(Pt,"showNextSteps");l(Uo,"getNextSteps");l(xr,"showStateInfo")});import Bs from"chalk";var Hm,_w,Ow,Gt,Wm=v(()=>{"use strict";dt();Hm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],_w=80,Ow={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Hm,speed:_w},cli:{header:l(()=>`${Bs.cyan.bold("\u26A1")} ${Bs.cyan("prjct")}`,"header"),footer:l(()=>Bs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Bs.cyan("\u26A1")} ${Bs.cyan("prjct")} ${Bs.cyan(Hm[r%10])} ${Bs.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")=>zr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>zr(r).signature,"getSignature")},Gt=Ow});import ae from"chalk";function Fw(){return Nw[Lw]}var u0,Cc,Nw,Lw,Js,En,xc,Ct,bs,Uw,Hw,f,Qe=v(()=>{"use strict";Wm();Fs();To();To();u0=Gt.spinner.frames,Cc=Gt.spinner.speed,Nw={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}},Lw="compact";l(Fw,"getTierConfig");Js={success:ae.green("\u2713"),fail:ae.red("\u2717"),warn:ae.yellow("\u26A0"),info:ae.blue("\u2139"),debug:ae.dim("\u{1F527}"),bullet:ae.dim("\u2022"),arrow:ae.dim("\u2192"),check:ae.green("\u2713"),cross:ae.red("\u2717"),spinner:ae.cyan("\u25D0")},En=null,xc=0,Ct=!1,bs=l((r,e)=>{let t=e??(Fw().maxCharsPerLine||Ft.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Uw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Ft.CLEAR_WIDTH)}\r`):!0,"clear"),Hw={start(){return Ct||console.log(Gt.cli.header()),this},end(){return Ct||console.log(Gt.cli.footer()),this},spin(r){return Ct?this:(this.stop(),process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,bs(r,Ft.SPINNER_MSG))}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,bs(r,Ft.SPINNER_MSG))}
|
|
785
|
+
`),this))},done(r,e){if(this.stop(),!Ct){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=ae.dim(` [${s.join(" | ")}]`))}console.log(`${Js.success} ${bs(r,Ft.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Js.fail} ${bs(r,Ft.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Ha(r):r;return console.error(),console.error(`${Js.fail} ${e.message}`),e.file&&console.error(ae.dim(` File: ${e.file}`)),e.hint&&console.error(ae.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ae.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),Ct||console.log(`${Js.warn} ${bs(r,Ft.WARN_MSG)}`),this},info(r){return this.stop(),Ct||console.log(`${Js.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Ct&&e&&console.log(`${Js.debug} ${ae.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Ct)return this;let t=e.bullet||Js.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Ct||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(ae.dim(n)),console.log(ae.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(),Ct)return this;let t=e.split(`
|
|
786
|
+
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ae.dim(`\u250C${n}\u2510`)),console.log(`${ae.dim("\u2502")} ${ae.bold(r.padEnd(s))} ${ae.dim("\u2502")}`),console.log(ae.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ae.dim("\u2502")} ${o.padEnd(s)} ${ae.dim("\u2502")}`);return console.log(ae.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Ct?this:(console.log(`
|
|
787
|
+
${ae.bold(r)}`),console.log(ae.dim("\u2500".repeat(r.length))),this)},stop(){return En&&(clearInterval(En),En=null,Uw()),this},step(r,e,t){if(Ct)return this;this.stop();let s=ae.dim(`[${r}/${e}]`);return process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,`${s} ${bs(t,Ft.STEP_MSG)}`)}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,`${s} ${bs(t,Ft.STEP_MSG)}`)}
|
|
788
|
+
`),this)},progress(r,e,t){if(Ct)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ae.cyan("\u2588".repeat(n))+ae.dim("\u2591".repeat(o)),a=t?` ${bs(t,Ft.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(En=setInterval(()=>{process.stdout.write(`\r${Gt.cli.spin(xc++,`[${i}] ${s}%${a}`)}`)},Cc),this):(process.stdout.write(`${Gt.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
789
|
+
`),this)}},f=Hw});import Ww from"node:path";async function Ac(r,e){let t=Date.now()-e;await xe.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: ${Pn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
|
|
790
|
+
`));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 Pt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function Gm(r){try{let e=await Et.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=ct(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 Pn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Rc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Vm(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 Bm(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 | ${Pn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${po(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Rc(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: ${Pn(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(`
|
|
791
|
+
`)}function Jm(r,e){let t=[];t.push(`# Repository Analysis
|
|
788
792
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
789
|
-
`);let s=
|
|
793
|
+
`);let s=Ww.basename(e);if(t.push(`## Project: ${s}
|
|
790
794
|
`),t.push(`## Stack Detected
|
|
791
795
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
792
796
|
`),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
|
|
@@ -802,10 +806,10 @@ ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
802
806
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
803
807
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
804
808
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
805
|
-
`)}var
|
|
809
|
+
`)}var qm=v(()=>{"use strict";ss();go();Ws();q();vn();Qe();l(Ac,"showSyncResult");l(Gm,"getSessionActivity");l(Pn,"formatTokens");l(Rc,"formatDuration");l(Vm,"generateSparkline");l(Bm,"generateStatsMarkdown");l(Jm,"generateAnalysisSummary")});var zm,Km,Xm=v(()=>{"use strict";zm=["task","done","ship","resume","bug","enrich"],Km=["init","sync","pause","next","dash","history","undo","redo"]});import Xt from"chalk";function Gw(r){return Ym[r.toLowerCase()]||Ym.default}var Ym,Dc,Qm,Zm=v(()=>{"use strict";Ym={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(Gw,"getIcon");Dc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Xt.cyan(`
|
|
806
810
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
807
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
808
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
811
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Gw(t);console.log(Xt.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(Xt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(Xt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Xt.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?Xt.green("\u2713"):Xt.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${Xt.dim(`(${s})`)}
|
|
812
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${Xt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Xt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Qm=new Dc});import ep from"node:fs";import Ho from"node:path";function Vw(r){if(js()){let{Database:n}=kt("bun:sqlite");return new n(r,{create:!0})}let e=kt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var Ic,Bw,tp=v(()=>{"use strict";ur();l(Vw,"openDatabase");Ic=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ho.resolve(e):Ho.join(kt("node:os").homedir(),".prjct-cli");this.dbPath=Ho.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ho.dirname(this.dbPath);ep.existsSync(e)||ep.mkdirSync(e,{recursive:!0});let t=Vw(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(`
|
|
809
813
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
810
814
|
version INTEGER PRIMARY KEY,
|
|
811
815
|
name TEXT NOT NULL,
|
|
@@ -826,14 +830,14 @@ ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
826
830
|
INSERT OR REPLACE INTO mcp_health
|
|
827
831
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
828
832
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
829
|
-
`).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)}},
|
|
830
|
-
`)}function Wm(r){console.log($w(r))}var Gm,Vm=v(()=>{"use strict";Gm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(jw,"getDomainColor");l(Iw,"formatSubtaskLine");l($w,"renderSubtaskProgress");l(Wm,"printSubtaskProgress")});function _w(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 Ow(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Mw)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:_w(t)};return{detected:!1}}function Nw(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 Lw(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 Fw(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 Uw(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 Mw,Sc,Hw,Tn,Bm=v(()=>{"use strict";Mw=[{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(_w,"getHallucinationSuggestion");l(Ow,"detectHallucination");l(Nw,"isSimilarError");l(Lw,"analyzeErrorPattern");l(Fw,"generateEscalationMessage");l(Uw,"generateSuggestion");Sc=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=>Nw(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=Lw(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Fw(e,o,this.maxAttempts),suggestion:Uw(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 Ow(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}}},Hw=new Sc,Tn=Hw});function bc(r,e){let t=vr(e),s=bu[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 Gw(r,e){let t=vr(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Ww(r,e,t){let s=vr(t),n=bc(r,t),o=bc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Oo(r,e=fs){let t=vr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Vw(r,e),n=Bw(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=qw(o),a=Jw(o),c=zw(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Kw(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function zm(r,e,t=fs){let s=vr(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 Vw(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=Ww(i,n,e);if(!t.has(a)){let c=bc(i,e),u=Gw(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Bw(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Xw(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Tc(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 Jw(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 zw(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Tc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function qw(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 Kw(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Tc(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 Tc(r){if(!r.variance)return 0;let e=ft(r.estimatedDuration),t=ft(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function qm(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(`
|
|
831
|
-
`)}function
|
|
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)}},Bw=new Ic});import Jw from"node:fs/promises";import sp from"node:os";import Wo from"node:path";function qw(){try{let r=Wo.dirname(kt.resolve("prjct-cli/package.json"));return{command:"node",args:[Wo.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 as(){return process.env.PRJCT_TEST_MODE==="1"?Wo.join(sp.tmpdir(),"prjct-context7-test","mcp.json"):Wo.join(sp.homedir(),".claude","mcp.json")}async function np(r=as()){try{let e=await Jw.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 zw(r,e=as()){await le(e,r)}async function $c(r,e,t=as()){let s=await np(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await zw(s,t),{path:t,changed:i}}async function qs(r,e=as()){return!!(await np(e)).mcpServers?.[r]}var Go,jc,N0,Vo=v(()=>{"use strict";tp();U();B();Go="mcp-remote@0.1.38";l(qw,"getPrjctMcpConfig");jc={prjct:qw(),linear:{command:"npx",args:["-y",Go,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Go,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},N0={linear:`npx -y ${Go} https://mcp.linear.app/mcp`,jira:`npx -y ${Go} https://mcp.atlassian.com/v1/mcp`};l(as,"getClaudeMcpConfigPath");l(np,"readMcpConfig");l(zw,"writeMcpConfig");l($c,"upsertMcpServer");l(qs,"hasMcpServer")});import Ze from"chalk";function Kw(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%rp.length;return rp[t]}function Xw(r,e,t="\u25B6"){let s=Ze.dim(String(r+1).padStart(2)),o=Kw(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function Yw(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Xw(t,r[t]));return e.push(""),e.join(`
|
|
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 gk(r){if(!r.estimatedDuration)return 0;let e=St(r.estimatedDuration);if(e<=0)return 0;let t=cp[0],s=Number.POSITIVE_INFINITY;for(let n of cp){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Ar(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var cp,Nc=v(()=>{"use strict";gr();kr();q();l(_c,"getSprintStart");l(ik,"getSprintEnd");l(ak,"getSprintNumber");l(Bo,"calculateVelocity");l(lp,"projectCompletion");l(ck,"bucketBySprint");l(lk,"buildSprintVelocities");l(uk,"detectTrend");l(dk,"calculateOverallAccuracy");l(mk,"calculateAverageVelocity");l(pk,"detectEstimationPatterns");l(Oc,"parseVariancePercent");l(up,"formatVelocityContext");cp=[{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(gk,"derivePoints");l(Ar,"resolveConfig")});import fk from"node:fs/promises";import Jo from"node:path";async function xn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Lc(r),c=await kk(e),u=await Sk(e),d=[];for(let p of c){if(!i&&Tk(p))continue;let g=bk(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 Lc(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function kk(r){let e=[];async function t(s,n=""){try{let o=await fk.readdir(s,{withFileTypes:!0});for(let i of o){let a=Jo.join(s,i.name),c=Jo.join(n,i.name);if(i.isDirectory()){if(wk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Jo.extname(i.name).toLowerCase();yk.has(u)&&e.push(c)}}}catch(o){D(o)}}return l(t,"walk"),await t(r),e}async function Sk(r){let e=new Map;try{let{stdout:t}=await _(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
832
836
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
833
837
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
834
838
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
835
839
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
836
|
-
`).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
|
|
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 bk(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 k of e){d.includes(k)&&(o+=.3,n.push(`keyword:${k}`));for(let E of m)if(E.includes(k)||k.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[k,E]of Object.entries(hk))for(let R of E)if(d.includes(R)&&e.some(z=>E.includes(z)||z.includes(k)||k.includes(z))){i+=.4,n.push(`domain:${k}`);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=Jo.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(k=>k.startsWith("import:"))||n.push("import:1")),s){let k=s.get(r);k!==void 0&&(u=(k+1)/2,k>0?n.push("history:boosted"):k<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 Tk(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 hk,yk,wk,qo=v(()=>{"use strict";U();Le();hk={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"]},yk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),wk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(xn,"findRelevantFiles");l(Lc,"extractKeywords");l(kk,"getAllCodeFiles");l(Sk,"getGitRecency");l(bk,"scoreFile");l(Tk,"isTestFile")});async function dp(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 Pk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await Ek(r,t);return o=o.filter(c=>!Ck(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 Ek(r,e){let{stdout:t}=await _(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
837
841
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
838
842
|
NF {
|
|
839
843
|
count[$0]++
|
|
@@ -843,8 +847,8 @@ ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
843
847
|
for (f in count) print count[f], lastmod[f], f
|
|
844
848
|
}
|
|
845
849
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
846
|
-
`).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),
|
|
847
|
-
`).filter(Boolean),{stdout:n}=await
|
|
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),k=u/i,E=b*.6+k*.4,R;h<1?R="just now":h<24?R=`${h}h ago`:g<7?R=`${g}d ago`:g<30?R=`${Math.floor(g/7)}w ago`:R=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(E*100)/100,lastChanged:R,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Pk(r){let e="main";try{await _("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await _(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
|
|
851
|
+
`).filter(Boolean),{stdout:n}=await _(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
848
852
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
849
853
|
NF {
|
|
850
854
|
count[$0]++
|
|
@@ -854,15 +858,15 @@ ${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
854
858
|
for (f in count) print count[f], lastmod[f], f
|
|
855
859
|
}
|
|
856
860
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
857
|
-
`).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
|
|
858
|
-
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:
|
|
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),k=Math.floor(h/3600),E=Math.max(0,1-b/14),R=m/c,W=E*.5+R*.5,z;k<1?z="just now":k<24?z=`${k}h ago`:z=`${b}d ago`,o.push({path:g,changes:m,heatScore:Math.round(W*100)/100,lastChanged:z,lastChangedAt:new Date(p*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function Ck(r){let e=r.split("/").pop()||"";for(let t of vk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var vk,mp=v(()=>{"use strict";Le();vk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(dp,"getRecentFiles");l(Ek,"getHotFilesFromCommits");l(Pk,"getBranchOnlyFiles");l(Ck,"shouldIgnore")});function Fc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function pp(r,e){let t=xk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Rk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function fp(r,e){let t=Fc(r),s=Fc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=pp(n,Ak),a=gp.map(c=>({model:c,...pp(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Rk(i.total),byModel:a}}}function zo(r){let e=Fc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:gp.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var xk,Ak,gp,hp=v(()=>{"use strict";wo();xk={"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}},Ak="claude-sonnet-4.5";l(Fc,"countTokens");gp=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(pp,"calculateModelCost");l(Rk,"formatCostSaved");l(fp,"measureCompression");l(zo,"noCompression")});import Dk from"node:fs/promises";import An from"node:path";async function kp(r,e=process.cwd()){let t=An.isAbsolute(r)?r:An.join(e,r),s=An.resolve(e),n=An.resolve(t);if(!n.startsWith(s+An.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:zo("")};let o;try{o=await Dk.readFile(t,"utf-8")}catch(m){if(D(m))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:zo("")};throw m}let i=An.extname(r).toLowerCase(),a=Ik[i]||"unknown",c=_k[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:zo(o)};let u=Ok(o,c),d=u.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
862
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:fp(o,d)}}function Ok(r,e){let t=[],s=r.split(`
|
|
859
863
|
`),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(`
|
|
860
|
-
`).length,
|
|
861
|
-
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await
|
|
862
|
-
`).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=
|
|
863
|
-
`);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([
|
|
864
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let
|
|
865
|
-
`)}_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`}},
|
|
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:Nk(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function Nk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Ik,yp,jk,$k,Mk,wp,_k,Sp=v(()=>{"use strict";U();hp();Ik={".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"},yp=[{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}],jk=[{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}],$k=[{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}],Mk=[{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}],wp=[{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}],_k={typescript:yp,javascript:yp,python:jk,go:$k,rust:Mk,java:wp,csharp:wp,php:[],ruby:[],unknown:[]};l(kp,"extractSignatures");l(Ok,"extractFromContent");l(Nk,"cleanSignature")});import Uc from"node:path";var Lk,Fk,Hc,Uk,yt,Rn=v(()=>{"use strict";ye();vt();q();B();Lk="outcomes",Fk="outcomes.jsonl",Hc=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Uc.join(t,Lk)}getOutcomesPath(e){return Uc.join(this.getOutcomesDir(e),Fk)}async record(e,t){let s={...t,id:J()},n=this.getOutcomesPath(e);return await Ve(Uc.dirname(n)),await eu(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 Ie(t);if(!a.trim())return[];let c=a.trim().split(`
|
|
865
|
+
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await Ie(t);return s.trim()?s.trim().split(`
|
|
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=on(n.variance),i=St(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Uk=new Hc,yt=Uk});import{z as Me}from"zod";var Ko,Dn,Hk,bI,Wc,bp,Xo=v(()=>{"use strict";Ko=Me.string(),Dn=Me.object({primaryDomain:Ko,secondaryDomains:Me.array(Ko),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),Hk=Me.object({classification:Dn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),bI=Me.object({entries:Me.record(Me.string(),Hk),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Dn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Wc={entries:{},confirmedPatterns:[]},bp={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Gk from"node:fs/promises";import Ep from"node:path";function Tp(r){return $s(r.toLowerCase().trim())}async function vp(r){try{let e=Ep.join(r,"storage","classification-cache.json"),t=await Gk.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e)?Wc:(console.warn("[classifier] Failed to load cache:",y(e)),Wc)}}async function Vk(r,e){try{let t=Ep.join(r,"storage","classification-cache.json");await le(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function Bk(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||gs(s.classifiedAt,36e5)?null:s.classification}function Jk(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Gc,qk,Pp,Cp=v(()=>{"use strict";ar();Xo();U();Rs();B();Ms();l(Tp,"hashDescription");l(vp,"loadCache");l(Vk,"saveCache");l(Bk,"lookupCache");l(Jk,"lookupPatterns");Gc=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Tp(e),o=await vp(s),i=Bk(o,n,t);if(i)return{classification:i,source:"cache"};let a=Jk(o,n);return a?{classification:a,source:"history"}:{classification:bp,source:"heuristic"}}async confirmClassification(e,t,s){let n=Tp(e),o=await vp(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Vk(s,o))}},qk=new Gc,Pp=qk});import zk from"node:fs/promises";import Kk from"node:path";var Vc,Xk,Yo,Bc=v(()=>{"use strict";Nc();Ce();ye();kr();yn();fr();ft();qo();mp();Sp();U();Le();Rn();Cp();Vc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await j.getProjectId(s),o=A.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((z,w)=>{if(z.status==="fulfilled")return z.value;m.push(d[w]),console.warn(`Context tool "${d[w]}" failed: ${y(z.reason)}`)}),[g,h,b]=p,k={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},E=this.shouldFragment(a,t),R=null;E&&e==="task"&&(R=await this.createSubtasks(t,a,[],n));let W=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:E,subtasks:R,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:b??null,contextDegradation:k,rpiContext:W}}resolveRpiPhase(e){try{let{prjctDb:t}=(te(),at(to)),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),xn(e,t,{maxFiles:10,minScore:.15}),dp(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await kp(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
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([_("git branch --show-current",{cwd:e}),_("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
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=Lt.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 qe.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 yt.getAll(e);if(t.length===0)return null;let s=Bo(t,Ss);return s.sprints.length===0?null:up(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=Kk.join(e,"analysis","repo-analysis.json"),s=await zk.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=A.getGlobalProjectPath(t),{classification:o}=await Pp.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 O.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?"...":""}`}},Xk=new Vc,Yo=Xk});function Yk(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 Jc,Qk,He,xp=v(()=>{"use strict";vt();q();Fs();Fs();l(Yk,"generateApprovalPrompt");Jc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Ga.includes(e)}isDestructive(e){return Va.includes(e)}isToolAllowedInPlanning(e){return Po.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Po.includes(s)):t}startPlanning(e,t,s){let n={id:J(),projectId:e,command:t,params:s,status:re.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?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.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===re.APPROVED?s.approvedAt=S():t===re.EXECUTING?s.executionStartedAt=S():(t===re.COMPLETED||t===re.ABORTED)&&(s.completedAt=S()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=re.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=re.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!==re.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=re.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=re.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!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=S(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.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!==re.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=re.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=re.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 Yk(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
|
|
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`}},Qk=new Jc,He=Qk});var qc,Zk,Ap,Rp=v(()=>{"use strict";q();Rn();qc=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await yt.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 yt.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 yt.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,k)=>b+k.qualityScore,0)/a,m=i.filter(b=>{if(!b.variance)return!1;let k=on(b.variance),E=St(b.estimatedDuration);return E===0?!1:Math.abs(k)/E<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let b of i.filter(k=>k.completedAsPlanned))for(let k of b.tags||[])g.set(k,(g.get(k)||0)+1);let h=[...g.entries()].sort((b,k)=>k[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 yt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>on(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=>on(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 yt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+St(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}},Zk=new qc,Ap=Zk});var Mp={};Jt(Mp,{AgentAssignmentSchema:()=>Dp,OUTPUT_SCHEMAS:()=>jp,SubtaskBreakdownSchema:()=>Ip,TaskClassificationSchema:()=>Dn,renderSchemaForPrompt:()=>eS});import{z as ze}from"zod";function eS(r){let e=jp[r];return e?`## OUTPUT FORMAT
|
|
866
870
|
|
|
867
871
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
868
872
|
|
|
@@ -871,10 +875,10 @@ ${e.example}
|
|
|
871
875
|
\`\`\`
|
|
872
876
|
|
|
873
877
|
Fields:
|
|
874
|
-
${
|
|
875
|
-
`)}return"(see example above)"}function
|
|
876
|
-
... (truncated to ~${e} tokens)`}function
|
|
877
|
-
`);return
|
|
878
|
+
${tS(e.schema)}`:null}function tS(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${$p(s)}`).join(`
|
|
879
|
+
`)}return"(see example above)"}function $p(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 ${$p(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var Dp,Ip,jp,_p=v(()=>{"use strict";Xo();Xo();Dp=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),Ip=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:Ko,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),jp={classification:{schema:Dn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Dp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Ip,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(eS,"renderSchemaForPrompt");l(tS,"describeSchema");l($p,"describeField")});import Op from"node:fs/promises";import In from"node:path";function Qo(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
880
|
+
... (truncated to ~${e} tokens)`}function Np(r){return Math.ceil(r.length/4)}var zc,Kc,Xc,sS,Lp,Fp=v(()=>{"use strict";wo();Ht();ft();U();B();It();Rp();Os();zc={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Qo,"truncateToTokenBudget");l(Np,"estimateTokens");Kc=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...zc,...e}}addSection(e,t){let s=Qo(e,t),n=Np(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Qo(s,o);return this.used+=Np(i),i}return this.used+=n,s}},Xc=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 Op.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=gt(`global/modules/${e}`);if(t)return t;let s=In.join(lt,"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=gn("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=gt(n);if(o){let i=In.basename(n,".md");t[i]=o}}}else{let n=In.join(lt,"templates","checklists");if(await C(n)){let o=(await Op.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=In.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([O.read(e),pe.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 Ap.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(`
|
|
881
|
+
`);return Qo(n,zc.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=In.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}
|
|
878
882
|
`),n.role&&g.push(`Role: ${n.role}
|
|
879
883
|
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
880
884
|
`),g.push(`
|
|
@@ -882,40 +886,40 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
882
886
|
|
|
883
887
|
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
884
888
|
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
885
|
-
`);let
|
|
886
|
-
`);let E=t.projectPath;if(E){let
|
|
889
|
+
`);let k=t;(k.params?.task||k.params?.description)&&g.push(`INPUT: ${k.params.task||k.params.description}
|
|
890
|
+
`);let E=t.projectPath;if(E){let M=[`project: ${In.basename(E)}`,`path: ${E}`,"git: true"];u?.realContext?.gitBranch&&M.push(`branch: ${u.realContext.gitBranch}`),M.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
|
|
887
891
|
<env>
|
|
888
|
-
${
|
|
892
|
+
${M.join(`
|
|
889
893
|
`)}
|
|
890
894
|
</env>
|
|
891
|
-
`)}if(u){let
|
|
895
|
+
`)}if(u){let w=u.sealedAnalysis;if(g.push(`
|
|
892
896
|
## PROJECT ANALYSIS (Sealed)
|
|
893
897
|
`),g.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
894
898
|
`),g.push(`**Primary Domain**: ${u.primaryDomain}
|
|
895
899
|
`),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
896
|
-
`),
|
|
897
|
-
`),
|
|
898
|
-
`),
|
|
899
|
-
`),
|
|
900
|
-
`),
|
|
901
|
-
`),g.push(`**Files Analyzed**: ${
|
|
902
|
-
`),g.push(`**Analysis Status**: ${
|
|
903
|
-
`),!
|
|
900
|
+
`),w&&(w.languages?.length>0&&g.push(`**Languages**: ${w.languages.join(", ")}
|
|
901
|
+
`),w.frameworks?.length>0&&g.push(`**Frameworks**: ${w.frameworks.join(", ")}
|
|
902
|
+
`),w.packageManager&&g.push(`**Package Manager**: ${w.packageManager}
|
|
903
|
+
`),w.sourceDir&&g.push(`**Source Dir**: ${w.sourceDir}
|
|
904
|
+
`),w.testDir&&g.push(`**Test Dir**: ${w.testDir}
|
|
905
|
+
`),g.push(`**Files Analyzed**: ${w.fileCount}
|
|
906
|
+
`),g.push(`**Analysis Status**: ${w.status}${w.commitHash?` (commit: ${w.commitHash.slice(0,8)})`:""}
|
|
907
|
+
`),!m)){if(w.patterns?.length>0){g.push(`
|
|
904
908
|
### Code Patterns (Follow These)
|
|
905
|
-
`);for(let
|
|
906
|
-
`)}if(
|
|
909
|
+
`);for(let M of w.patterns)g.push(`- **${M.name}**: ${M.description}${M.location?` (${M.location})`:""}
|
|
910
|
+
`)}if(w.antiPatterns?.length>0){g.push(`
|
|
907
911
|
### Anti-Patterns (Avoid These)
|
|
908
|
-
`);for(let
|
|
912
|
+
`);for(let M of w.antiPatterns)g.push(`- **${M.issue}** in \`${M.file}\` \u2014 ${M.suggestion}
|
|
909
913
|
`)}}g.push(`
|
|
910
|
-
`)}if(!
|
|
911
|
-
`),g.push(
|
|
914
|
+
`)}if(!m){let w=s?.codePatterns||"";if(b.patterns&&w&&w.trim()){let N=this.extractPatternSummary(w);N&&(g.push(`## CODE PATTERNS
|
|
915
|
+
`),g.push(N),g.push(`
|
|
912
916
|
Full patterns: Read analysis/patterns.md
|
|
913
|
-
`))}let
|
|
917
|
+
`))}let M=s?.analysis||"";if(b.patterns&&M&&M.trim()){let N=M.match(/Stack[:\s]+([^\n]+)/i)||M.match(/Technology[:\s]+([^\n]+)/i),fe=N?N[1].trim():"detected";g.push(`
|
|
914
918
|
## STACK
|
|
915
|
-
Stack: ${
|
|
916
|
-
`),
|
|
917
|
-
`)}}if(
|
|
918
|
-
`),g.push(
|
|
919
|
+
Stack: ${fe}
|
|
920
|
+
`),w||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
921
|
+
`)}}if(b.modules.length>0)for(let w of b.modules){let M=await this.loadModule(w);M&&(g.push(`
|
|
922
|
+
`),g.push(M))}if(c?.isPlanning&&(g.push(`
|
|
919
923
|
## PLAN MODE
|
|
920
924
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
921
925
|
`),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
|
|
@@ -925,79 +929,79 @@ Show changes, list affected files, ask for confirmation.
|
|
|
925
929
|
`),E){g.push(`
|
|
926
930
|
## CONSTRAINTS
|
|
927
931
|
SCOPE: Only files in \`${E}\` are accessible.
|
|
928
|
-
`);let
|
|
929
|
-
`),
|
|
930
|
-
`)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let
|
|
932
|
+
`);let w=u?.sealedAnalysis;if(w){let M=[...w.languages||[],...w.frameworks||[]].filter(Boolean);M.length>0&&g.push(`AVAILABLE: ${M.join(", ")}
|
|
933
|
+
`),w.packageManager&&g.push(`PACKAGE MANAGER: ${w.packageManager}
|
|
934
|
+
`)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let w=u.contextDegradation;g.push(`
|
|
931
935
|
### CONTEXT DEGRADATION NOTICE
|
|
932
936
|
|
|
933
|
-
`),g.push(`**Level**: ${
|
|
934
|
-
`),g.push(`**Unavailable**: ${
|
|
937
|
+
`),g.push(`**Level**: ${w.level}
|
|
938
|
+
`),g.push(`**Unavailable**: ${w.failedTools.join(", ")}
|
|
935
939
|
`),g.push(`Some context tools failed. Explore the codebase manually for missing context.
|
|
936
940
|
|
|
937
|
-
`)}if(u?.realContext){let
|
|
941
|
+
`)}if(u?.realContext){let w=u.realContext;if(g.push(`
|
|
938
942
|
### CODEBASE CONTEXT
|
|
939
943
|
|
|
940
|
-
`),g.push(`**Git State**: Branch \`${
|
|
944
|
+
`),g.push(`**Git State**: Branch \`${w.gitBranch}\` | ${w.gitStatus}
|
|
941
945
|
|
|
942
|
-
`),
|
|
946
|
+
`),w.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
|
|
943
947
|
`),g.push(`| Score | File | Why |
|
|
944
948
|
`),g.push(`|-------|------|-----|
|
|
945
|
-
`);for(let
|
|
949
|
+
`);for(let M of w.relevantFiles.slice(0,8))g.push(`| ${M.score} | ${M.path} | ${M.reason} |
|
|
946
950
|
`);g.push(`
|
|
947
|
-
`)}if(
|
|
948
|
-
`);for(let
|
|
949
|
-
// ${
|
|
950
|
-
${
|
|
951
|
+
`)}if(w.signatures.length>0){g.push(`**Code Signatures** (top files):
|
|
952
|
+
`);for(let M of w.signatures)g.push(`\`\`\`typescript
|
|
953
|
+
// ${M.path}
|
|
954
|
+
${M.content}
|
|
951
955
|
\`\`\`
|
|
952
956
|
`);g.push(`
|
|
953
|
-
`)}if(
|
|
957
|
+
`)}if(w.recentFiles.length>0){g.push("**Recently Changed**: ");let M=w.recentFiles.slice(0,5).map(N=>`${N.path} (${N.lastChanged})`).join(", ");g.push(`${M}
|
|
954
958
|
|
|
955
|
-
`)}}let
|
|
956
|
-
## FILES: ${
|
|
959
|
+
`)}}let R=t.files||[];if(R.length>0){let w=R.slice(0,5).join(", ");g.push(`
|
|
960
|
+
## FILES: ${R.length} available. Top: ${w}
|
|
957
961
|
`),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
958
962
|
|
|
959
963
|
`)}else E&&g.push(`
|
|
960
964
|
## PROJECT: ${E}
|
|
961
965
|
Read files before modifying.
|
|
962
966
|
|
|
963
|
-
`);let
|
|
967
|
+
`);let W=this.filterRelevantState(s);if(W&&(g.push(`
|
|
964
968
|
## PRJCT STATE (Project Management Data)
|
|
965
|
-
`),g.push(
|
|
969
|
+
`),g.push(W),g.push(`
|
|
966
970
|
`)),u?.velocityContext&&(g.push(`
|
|
967
971
|
### VELOCITY (Historical Estimation Data)
|
|
968
972
|
|
|
969
973
|
`),g.push(u.velocityContext),g.push(`
|
|
970
974
|
|
|
971
|
-
`)),o&&Object.keys(o).some(
|
|
975
|
+
`)),o&&Object.keys(o).some(w=>o[w])){g.push(`
|
|
972
976
|
## PROJECT DEFAULTS (apply automatically)
|
|
973
|
-
`);for(let[
|
|
977
|
+
`);for(let[w,M]of Object.entries(o))M&&g.push(`- ${w}: ${M}
|
|
974
978
|
`)}if(i?.plan&&i.plan.length>0){if(g.push(`
|
|
975
979
|
## THINK FIRST (reasoning from analysis)
|
|
976
980
|
`),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
|
|
977
|
-
`);for(let
|
|
981
|
+
`);for(let w of i.conclusions)g.push(` \u2192 ${w}
|
|
978
982
|
`)}g.push(`Plan:
|
|
979
|
-
`);for(let
|
|
983
|
+
`);for(let w=0;w<i.plan.length;w++)g.push(` ${w+1}. ${i.plan[w]}
|
|
980
984
|
`);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
981
|
-
`)}if(!
|
|
985
|
+
`)}if(!p&&a&&a.length>0){g.push(`
|
|
982
986
|
## CONTEXT (apply these)
|
|
983
|
-
`);for(let
|
|
984
|
-
`),
|
|
985
|
-
`)}if(u?.rpiContext){let
|
|
987
|
+
`);for(let w of a)g.push(`- **${w.title}**: ${w.content}
|
|
988
|
+
`),w.tags&&w.tags.length>0&&g.push(` Tags: ${w.tags.join(", ")}
|
|
989
|
+
`)}if(u?.rpiContext){let w=u.rpiContext;switch(g.push(`
|
|
986
990
|
### RPI PHASE
|
|
987
991
|
|
|
988
|
-
`),
|
|
992
|
+
`),w.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.
|
|
989
993
|
`);break;case"plan":g.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
|
|
990
|
-
`),
|
|
994
|
+
`),w.researchDoc&&g.push(`
|
|
991
995
|
<research-context>
|
|
992
|
-
${
|
|
996
|
+
${w.researchDoc}
|
|
993
997
|
</research-context>
|
|
994
998
|
`);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
|
|
995
|
-
`),
|
|
999
|
+
`),w.planDoc&&g.push(`
|
|
996
1000
|
<plan-context>
|
|
997
|
-
${
|
|
1001
|
+
${w.planDoc}
|
|
998
1002
|
</plan-context>
|
|
999
|
-
`),
|
|
1000
|
-
**Scoped Files**: ${
|
|
1003
|
+
`),w.scopedFiles&&w.scopedFiles.length>0&&g.push(`
|
|
1004
|
+
**Scoped Files**: ${w.scopedFiles.map(M=>`\`${M}\``).join(", ")}
|
|
1001
1005
|
`);break}g.push(`
|
|
1002
1006
|
`)}if(g.push(`
|
|
1003
1007
|
---
|
|
@@ -1006,31 +1010,31 @@ ${k.planDoc}
|
|
|
1006
1010
|
|
|
1007
1011
|
`),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
|
|
1008
1012
|
`),g.push(`|---|--------|-------------|--------|
|
|
1009
|
-
`);for(let
|
|
1010
|
-
`)}let
|
|
1011
|
-
**FOCUS ON SUBTASK #${
|
|
1012
|
-
`),g.push(`Agent: ${
|
|
1013
|
-
`),
|
|
1014
|
-
`),
|
|
1013
|
+
`);for(let M of u.subtasks){let N=M.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":M.status==="completed"?"\u2705 Done":M.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${M.order} | ${M.domain} | ${M.description} | ${N} |
|
|
1014
|
+
`)}let w=u.subtasks.find(M=>M.status==="in_progress");if(w&&(g.push(`
|
|
1015
|
+
**FOCUS ON SUBTASK #${w.order}**: ${w.description}
|
|
1016
|
+
`),g.push(`Agent: ${w.agent} | Domain: ${w.domain}
|
|
1017
|
+
`),w.dependsOn.length>0&&g.push(`Dependencies: ${w.dependsOn.join(", ")}
|
|
1018
|
+
`),w.handoff)){let M=w.handoff;g.push(`
|
|
1015
1019
|
### Previous Subtask Handoff
|
|
1016
1020
|
|
|
1017
|
-
`),g.push(`**From:** ${
|
|
1021
|
+
`),g.push(`**From:** ${M.fromSubtask}
|
|
1018
1022
|
|
|
1019
1023
|
`),g.push(`**What was done:**
|
|
1020
|
-
`);for(let
|
|
1021
|
-
`);if(
|
|
1024
|
+
`);for(let N of M.whatWasDone)g.push(`- ${N}
|
|
1025
|
+
`);if(M.filesChanged.length>0){g.push(`
|
|
1022
1026
|
**Files changed:**
|
|
1023
|
-
`);for(let
|
|
1027
|
+
`);for(let N of M.filesChanged)g.push(`- \`${N.path}\` (${N.action})
|
|
1024
1028
|
`)}g.push(`
|
|
1025
1029
|
**Context for this subtask:**
|
|
1026
|
-
${
|
|
1030
|
+
${M.outputForNextAgent}
|
|
1027
1031
|
`)}g.push(`
|
|
1028
|
-
`)}let
|
|
1029
|
-
${
|
|
1030
|
-
`)}if(
|
|
1032
|
+
`)}let z=this.getSchemaTypeForCommand(h);if(z){let{renderSchemaForPrompt:w}=await Promise.resolve().then(()=>(_p(),Mp)),M=w(z);M&&g.push(`
|
|
1033
|
+
${M}
|
|
1034
|
+
`)}if(b.checklist){let w=await this.loadChecklistRouting(),M=await this.loadChecklists();w&&Object.keys(M).length>0&&(g.push(`
|
|
1031
1035
|
## QUALITY CHECKLISTS
|
|
1032
1036
|
`),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1033
|
-
`),g.push(`Available: ${Object.keys(
|
|
1037
|
+
`),g.push(`Available: ${Object.keys(M).join(", ")}
|
|
1034
1038
|
`),g.push(`Path: templates/checklists/{name}.md
|
|
1035
1039
|
`),g.push(`Use Read tool to load checklists you determine are relevant.
|
|
1036
1040
|
`))}return g.push(`
|
|
@@ -1038,7 +1042,7 @@ ${$}
|
|
|
1038
1042
|
`),g.push(`- Be concise. No preamble, no filler.
|
|
1039
1043
|
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1040
1044
|
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1041
|
-
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new
|
|
1045
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new Kc({totalPrompt:zc.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}
|
|
1042
1046
|
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
1043
1047
|
|
|
1044
1048
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
@@ -1055,13 +1059,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
|
1055
1059
|
`);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
|
|
1056
1060
|
Avoid:
|
|
1057
1061
|
${a}`)}let o=t.join(`
|
|
1058
|
-
`);return
|
|
1059
|
-
`+
|
|
1060
|
-
`+
|
|
1061
|
-
`+
|
|
1062
|
-
`+
|
|
1063
|
-
`+
|
|
1064
|
-
`}},
|
|
1062
|
+
`);return Qo(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},sS=new Xc,Lp=sS});import Yc from"node:fs/promises";import nS from"node:os";import Qc from"node:path";function Up(){let r=process.env.PRJCT_CLI_HOME?.trim()||Qc.join(nS.homedir(),".prjct-cli");return Qc.join(r,".running")}async function rS(r){try{let e=Up(),t=Qc.dirname(e);await C(t)||await Yc.mkdir(t,{recursive:!0}),await Yc.writeFile(e,`/p:${r}`)}catch{}}async function oS(){try{let r=Up();await C(r)&&await Yc.unlink(r)}catch{}}var Zc,iS,Zo,el=v(()=>{"use strict";Xm();U();Zm();B();Vo();ip();Zr();ap();ao();Bc();xp();Fp();Os();l(Up,"getRunningFilePath");l(rS,"signalStart");l(oS,"signalEnd");Zc=class{static{l(this,"CommandExecutor")}async signalStart(e){await rS(e)}async signalEnd(){await oS()}requiresOrchestration(e){return zm.includes(e)?!0:!Km.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Cn.shouldEscalate(e,n)){let o=Cn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ru.load(e),i=await Is.build(s,t),a=He.requiresPlanning(e),c=He.isDestructive(e),u=He.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=He.startPlanning(i.projectId,e,t):u&&(d=He.getActivePlan(i.projectId));let m=t.task||t.description||"",p=null;if(this.requiresOrchestration(e)&&m)try{if(p=await Yo.execute(e,m,s),p.detectedDomains.length>0&&Qm.orchestrate(p.detectedDomains),p.requiresFragmentation&&p.subtasks){let N=p.subtasks.map(fe=>({id:fe.id,domain:fe.domain,description:fe.description,status:fe.status}));op(N)}}catch(N){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(N)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await Is.loadState(i),b=await qs("prjct"),k=null,E=null;i.projectId&&(k={commit_footer:await nt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await nt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await nt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await nt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},b||(E=await nt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let R={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:He.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},w=(await(dt(),at(jt)).getActiveProvider()).name==="claude",M=await Lp.build(o,g,h,null,k,null,E,R,p,{skipNativeContext:w,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),Cn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:M,agenticDelegation:!0,agenticMode:!0,learnedPatterns:k,relevantMemories:E,orchestratorContext:p,memory:{create:l(N=>nt.createMemory(i.projectId,N),"create"),autoRemember:l((N,fe,Ne)=>nt.autoRemember(i.projectId,N,fe,Ne),"autoRemember"),search:l(N=>nt.searchMemories(i.projectId,N),"search"),findByTags:l(N=>nt.findByTags(i.projectId,N),"findByTags"),getStats:l(()=>nt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(N=>He.recordGatheredInfo(i.projectId,N),"recordInfo"),setAnalysis:l(N=>He.setAnalysis(i.projectId,N),"setAnalysis"),propose:l(N=>He.proposePlan(i.projectId,N),"propose"),approve:l(N=>He.approvePlan(i.projectId,N),"approve"),reject:l(N=>He.rejectPlan(i.projectId,N),"reject"),getApprovalPrompt:l(()=>He.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>He.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>He.getNextStep(i.projectId),"getNextStep"),completeStep:l(N=>He.completeStep(i.projectId,N),"completeStep"),failStep:l(N=>He.failStep(i.projectId,N),"failStep"),abort:l(N=>He.abortPlan(i.projectId,N),"abort"),getStatus:l(()=>He.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>He.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Cn.recordAttempt(e,n,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Cn.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}}}},iS=new Zc,Zo=iS});import aS from"node:https";import cS from"node:os";import tl from"node:path";import Vt from"chalk";var sl,ei,nl=v(()=>{"use strict";U();B();sl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=tl.join(cS.homedir(),".prjct-cli","config"),this.cacheFile=tl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=tl.join(__dirname,"..","..","package.json");return(await Pe(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=aS.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 Pe(this.cacheFile)}catch{}return null}async writeCache(e){try{await le(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:`
|
|
1063
|
+
`+Vt.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")+`
|
|
1064
|
+
`+Vt.yellow("\u2502")+" "+Vt.bold("Update available!")+" "+Vt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Vt.yellow("\u2502")+`
|
|
1065
|
+
`+Vt.yellow("\u2502")+" "+Vt.yellow("\u2502")+`
|
|
1066
|
+
`+Vt.yellow("\u2502")+" Run: "+Vt.cyan("npm update -g prjct-cli")+" "+Vt.yellow("\u2502")+`
|
|
1067
|
+
`+Vt.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")+`
|
|
1068
|
+
`}},ei=sl});import Hp from"node:path";async function dS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(Hp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(Hp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function mS(){return{...lS}}function pS(){return{...uS}}async function Wp(){return ti||(ti=await dS()?mS():pS(),ti)}var ti,lS,uS,Gp=v(()=>{"use strict";B();ti=null,lS={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}},uS={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(dS,"isClaudeEnvironment");l(mS,"getClaudeAgent");l(pS,"getTerminalAgent");l(Wp,"detect")});import si from"node:fs/promises";var rl,Vp,Bp=v(()=>{"use strict";U();B();rl=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 si.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 si.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 si.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await si.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1065
1069
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
1066
1070
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1067
1071
|
|
|
@@ -1106,10 +1110,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
1106
1110
|
|
|
1107
1111
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
1108
1112
|
|
|
1109
|
-
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}}},
|
|
1110
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n
|
|
1111
|
-
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
|
|
1112
|
-
`);
|
|
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}}},Vp=rl});function Jp(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&fS.has(e.code))return!0;if(e.code&&zp.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 hS(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&zp.has(e.code))}function qp(r,e,t){let s=Ts.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Ts.delete(r),!1):!0:!1}function ol(r,e){let t=Ts.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Ts.set(r,t)}function yS(r){Ts.delete(r)}var fS,zp,Ts,ni,Kp,n$,Xp=v(()=>{"use strict";fS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),zp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Jp,"isTransientError");l(hS,"isPermanentError");Ts=new Map;l(qp,"isCircuitOpen");l(ol,"recordFailure");l(yS,"recordSuccess");ni=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(qp(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 yS(t),o}catch(o){if(s=o,n++,hS(o))throw ol(t,this.options.circuitBreakerThreshold),o;if(!(Jp(o)&&n<this.options.maxAttempts))throw ol(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 ol(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Jp(e)}isCircuitOpen(e){return qp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Ts.get(e)}resetCircuit(e){Ts.delete(e)}resetAllCircuits(){Ts.clear()}},Kp=new ni({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),n$=new ni({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var wS,il,ri,Yp=v(()=>{"use strict";Yt();Gp();Bp();Xp();wS=["claude"],il=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Kp.execute(async()=>{if(this.agentInfo=await Wp(),!this.agentInfo?.isSupported)throw rr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!wS.includes(e))throw rr.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Vp,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},ri=new il});var al,jn,cl=v(()=>{"use strict";al=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},jn=new al});var ll,et,ul=v(()=>{"use strict";te();ll=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();$.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1114
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=$.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=$.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 $.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),$.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 $.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}}},et=new ll});function dl(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 ml,Ae,oi=v(()=>{"use strict";ul();te();l(dl,"rowToRule");ml=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)
|
|
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?dl(s):null}getRulesForCommand(e,t){let s=et.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(dl)}getAllRules(e){return P.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(dl)}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}},Ae=new ml});import ot from"node:path";async function kS(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(ot.join(r,"pnpm-lock.yaml"))?"pnpm":await C(ot.join(r,"yarn.lock"))?"yarn":await C(ot.join(r,"bun.lockb"))||await C(ot.join(r,"bun.lock"))?"bun":(await C(ot.join(r,"package-lock.json")),"npm")}function Qp(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function SS(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function $n(r,e){for(let n of bS)if(await C(ot.join(r,n)))return n;let s=(e??await ps(r)).find(n=>n.endsWith(TS));if(s)return s}async function cs(r){for(let e of vS)if(await C(ot.join(r,e)))return e}async function ii(r){let e=ot.join(r,"package.json"),t=await Pe(e,null);if(t){let a=await kS(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Qp(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Qp(a,"typecheck")}),c.test&&(u.test={tool:a,command:SS(a)}),u.versionFile=await $n(r),u.changelogFile=await cs(r),u}if(await C(ot.join(r,"pytest.ini"))){let a=await $n(r),c=await cs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await Ie(ot.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await $n(r),c=await cs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(ot.join(r,"Cargo.toml"))){let a=await cs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(ot.join(r,"go.mod"))){let a=await $n(r),c=await cs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await ps(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $n(r,n),c=await cs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(ot.join(r,"pom.xml"))){let a=await cs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(ot.join(r,"gradlew"))&&(await C(ot.join(r,"build.gradle"))||await C(ot.join(r,"build.gradle.kts")))){let a=await cs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $n(r),i=await cs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var bS,TS,vS,pl=v(()=>{"use strict";B();l(kS,"detectPackageManager");l(Qp,"pmRun");l(SS,"pmTest");bS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],TS=".csproj",vS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($n,"detectVersionFile");l(cs,"detectChangelogFile");l(ii,"detectProjectCommands")});import*as ce from"@clack/prompts";import zs from"chalk";var ai,Zp,Rr,eg=v(()=>{"use strict";B();Qe();ai=[{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."}],Zp=[{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"}],Rr=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(){ce.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 ce.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=ai.findIndex(s=>s.value===this.detectedType),t=await ce.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:ai.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?ai[e].value:void 0});return ce.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ce.multiselect({message:"Which AI agents do you use?",options:Zp.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ce.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);ce.note(e,"Detected stack");let t=await ce.confirm({message:"Is this stack correct?",initialValue:!0});if(ce.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ce.group({language:l(()=>ce.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ce.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 ce.group({verbosity:l(()=>ce.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(()=>ce.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(`
|
|
1116
|
+
`);ce.note(e,"Configuration Summary");let t=await ce.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ce.isCancel(t)||!t?(ce.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 ms(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 ms(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Le(),nu));await n("which codex"),s.push("codex")}catch{await ms(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,ce.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return ai.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Zp.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 tg={};Jt(tg,{PlanningCommands:()=>Xs});import ci from"node:fs/promises";import Ks from"node:path";async function ES(){if(!gl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ui(),sg));gl=new r}return gl}var gl,Xs,li=v(()=>{"use strict";Vr();ss();Ce();ye();vt();ws();Ht();oi();U();q();B();Vs();vn();Qe();pl();eg();xt();gl=null;l(ES,"getAnalysisCommands");Xs=class extends ke{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 j.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 Rr(t).runNonInteractive());else if(a=await new Rr(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await ln(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await j.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
|
|
1113
1117
|
|
|
1114
1118
|
No current task. Use \`/p:now\` to set focus.
|
|
1115
1119
|
`,"core/next.md":`# NEXT
|
|
@@ -1129,17 +1133,17 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1129
1133
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1130
1134
|
|
|
1131
1135
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1132
|
-
`,"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[E,
|
|
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[E,R]of Object.entries(g))await ci.writeFile(Ks.join(p,E),R);let h=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!h){f.step(3,4,"Analyzing project...");let E=await ES();if((await E.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await E.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let k=s.idea;if(h&&!b){if(!k)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 E=Ks.join(p,"planning","architect-session.md"),R=`# Architect Session
|
|
1133
1137
|
|
|
1134
1138
|
## Idea
|
|
1135
|
-
${
|
|
1139
|
+
${k}
|
|
1136
1140
|
|
|
1137
1141
|
## Status
|
|
1138
1142
|
Initialized - awaiting stack recommendation
|
|
1139
1143
|
|
|
1140
1144
|
Generated: ${new Date().toLocaleString()}
|
|
1141
|
-
`;return await
|
|
1142
|
-
`);let n=await this.getGlobalProjectPath(t),o=
|
|
1145
|
+
`;return await ci.writeFile(E,R),await xe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:k,wizard:a}}return await xe.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 j.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=J();return await pe.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 j.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 pe.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(Y("Bug Reported",e),rt({Severity:i,Priority:c}),de([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Pt("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
|
|
1146
|
+
`);let n=await this.getGlobalProjectPath(t),o=Ks.join(n,"planning","architect-session.md"),i;try{i=await Ie(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1143
1147
|
|
|
1144
1148
|
Create a plan first:
|
|
1145
1149
|
1. Run /p:init in an empty directory
|
|
@@ -1147,11 +1151,11 @@ Create a plan first:
|
|
|
1147
1151
|
3. Plan will be auto-generated
|
|
1148
1152
|
4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
|
|
1149
1153
|
`);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
|
|
1150
|
-
`)[0].trim():"Unknown project",
|
|
1154
|
+
`)[0].trim():"Unknown project",m=c?c[1]:"Not specified",p=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
|
|
1151
1155
|
\u{1F527} Stack:
|
|
1152
|
-
${p}`),console.log(`
|
|
1153
|
-
\u{1F4CB} Implementation Steps:
|
|
1154
1156
|
${m}`),console.log(`
|
|
1157
|
+
\u{1F4CB} Implementation Steps:
|
|
1158
|
+
${p}`),console.log(`
|
|
1155
1159
|
${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
|
|
1156
1160
|
The architect plan is ready. Claude will now:
|
|
1157
1161
|
1. Read the architectural plan
|
|
@@ -1160,7 +1164,7 @@ The architect plan is ready. Claude will now:
|
|
|
1160
1164
|
4. Create starter files with boilerplate
|
|
1161
1165
|
`),console.log(`
|
|
1162
1166
|
\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.
|
|
1163
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
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 j.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=A.getGlobalProjectPath(o),u=Ks.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1164
1168
|
|
|
1165
1169
|
## Idea
|
|
1166
1170
|
${e}
|
|
@@ -1175,14 +1179,14 @@ Initialized - awaiting architecture design
|
|
|
1175
1179
|
4. Generate roadmap
|
|
1176
1180
|
|
|
1177
1181
|
Generated: ${new Date().toLocaleString()}
|
|
1178
|
-
`;return await
|
|
1182
|
+
`;return await ci.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:S()}),s.md?console.log(L(Y("Idea Captured",e),rt({Mode:"architecture"}),de([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
|
|
1179
1183
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1180
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await
|
|
1184
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Ue.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:S()}),s.md?console.log(L(Y("Idea Captured",e),rt({Mode:"capture"}),de([{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)}`),Pt("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 j.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=A.getGlobalProjectPath(n),m=Ks.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(`
|
|
1181
1185
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1182
1186
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1183
1187
|
\u{1F4CB} SPECIFICATIONS
|
|
1184
|
-
`),console.log("\u2550".repeat(50)),h.forEach((
|
|
1185
|
-
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=
|
|
1188
|
+
`),console.log("\u2550".repeat(50)),h.forEach((b,k)=>{let E=b.replace(".md","").replace(/-/g," ");console.log(` ${k+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1189
|
+
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=Ks.join(o,"planning","specs");await Ve(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Ks.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1186
1190
|
|
|
1187
1191
|
## Overview
|
|
1188
1192
|
[Brief description of the feature]
|
|
@@ -1212,45 +1216,45 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1212
1216
|
---
|
|
1213
1217
|
Created: ${new Date().toLocaleString()}
|
|
1214
1218
|
Status: Draft
|
|
1215
|
-
`;return await
|
|
1219
|
+
`;return await ci.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:S()}),f.done(`spec created: ${a}.md`),console.log(`
|
|
1216
1220
|
\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
|
|
1217
|
-
`),{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
|
|
1218
|
-
`),
|
|
1219
|
-
`),console.log(`\u{1F4C4} Full report: ${
|
|
1220
|
-
`),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
|
|
1221
|
-
${
|
|
1222
|
-
`)}catch{w="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=jo("sync",!0),D=d.syncMetrics?.indexes,V={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(D?.bm25Files){let k=D.bm25Files*(D.bm25AvgTokens||0);V["Tokens indexed"]=`${Math.round(k/1e3)}K`,V["Import edges"]=D.importEdges||0,V["Co-change commits"]=D.cochangeCommits||0}let F=L(he("Sync Complete"),et(V),g,d.git.hasChanges?Tm("Uncommitted changes detected"):null,w,ue(E.map(k=>({label:k.desc,command:k.cmd}))));return console.log(F),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return gc(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 M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Fs.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&&Mt.isCurrent(n,i))return t.md?console.log(L(he("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 pa(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 M.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."}:(Mt.save(o,i),s.md?console.log(L(he("LLM Analysis Saved"),et({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 M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Mt.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=[he(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(X("Architecture Insights",Ie(o.architecture.insights))),o.patterns.length>0&&i.push(X("Patterns",Ie(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(X("Anti-Patterns",Ie(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(X("Tech Debt",Ie(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(X("Conventions",Ie(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 M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await wn.getSummary(n),i=await wn.getDailyStats(n,30),a=await xm(n),c=await Ze.getPatternsSummary(n);if(t.json){let m={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(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await wn.read(n),p=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: ${p.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 m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}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: ${bn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${io(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 m=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=m>0?(g.usageCount/m*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 m=Rm(i);if(console.log(` ${m} ${bn(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 m=Am(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}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 M.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=po(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Je.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=Gp.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,et({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?X("Analysis",Ie(m)):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 M.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 Je.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(Ki(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Su(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 M.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 Je.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 M.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 Je.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(he("Analysis Rolled Back"),et({"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 M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Je.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 M.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 Je.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 Fn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1223
|
-
`)}var
|
|
1224
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let
|
|
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 ii(t),n=0;Ae.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&&Ae.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&&Ae.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 fl,Ys,ng=v(()=>{"use strict";Yt();Vr();Ce();ye();U();B();Qe();fl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await j.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(li(),tg)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await j.getProjectId(e);if(!t)throw Fr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await A.ensureProjectStructure(t),A.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ln();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 ps(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 ps(e)).some(n=>t.includes(n))}catch(t){return D(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await j.isConfigured(e)}async needsMigration(e){return await j.needsMigration(e)}},Ys=new fl});var ke,xt=v(()=>{"use strict";el();nl();Yp();cl();Ws();ng();ke=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ei,this.updateNotificationShown=!1,this.commandExecutor=Zo}get agent(){return ri.getAgent()}get agentInfo(){return ri.getInfo()}get currentAuthor(){return Ys.getCurrentAuthor()}async initializeAgent(){return ri.initialize()}async ensureProjectInit(e){return Ys.ensureInit(e)}async ensureAuthor(){return Ys.ensureAuthor()}async getGlobalProjectPath(e){return Ys.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Et.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Ys.isEmptyDirectory(e)}async _detectExistingCode(e){return Ys.hasExistingCode(e)}_breakdownFeatureTasks(e){return jn.breakdownFeature(e)}_detectBugSeverity(e){return jn.detectBugSeverity(e)}}});var sg={};Jt(sg,{AnalysisCommands:()=>Zs});import di from"node:fs/promises";import rg from"node:path";import*as Qs from"@clack/prompts";var Zs,ui=v(()=>{"use strict";Zr();ao();Pu();ss();Ce();ye();go();da();nd();ld();$a();vc();yn();te();fr();Qa();U();q();Vs();vn();Qe();qm();xt();Zs=class extends ke{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1222
|
+
`),Be.init(t);let s=await Is.build(t,e),n={packageJson:await Be.readPackageJson(),cargoToml:await Be.readCargoToml(),goMod:await Be.readGoMod(),requirements:await Be.readRequirements(),directories:await Be.listDirectories(),fileCount:await Be.countFiles(),gitStats:await Be.getGitStats(),gitLog:await Be.getGitLog(20),hasDockerfile:await Be.fileExists("Dockerfile"),hasDockerCompose:await Be.fileExists("docker-compose.yml"),hasReadme:await Be.fileExists("README.md"),hasTsconfig:await Be.fileExists("tsconfig.json"),hasViteConfig:await Be.fileExists("vite.config.ts")||await Be.fileExists("vite.config.js"),hasNextConfig:await Be.fileExists("next.config.js")||await Be.fileExists("next.config.mjs")},o=Jm(n,t),i=await j.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await di.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:S(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(dt(),at(jt)).getActiveProvider(),d=await xe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1223
|
+
`),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
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 j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let m=await A.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 Gs.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(we(`Synced package: ${p.name}`))):f.done(`Synced package: ${p.name}`),{success:g.success}}let a=rg.join(o,"context","CLAUDE.md"),c=null;try{c=await di.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 Gs.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 di.readFile(a,"utf-8")}catch{p=""}let g=id(c,p);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(we("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 di.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let k=[];for(let R of g.added)k.push(`Added: ${R.name} (${R.lineCount} lines)`);for(let R of g.modified)k.push(`Modified: ${R.name} (${R.lineCount} lines)`);for(let R of g.removed)k.push(`Removed: ${R.name} (${R.lineCount} lines)`);let E=L("## Sync Preview",k.length>0?Y("Changes",$e(k)):"No section changes.",rt({"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(E),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let k={added:g.added.map(E=>({name:E.name,lineCount:E.lineCount})),modified:g.modified.map(E=>({name:E.name,lineCount:E.lineCount})),removed:g.removed.map(E=>({name:E.name,lineCount:E.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:k,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(ad(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Qs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Qs.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(`
|
|
1225
|
+
${cd(g)}`);let k=await Qs.confirm({message:"Apply these changes?",initialValue:!0});if(Qs.isCancel(k)||!k)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),Ac(m,i)}t.md||f.spin("Syncing project...");let d=await Gs.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 w=await qe.diff(n);w?.hasChanges&&(g=ua(w))}catch{}let h=d.git.recentCommits[0]?.hash??null,b=h&&Lt.isCurrent(n,h),k=null;if(!b)try{let w=await Ra(n,e,d.git,d.stats);k=["## 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(w,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
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
|
+
`)}var _e,kg,Sg,Il=v(()=>{"use strict";_e={runDir:l(()=>`${process.env.HOME||kt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${_e.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${_e.runDir()}/daemon.pid`,"pid"),log:l(()=>`${_e.runDir()}/daemon.log`,"log")},kg=1800*1e3,Sg=1024*1024;l(Bn,"encodeMessage")});var vg={};Jt(vg,{executeViaDaemon:()=>YS,forceKillDaemon:()=>ZS,getDaemonStatus:()=>XS,isDaemonRunning:()=>bg,sendRequest:()=>Ir,spawnDaemon:()=>Tg,stopDaemon:()=>QS});import ki from"node:crypto";import Ke from"node:fs";import{connect as KS}from"node:net";async function bg(){let r=_e.socket();if(!Ke.existsSync(r))return!1;try{return(await Ir({id:ki.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Ke.unlinkSync(r)}catch{}return!1}}async function XS(){let r=_e.socket(),e=_e.pid();if(!Ke.existsSync(r))return{running:!1};try{let t=await Ir({id:ki.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Ke.existsSync(e)?{running:!1,pid:parseInt(Ke.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Ir(r){return new Promise((e,t)=>{let s=_e.socket(),n=KS(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Bn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
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)
|
|
1225
1229
|
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)
|
|
1226
1230
|
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
|
|
1227
1231
|
WHERE project_id = ? AND timestamp >= ?
|
|
1228
1232
|
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
|
|
1229
|
-
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}}},
|
|
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}}},og=new hl;te();ws();Ht();Hs();ft();U();q();Vs();Qe();xt();Ce();ye();U();q();var yl=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 j.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp: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()}},F=new yl;var Mn=class extends ke{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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=CS.basename(t),a=await O.getCurrentTask(o),c=await pe.getActiveTasks(o),u=await Ye.getRecent(o,5),d=await Ue.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=ds(m),g=[];try{let k=p.toISOString();g=P.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",k).map(R=>({...JSON.parse(R.data),timestamp:R.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(k=>k.action==="task_completed").length,featuresShipped:g.filter(k=>k.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1230
1234
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1231
|
-
`),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
|
|
1232
|
-
Activity: ${
|
|
1233
|
-
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let
|
|
1235
|
+
`),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
|
+
Activity: ${b}
|
|
1237
|
+
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await Is.build(t),p=null;try{p=await PS.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
|
|
1234
1238
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1235
|
-
`),console.log("\u2550".repeat(50)),!
|
|
1236
|
-
`);else{let g=
|
|
1237
|
-
`)[0].trim();console.log(` ${
|
|
1238
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let
|
|
1239
|
-
`+
|
|
1239
|
+
`),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 k=h.split(`
|
|
1241
|
+
`)[0].trim();console.log(` ${b+1}. ${k}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1242
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${Qt(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let E=k.priority?` [${k.priority}]`:"";return`${k.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${E}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let E=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${E?` (${E})`:""}`}):["Nothing shipped yet"],h=null;try{let k=og.getSummary(o,7);(k.smartPercent<100||k.compactions>0)&&(h=`### Context Health (7d)
|
|
1243
|
+
`+Er(["Zone","%"],[["Smart",`${k.smartPercent}%`],["Warning",`${k.warningPercent}%`],["Dumb",`${k.dumbPercent}%`],["Compactions",`${k.compactions}`]]))}catch{}let b=L(`## Dashboard: ${i}`,Y("Current Focus",m),Y(`Queue (${c.length})`,$e(p,!0)),Y("Recent Ships",$e(g)),Y("Ideas",`${d.length} pending`),h,de([{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(`
|
|
1240
1244
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1241
|
-
`),console.log("\u2550".repeat(50));let
|
|
1245
|
+
`),console.log("\u2550".repeat(50));let m=ko(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1242
1246
|
${g}`),console.log(`
|
|
1243
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=
|
|
1244
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,
|
|
1245
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let
|
|
1247
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=Qt(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1248
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,b)=>{let k=h.priority?`[${h.priority}]`:"";console.log(` ${b+1}. ${h.description.slice(0,40)} ${k}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1249
|
+
\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(`
|
|
1246
1250
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1247
1251
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1248
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1252
|
+
`)}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(`
|
|
1249
1253
|
PRJCT COMMANDS
|
|
1250
|
-
`),console.log("=".repeat(50));let i=
|
|
1251
|
-
${
|
|
1254
|
+
`),console.log("=".repeat(50));let i=F.getAllCategories(),a=F.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
|
+
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1252
1256
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1253
|
-
`),{success:!0,topic:"overview"}}let s=
|
|
1257
|
+
`),{success:!0,topic:"overview"}}let s=F.getByName(e);if(s){if(console.log(`
|
|
1254
1258
|
\u{1F4DA} HELP: /p:${s.name}
|
|
1255
1259
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
|
|
1256
1260
|
Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
|
|
@@ -1260,9 +1264,9 @@ ${"\u2550".repeat(50)}
|
|
|
1260
1264
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1261
1265
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1262
1266
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1263
|
-
`),{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)),
|
|
1264
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(
|
|
1265
|
-
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(
|
|
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("")}};Bc();Ce();ye();ft();U();Vs();import xS from"node:fs/promises";import AS from"node:path";var en=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 j.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=A.getGlobalProjectPath(c),d=await O.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 Yo.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(Y("Project",Pc(Ec("ID",e.projectId),Ec("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Pr({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(`
|
|
1268
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(Y("Stack",rt({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=AS.join(e,"analysis","repo-analysis.json"),s=await xS.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}}},m_=new en;qo();xt();Ce();ye();Ws();te();ws();Ht();U();q();Qe();import wl from"node:fs";import ig from"node:path";async function mi(r){let e=await j.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;$.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(mi,"cleanupMemory");async function pi(r){let e=await j.getProjectId(r);if(!e)return;let s=$.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;$.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}l(pi,"cleanupMemoryInternal");async function kl(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await mi(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await j.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=$.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;$.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 Ue.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 pe.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 pi(e),await Et.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(kl,"cleanup");var RS=[/^qa-/,/^nonexistent-/,/^test-/];async function ag(r){let e=A.getGlobalBasePath(),t=ig.join(e,"projects");if(!wl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=wl.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=ig.join(t,a);if(!RS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{$.close(a),wl.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(`
|
|
1269
|
+
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(ag,"cleanupProjects");Ce();ye();Ws();U();q();B();Qe();import cg from"node:path";async function Sl(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 j.getProjectId(t),a=cg.join(A.getGlobalProjectPath(i),"planning","designs");await Ve(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1266
1270
|
|
|
1267
1271
|
*Use templates/design/architecture.md for full design*
|
|
1268
1272
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1277,14 +1281,14 @@ ${"\u2550".repeat(50)}
|
|
|
1277
1281
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1278
1282
|
|
|
1279
1283
|
*Use templates/design/flow.md for full design*
|
|
1280
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1281
|
-
`),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){
|
|
1282
|
-
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(
|
|
1284
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=cg.join(a,u);return await Tt(d,c),await Et.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(Sl,"design");Ce();ye();Ws();import _n from"node:path";Yt();te();var Ge={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:"*"};Fs();es();var bl=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Nd.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"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(Ge.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(Ge.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 H.error("Event callback error:",s),s}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ie(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())}},it=new bl,Dr={sessionStarted:l(r=>it.emit(Ge.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>it.emit(Ge.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>it.emit(Ge.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>it.emit(Ge.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>it.emit(Ge.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>it.emit(Ge.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>it.emit(Ge.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>it.emit(Ge.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>it.emit(Ge.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>it.emit(Ge.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>it.emit(Ge.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>it.emit(Ge.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>it.emit(Ge.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>it.emit(Ge.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>it.emit(Ge.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>it.emit(Ge.ANALYSIS_COMPLETED,r),"analysisCompleted")};Ce();te();U();Le();vt();q();var lg=J;function gi(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(gi,"calculateDuration");function ug(r){return ct(r*1e3)}l(ug,"formatDuration");function dg(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(dg,"rowToSession");var fi=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 j.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 lg()}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?dg(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 Dr.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 Dr.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=gi(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Dr.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=gi(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 Dr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return gi(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await _(`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 _(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1285
|
+
`),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(dg)}async logEvent(e,t){try{P.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return ug(e)}};U();q();B();Qe();async function Tl(r=process.cwd()){try{if(!await j.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 fi(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(`
|
|
1283
1287
|
Found abandoned session:
|
|
1284
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let o=
|
|
1288
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let o=Qt(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1285
1289
|
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
|
|
1286
|
-
`),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1287
|
-
`).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
|
|
1290
|
+
`),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Tl,"recover");async function vl(r=process.cwd()){try{f.spin("creating undo point...");let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots");await Ve(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=_n.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await Ie(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 Tt(c,JSON.stringify(u,null,2)),await Et.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(vl,"undo");async function El(r=process.cwd()){try{f.spin("restoring changes...");let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots"),s=_n.join(t,"history.json"),n;try{let i=await Ie(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(`
|
|
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 Tt(s,JSON.stringify(n,null,2)),await Et.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(El,"redo");async function Pl(r=process.cwd()){try{let e=await j.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=_n.join(A.getGlobalProjectPath(e),"snapshots"),s=_n.join(t,"history.json"),n;try{let o=await Ie(s);n=JSON.parse(o)}catch(o){if(D(o)||o instanceof SyntaxError)return console.log(`
|
|
1288
1292
|
SNAPSHOT HISTORY
|
|
1289
1293
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1290
1294
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1292,35 +1296,40 @@ ${"\u2550".repeat(50)}
|
|
|
1292
1296
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1293
1297
|
`)):(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
|
|
1294
1298
|
`)),console.log(`${"=".repeat(50)}
|
|
1295
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1296
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};
|
|
1297
|
-
|
|
1299
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(Pl,"history");var On=class extends ke{static{l(this,"MaintenanceCommands")}_cleanupMemory=mi;_cleanupMemoryInternal=pi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?kl(e,t):s}async cleanupProjects(e={}){return ag(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Sl(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Tl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?vl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?El(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Pl(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 xn(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(`
|
|
1300
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};Ce();vt();Ht();$o();var Cl=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await pe.getActiveTasks(e),o=t.includeBacklog?await pe.getBacklog(e):[],i=[...n,...o],c=jo(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
|
+
`)}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
|
+
`)}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)}},DS=new Cl,Nn=DS;lr();ft();U();Qe();xt();var Ln=null,tn=class extends ke{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 j.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 j.getProjectId(t),i=this.slugify(e),a=await Ot.create(t,i,{branch:s.branch});await Ot.setup(a.path,t);let c=J();return await O.startTaskInWorkspace(o,{id:J(),description:e,sessionId:J(),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 j.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Ot.create(t,a);await Ot.setup(c.path,t);let u=J();await O.startTaskInWorkspace(n,{id:J(),description:i,sessionId:J(),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=Nn.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=Nn.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 Nn.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"}):(Ln=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Nn.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Ln||Ln.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 Ln.items){let i=Nn.slugify(o);try{let a=await Ot.create(t,i);await Ot.setup(a.path,t);let c=J();await O.startTaskInWorkspace(e,{id:J(),description:o.title,sessionId:J(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Ln.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)}`)}}Ln=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([O.getActiveTasks(e),Ot.list(t)]),o=await O.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
|
|
1304
|
+
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 O.getActiveTasks(e),n=await Ot.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 Ot.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)}},jO=new tn;Ce();import Re from"chalk";te();var IS=BigInt(300*1e9),xl=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>IS&&this.marks.delete(t)}recordTiming(e,t,s,n){$.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)$.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){$.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){$.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return $.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,k)=>b+k,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:h.length>0?p(h.reduce((b,k)=>b+k,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,k)=>b+k,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},jS=new xl,mg=jS;U();Qe();xt();var vs={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function hi(r,e,t){return t==="below"?r<=e?Re.green("\u2713"):Re.yellow("\u26A0"):r>=e?Re.green("\u2713"):Re.yellow("\u26A0")}l(hi,"statusIcon");var Fn=class extends ke{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 j.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 mg.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1306
|
+
${Re.dim("No performance data yet.")}`),console.log(`${Re.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1298
1307
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1299
|
-
${
|
|
1300
|
-
${
|
|
1308
|
+
${Re.cyan("Performance Report")} ${Re.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=hi(i.startup.avg,vs.startup.max,"below");console.log(` Startup: avg ${Re.bold(`${i.startup.avg}ms`)} ${Re.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Re.dim(`target: <${vs.startup.max}ms`)}`)}if(i.memory){let c=hi(i.memory.peakHeapMB,vs.heapMB.max,"below");console.log(` Memory: avg ${Re.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Re.dim(`target: <${vs.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=hi(i.contextCorrectness.rate,vs.contextRate.min,"above");console.log(` Context: ${Re.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Re.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Re.dim(`target: ${vs.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=hi(i.subtaskHandoff.rate,vs.handoffRate.min,"above");console.log(` Handoff: ${Re.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Re.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Re.dim(`target: ${vs.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1309
|
+
${Re.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Re.bold(`${u.avg}ms`)} ${Re.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)}}}};li();ss();Ce();ye();yr();import HS from"node:fs/promises";import WS from"node:http";import GS from"node:path";import se from"chalk";ye();B();import $S from"node:fs/promises";import MS from"node:path";var gg="https://api.prjct.app",pg={apiKey:null,apiUrl:gg,userId:null,email:null,lastAuth:null},Al=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=A.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Pe(this.configPath);return this.cachedConfig=e??{...pg},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await Ve(MS.dirname(this.configPath)),await le(this.configPath,s),await $S.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||gg}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...pg},await le(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}},_S=new Al,mt=_S;Fs();var OS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function NS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(NS,"camelToSnake");function LS(r){let e={};for(let[t,s]of Object.entries(r))e[NS(t)]=s;return e}l(LS,"snakeCaseKeys");function FS(r,e){let[t,s]=e.type.split("."),n=OS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=LS(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(FS,"mapCliEventToWebFormat");function fg(r,e){return e.map(t=>FS(r,t)).filter(t=>t!==null)}l(fg,"mapCliEventsToWebFormat");var Rl=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=fg(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(),bn("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 mt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([mt.getApiUrl(),mt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),bn("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: ${bn("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))}},Un=new Rl;wa();ws();Ht();Hs();ft();var Dl=class{static{l(this,"SyncManager")}async hasAuth(){return await mt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Un.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 ys.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 Un.pushEvents(e,n);if(o.success)return await ys.clearPending(e),await ys.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 ys.getLastSync(e))?.timestamp,n=await Un.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 ys.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 O.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 O.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await pe.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Ue.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Ue.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await Ye.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await pe.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}}},US=new Dl,hg=US;U();Le();B();Vo();Qe();It();xt();var Hn=class extends ke{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 mt.write({apiKey:o,...i?{apiUrl:i}:{}}),await Un.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(se.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1301
1310
|
- **Status**: Connected
|
|
1302
1311
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1303
|
-
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(
|
|
1312
|
+
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(se.dim(`Key: ${o.substring(0,12)}...`)),f.info(se.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
1304
1313
|
- **Status**: Key saved (server unreachable)
|
|
1305
|
-
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await
|
|
1306
|
-
- **Status**: Logged out`:""};default:{let o=await
|
|
1314
|
+
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await mt.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
|
|
1315
|
+
- **Status**: Logged out`:""};default:{let o=await mt.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
|
|
1307
1316
|
- **Authenticated**: Yes
|
|
1308
1317
|
- **Email**: ${o.email||"N/A"}
|
|
1309
1318
|
- **Key**: \`${o.apiKeyPrefix}\`
|
|
1310
1319
|
- **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"}
|
|
1311
1320
|
Key: ${o.apiKeyPrefix}
|
|
1312
|
-
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${
|
|
1313
|
-
Key: ${t.apiKeyPrefix}`),f.info(`Run ${
|
|
1321
|
+
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${se.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await mt.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
|
|
1322
|
+
Key: ${t.apiKeyPrefix}`),f.info(`Run ${se.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
|
|
1314
1323
|
- **Email**: ${t.email}
|
|
1315
1324
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1316
1325
|
|
|
1317
|
-
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=
|
|
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=WS.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 mt.saveAuth(u,m||"",d||"");let p=`${s}/api`;await mt.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}
|
|
1318
1327
|
Key: ${u.substring(0,12)}...
|
|
1319
1328
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1320
1329
|
- **Email**: ${d}
|
|
1321
1330
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1322
1331
|
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
|
|
1323
|
-
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(
|
|
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(se.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await _(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 ${se.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 mt.getStatus()).authenticated?(await mt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await j.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await hg.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>
|
|
1324
1333
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1325
1334
|
<title>prjct CLI Connected</title>
|
|
1326
1335
|
<style>
|
|
@@ -1375,31 +1384,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1375
1384
|
<h1>Authentication Failed</h1>
|
|
1376
1385
|
<div class="msg">${e}</div>
|
|
1377
1386
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1378
|
-
</div></body></html>`}async start(){let e=await
|
|
1387
|
+
</div></body></html>`}async start(){let e=await xe.checkInstallation(),t=(dt(),at(jt)),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}...
|
|
1379
1388
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1380
1389
|
|
|
1381
1390
|
Please install one first:
|
|
1382
1391
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1383
1392
|
- Gemini CLI: https://geminicli.com/docs
|
|
1384
|
-
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await
|
|
1393
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await xe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1385
1394
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1386
|
-
${
|
|
1387
|
-
\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(()=>(
|
|
1395
|
+
${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
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(()=>(Ro(),Ka));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(`
|
|
1388
1397
|
\u{1F389} Setup complete!`),console.log(`
|
|
1389
1398
|
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...
|
|
1390
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1399
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await xe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await xe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1391
1400
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1392
1401
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1393
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1394
|
-
\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(()=>(
|
|
1402
|
+
\u{1F4DD} Installing global configuration...`);let s=await xe.installGlobalConfig(),n=s.path?A.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=(dt(),at(jt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
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(()=>(Ro(),Ka));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(`
|
|
1395
1404
|
\u{1F389} Setup complete!
|
|
1396
1405
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1397
|
-
\u{1F50C} Configuring MCP servers...`);try{await
|
|
1406
|
+
\u{1F50C} Configuring MCP servers...`);try{await is.install();let e=await is.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=as();await qs("linear",e)?console.log("\u2705 Linear MCP already configured"):(await $c("linear",jc.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=as();await qs("jira",e)?console.log("\u2705 Jira MCP already configured"):(await $c("jira",jc.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=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=GS.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
|
|
1398
1407
|
# prjct Status Line for Claude Code
|
|
1399
1408
|
# Shows version update notifications and current task
|
|
1400
1409
|
|
|
1401
1410
|
# Current CLI version (embedded at install time)
|
|
1402
|
-
CLI_VERSION="${
|
|
1411
|
+
CLI_VERSION="${Ee}"
|
|
1403
1412
|
|
|
1404
1413
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1405
1414
|
read -r json
|
|
@@ -1450,14 +1459,14 @@ fi
|
|
|
1450
1459
|
|
|
1451
1460
|
# Default: show prjct branding
|
|
1452
1461
|
echo "\u26A1 prjct"
|
|
1453
|
-
`;await
|
|
1462
|
+
`;await HS.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Pe(t)??{}}catch{}return o.statusLine={type:"command",command:s},await le(t,o),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(se.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(se.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(se.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(se.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(se.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(se.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(se.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(` ${se.bold.cyan("prjct")}${se.magenta("/")}${se.green("cli")} ${se.dim.white(`v${Ee} installed`)}`),console.log(""),console.log(` ${se.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${se.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${se.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(se.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(se.bold.cyan("\u{1F680} Quick Start")),console.log(se.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(` ${se.bold("1.")} Initialize your project:`),console.log(` ${se.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${se.bold("2.")} Start your first task:`),console.log(` ${se.green('prjct task "build auth"')}`),console.log(""),console.log(` ${se.bold("3.")} Ship & celebrate:`),console.log(` ${se.green('prjct ship "user login"')}`),console.log(""),console.log(se.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(` ${se.dim("Documentation:")} ${se.cyan("https://prjct.app")}`),console.log(` ${se.dim("Report issues:")} ${se.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(se.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ao();Ce();q();B();import yg from"node:path";var VS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],BS=`# Changelog
|
|
1454
1463
|
|
|
1455
1464
|
All notable changes to this project will be documented in this file.
|
|
1456
1465
|
|
|
1457
1466
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1458
1467
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1459
|
-
`,
|
|
1460
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await
|
|
1468
|
+
`,yi=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of VS){let n=yg.join(this.projectPath,s);if(await C(n)){let o=await Ie(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=yg.join(this.projectPath,e);return await Tt(t,`${BS}
|
|
1469
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await Ie(t.filePath),n=e.date||Vl(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Tt(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}
|
|
1461
1470
|
${a}`}return`${e.trimEnd()}
|
|
1462
1471
|
|
|
1463
1472
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1467,31 +1476,31 @@ ${a}`}return`${n}
|
|
|
1467
1476
|
|
|
1468
1477
|
${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(`
|
|
1469
1478
|
`)}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(`
|
|
1470
|
-
`)}};
|
|
1471
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(
|
|
1472
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1473
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
1474
|
-
${
|
|
1479
|
+
`)}};vc();Le();B();import Wn from"node:path";var wi=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=Wn.join(this.projectPath,"package.json"),t=await Pe(e,null);return t?.version?{current:t.version,next:Gn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Wn.join(this.projectPath,"Cargo.toml"),t=await Ie(e,"");if(!t)return null;let s=JS(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Wn.join(this.projectPath,"pyproject.toml"),t=await Ie(e,"");if(!t)return null;let s=qS(t);return s?{current:s,next:Gn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await ps(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Wn.join(this.projectPath,e[0]),s=await Ie(t,"");if(!s)return null;let n=zS(s);return n?{current:n,next:Gn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Wn.join(this.projectPath,e),s=await Ie(t,"");if(!s)return null;let n=s.trim();return wg(n)?{current:n,next:Gn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await _("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1480
|
+
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(wg(n))return{current:n,next:Gn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Wn.join(this.projectPath,"VERSION");return await Tt(e,`0.1.0
|
|
1481
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await As("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 Tt(e.file,`${e.next}
|
|
1482
|
+
`);break}}async writeJsonVersion(e,t){let s=await Pe(e,{});s&&(s.version=t,await le(e,s))}async writeTomlVersion(e,t){let s=await Ie(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Tt(e,n)}async writeXmlVersion(e,t){let s=await Ie(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Tt(e,n)}};function wg(r){return/^\d+\.\d+\.\d+/.test(r)}l(wg,"isSemver");function Gn(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}l(Gn,"bumpPatch");function JS(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(JS,"parseTomlVersion");function qS(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(qS,"parsePyprojectVersion");function zS(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(zS,"parseCsprojVersion");Hs();ft();U();q();Le();Vs();vn();Qe();oi();U();Le();import At from"chalk";async function Bt(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ae.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(`
|
|
1483
|
+
${At.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await _(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(`${At.green("\u2713")} ${At.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${At.red("\u2717")} gate failed: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
|
|
1475
1484
|
${y(g)}
|
|
1476
|
-
`,n}}let c=i.filter(
|
|
1477
|
-
${
|
|
1478
|
-
${
|
|
1479
|
-
${y(
|
|
1480
|
-
`}}let d=i.filter(
|
|
1481
|
-
${
|
|
1482
|
-
${y(
|
|
1483
|
-
`,n}}return n}l(
|
|
1485
|
+
`,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
|
|
1486
|
+
${At.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(`
|
|
1487
|
+
${At.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await _(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(`${At.green("\u2713")} ${At.dim(`(${h})`)}`)}catch(p){console.log(`${At.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
|
|
1488
|
+
${y(p)}
|
|
1489
|
+
`}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
|
|
1490
|
+
${At.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await _(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(`${At.green("\u2713")} ${At.dim(`step passed (${h})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${At.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
|
|
1491
|
+
${y(p)}
|
|
1492
|
+
`,n}}return n}l(Bt,"executeWorkflowRules");xt();var Vn=class extends ke{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 j.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await O.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await O.completeTask(o)),i||(i="current work");let c=await Bt(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 wi(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new yi(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let k=await this._gitPush(t);g=k.success?"pushed":k.message}await Ye.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:S()}),await nt.learnDecision(o,"commit_footer","prjct","ship"),await nt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Bt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Gs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(k){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(k))}if(s.md){let k=Uo("ship",!0),E=L(we(`Shipped: ${i}`,`Version: ${d}`),Y("Results",$e([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?Y("Agent Instructions",$e(b)):null,de(k.map(R=>({label:R.desc,command:R.cmd}))));console.log(E)}else f.done(`v${d} shipped`),Pt("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 _("git add .");let s=`feat: ${e}
|
|
1484
1493
|
|
|
1485
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1494
|
+
Generated with [p/](https://www.prjct.app/)`;return await As("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 _("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)"}}}};ss();qa();ye();nl();sc();U();Qe();It();xt();import{execSync as $r}from"node:child_process";import Si from"node:fs/promises";import jr from"node:path";import Jn from"chalk";function Pg(){try{return!!$r("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(Pg,"isHomebrewInstall");function Cg(){try{let e=$r("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(Cg,"getCurrentVersion");var qn=class extends ke{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 Co.updateVersion(Ee)}catch{}try{await new ei().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=Cg();if(e)return Pg()?(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(Pg()){try{$r("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}$r("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else $r("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Cg();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 Do(i),c=await Io(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 ts().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 ts().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${y(n)}`)}try{await new ts().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(()=>(dt(),jt)),o=await n(),i=jr.join(kt("node:os").homedir());if(o.gemini.installed){let a=jr.join(i,".gemini","GEMINI.md");try{let c=await Si.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=jr.join(jr.dirname(kt.resolve("../../package.json")),"templates","global","GEMINI.md"),p=await Si.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),k=h+g+b,E="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",R="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(k.includes(E)&&k.includes(R)){let W=k.substring(0,k.indexOf(E)),z=k.substring(k.indexOf(R)+R.length);k=`${(W+z).replace(/\n{3,}/g,`
|
|
1486
1495
|
|
|
1487
1496
|
`).trim()}
|
|
1488
|
-
`}await
|
|
1489
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1490
|
-
${
|
|
1491
|
-
`),{success:!0,message:"No data"};let a=
|
|
1492
|
-
${
|
|
1493
|
-
${
|
|
1494
|
-
${
|
|
1497
|
+
`}await Si.writeFile(a,k,"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(()=>(Eg(),vg));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?Jn.green("\u2713"):c?Jn.red("\u2717"):Jn.yellow("\u26A0");console.log(` ${u} ${Jn.bold(i)}`);for(let d of a.details)console.log(` ${Jn.dim(d)}`);for(let d of a.errors)console.log(` ${Jn.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(`
|
|
1498
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=jr.join(A.getGlobalBasePath(),"projects");try{return(await Si.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Nc();Ce();kr();ac();U();Qe();Rn();xt();import De from"chalk";var zn=class extends ke{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 j.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 yt.getAll(n);if(i.length===0)return console.log(`
|
|
1499
|
+
${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
|
|
1500
|
+
`),{success:!0,message:"No data"};let a=Bo(i,o);await Mo.saveMetrics(n,a),console.log(`
|
|
1501
|
+
${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1502
|
+
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=lp(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1503
|
+
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await j.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Ss,...s.velocity}}catch{}return Ss}};el();import ib from"node:fs/promises";import ab from"node:path";gr();q();Rn();var Ag=l(r=>ma.includes(r),"isValidPoint"),sn=l(r=>pa[r],"pointsToMinutes"),xg=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Rg=l(r=>{let e=sn(r);return`${xg(e.min)}\u2013${xg(e.max)}`},"pointsToTimeRange"),Dg=l(async(r,e)=>{let s=(await yt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+St(c.actualDuration),0)/s.length;return{points:eb(o),basedOn:s.length}},"suggestFromHistory"),eb=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of ma){let n=Math.abs(pa[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");Ce();ye();U();B();import jl from"node:fs/promises";import tb from"node:os";import bi from"node:path";var $l=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=bi.join(tb.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await jl.mkdir(this.commandsPath,{recursive:!0});let s=bi.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await jl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=bi.join(this.commandsPath,`${e}.md`);return await jl.unlink(t),{success:!0}}catch(t){return D(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=bi.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
|
|
1495
1504
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1496
1505
|
---
|
|
1497
1506
|
|
|
@@ -1527,46 +1536,46 @@ Suggest relevant actions based on the workflow results:
|
|
|
1527
1536
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1528
1537
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1529
1538
|
- Run again: \`p. ${e}\`
|
|
1530
|
-
`}},
|
|
1531
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(
|
|
1532
|
-
`)}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 ${
|
|
1539
|
+
`}},Ml=new $l;vt();yr();cl();function sb(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(sb,"complexityToPoints");async function nb(r,e){let t=jn.detectTaskType(e),s=await Dg(r,t);if(s){let a=sn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=jn.estimateComplexity(e),o=sb(n.level),i=sn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(nb,"estimateTaskForStart");var _l=nb;Le();async function Ti(r){try{let{stdout:e}=await _("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(Ti,"getGitBranch");async function Ig(r,e=20){try{let{stdout:t}=await _("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
|
|
1540
|
+
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(Ig,"getModifiedFiles");ye();te();q();var Kn="session-snapshot",rb=30,Ol=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Ti(t),o=await Ig(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,Kn,u),u}getSnapshot(e){try{return P.getDoc(e,Kn)}catch{return null}}clearSnapshot(e){try{P.deleteDoc(e,Kn)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!P.exists(s))continue;let n=P.getDoc(s,Kn);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=rb){let t=await A.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,Kn);i&&new Date(i.timestamp).getTime()<s&&(P.deleteDoc(o,Kn),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${ct(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: ${ct(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
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 ${ct(t*1e3)} of work`),s.join(" ")}},Es=new Ol;yn();te();var Nl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){P.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1533
1542
|
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
|
|
1534
1543
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1535
1544
|
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
|
|
1536
1545
|
WHERE actual_files IS NOT NULL
|
|
1537
|
-
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),
|
|
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(k=>d.has(k)).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 k of b){let E=i.get(k)??0;i.set(k,E+g)}for(let k of h)if(!b.has(k)){let E=i.get(k)??0;i.set(k,E-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}},Mr=new Nl;ul();Ht();ft();oi();qo();U();q();Vo();Vs();vn();Qe();pl();Rn();xt();ye();U();q();Ms();te();import vi from"node:fs/promises";import jg from"node:path";var Xn="1.0.0";function ob(){return{version:Xn,lastUpdated:"",checksums:{}}}l(ob,"getDefaultChecksums");var Ll=class{static{l(this,"IndexStorage")}getIndexPath(e){return jg.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await vi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Xn?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 ob()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await vi.readFile(e);return Eu(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:Xn,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 vi.readdir(t);await Promise.all(s.map(n=>vi.unlink(jg.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!==Xn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Xn)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!==Xn?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)}},$g=new Ll;function Mg(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(Mg,"rankPatterns");function _g(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=$g.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(_g,"detectDomainsFromTask");function Fl(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=Mg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1538
1547
|
|
|
1539
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",
|
|
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(k=>b.includes(k))){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(`
|
|
1540
1549
|
`)}).join(`
|
|
1541
1550
|
|
|
1542
|
-
`)}`}l(
|
|
1543
|
-
`)}l(
|
|
1544
|
-
${
|
|
1545
|
-
${
|
|
1551
|
+
`)}`}l(Fl,"buildPatternBriefing");function Ul(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(`
|
|
1552
|
+
`)}l(Ul,"buildContextContract");var cb=[{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}],Yn=class extends ke{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 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"};if(e){let i=await Bt(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 is.ensureReady()}catch(he){return ht("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(he)}),{success:!1,error:y(he)}}let p=await _l(o,c),g=await O.getCurrentTask(o),h=await O.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(lr(),Xr)),k=await b.detect(t);if(k){let he=h.find(st=>st.worktreePath===k.path);if(he)return ht("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:he.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:he}}let E;if(g&&!k){let he=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let st=await b.create(t,he);await b.setup(st.path,t),E=st.path,Fo("info",`Parallel session created: \`${st.branch}\` at \`${st.path}\``)}catch{return ht("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(E||k){let he=J();await O.startTaskInWorkspace(o,{id:J(),description:c,sessionId:J(),workspaceId:he,worktreePath:E||k.path,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes},he)}else await O.startTask(o,{id:J(),description:c,sessionId:J(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes});let W=A.getGlobalProjectPath(o),z=Lc(c),w;try{w=Mr.getHistoricalBoosts(o,z),w.size===0&&(w=void 0)}catch{}let N=({bug:30,chore:40,improvement:80,feature:100}[p.taskType]??80)>=80?15:10,[fe,Ne,,Rt]=await Promise.all([Ti(t),qe.getActive(o).catch(()=>null),db(W),xn(c,t,{maxFiles:N,minScore:.15,historicalBoosts:w}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),tt=null;try{let he=Es.getSnapshot(o);he&&(tt=Es.formatContinuityContext(he),Es.clearSnapshot(o))}catch{}let pt=null;if(Ne?.analyzedAt){let he=new Date(Ne.analyzedAt),st=Math.floor((Date.now()-he.getTime())/(1e3*60*60*24));st>7&&(pt=Fo("warn",`Analysis is ${st} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Ne||(pt=Fo("info","No project analysis found. Run `p. sync` for better context targeting."));let us=null;if(w&&w.size>0){let he=[...w.entries()].filter(([,st])=>st>.3).sort((st,Oi)=>Oi[1]-st[1]).slice(0,5);he.length>0&&(us=`### Previously Useful Files
|
|
1553
|
+
${he.map(([Oi])=>`\`${Oi}\``).join(", ")}`)}let Ri=_g(c,o),Di=Pr({description:c,branch:fe,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Ri}),Ii=Nm(Rt.files.map(he=>({path:he.path,description:he.reasons.join(", ")}))),ji=Rt.files.map(he=>he.path),$i=Fl(Ne,ji),Mi=Ul(Rt.files,Ne),_i=de([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ne=lb(),Qg=ub(o);console.log(L(tt,pt,Di,Mi,Ii,us,$i,Qg,ne,_i));try{let he=await O.getCurrentTask(o);he&&Mr.recordSuggestions(o,he.id,z,Rt.files.map(st=>st.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:S()}),await Bt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Zo.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 _l(o,c);return await O.startTask(o,{id:J(),description:c,sessionId:J(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),xr("working"),Pt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:S()}),await Bt(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:Ag,pointsToMinutes:sn,pointsToTimeRange:Rg,storeEstimate:l(async p=>{let g=sn(p);return await O.updateCurrentTask(o,{estimatedPoints:p,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{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'},{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?Qt(new Date(i.startedAt)):void 0,c=Pr({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?Om(u,d):"",p=de([{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")?ht("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 j.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(lr(),Xr)),i=await o.detect(e),a=await O.getCurrentTask(n),c;if(i){let fe=(await O.getActiveTasks(n)).find(Ne=>Ne.worktreePath===i.path);fe&&(a=fe,c=fe.workspaceId)}if(!a)return t.md?ht("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 Bt(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 N=new Date(a.startedAt);m=Qt(N),p=Math.round((Date.now()-N.getTime())/6e4)}let g=a.estimatedMinutes,h=a.estimatedPoints,b=a.type||"feature",k=a.linearId;try{await yt.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:S(),estimatedDuration:g?Og(g):"0m",actualDuration:m||"0m",variance:g?gb(p-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,k].filter(Boolean)})}catch{}let E="";if(h&&g){let N=p-g,fe=g>0?Math.round((p-g)/g*100):0,Ne=N>=0?"+":"";E=` | est: ${h}pt (${Og(g)}) \u2192 ${Ne}${fe}%`}let R=[],W=null,z=null;try{if(R=await pb(e,a.startedAt),R.length>0){Mr.completeFeedback(n,a.id,R);let N=Mr.getFeedback(n,a.id);N&&(W=N.precision,z=N.recall)}}catch{}c?await O.completeTaskInWorkspace(n,c,t.feedback):await O.completeTask(n,t.feedback);try{Es.clearSnapshot(n)}catch{}let w=a.linearId,M=w!=null?await qs("linear",as()).catch(()=>!1):!1;if(t.md){let N=m?` (${m})`:"",fe=null;if(R.length>0){let tt=R.slice(0,20).map(pt=>`\`${pt}\``);fe=`### Files Modified (${R.length})
|
|
1554
|
+
${tt.join(", ")}`}let Ne=null;if(W!==null&&z!==null){let tt=Math.round(W*100),pt=Math.round(z*100);Ne=`### Context Accuracy
|
|
1546
1555
|
| Metric | Value |
|
|
1547
1556
|
|--------|-------|
|
|
1548
|
-
| Precision | ${
|
|
1549
|
-
| Recall | ${
|
|
1550
|
-
Research is available. Create your implementation plan next.`):O="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(he("Completed",`${a}${F}`),et({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),k,$,O,ue([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&V?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),Tr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:p,estimatedMinutes:d,actualMinutes:u,timestamp:b()}),await Ut(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}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 M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await we.getActiveTasks(n);if(o.length===0)return t.md?St("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":""}`),Ie(i,!0),ue([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("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 M.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?St("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=zt(new Date(i.startedAt))),await _.pauseTask(o,e);try{await ks.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(he("Task Paused",`**Paused:** ${i.description}`),et({Reason:e||void 0,"Duration worked":a||void 0}),ue([{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})`:""}`),Tr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:b()}),{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 M.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?St("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(he("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Tr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?St("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 M.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 WS){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 p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=Qe.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=Qe.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ce.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(he("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),ue([{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=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Qe.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}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=Ce.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(he("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):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=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=Qe.getAllWorkflows(t).map(w=>w.name).join(", "),S=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${S}`):f.warn(S),{success:!1,error:S}}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(),[p]=this._parseAction(d);if(!p){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 m=Ce.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(he("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}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(!Ce.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(he("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ce.resetRules(e);return t.md?console.log(L(he("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=Ce.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 Ce.updateRule(t,o,{enabled:!1}),s.md?console.log(L(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ce.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 Ce.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(he("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}"`),Ie(c),ue(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",Ie(["`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)",Ie(['`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=Ce.getRulesForCommand(t,e):o=Ce.getAllRules(t),o.length===0)return s.md?console.log(L(X("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(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 p=o.filter(m=>m.command===d);p.length!==0&&a.push(zS(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(X(c,u),a.length>0?km(a.join(`
|
|
1551
|
-
|
|
1552
|
-
`),""):null,
|
|
1553
|
-
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=
|
|
1554
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1555
|
-
`)))}console.log(L(...i,
|
|
1557
|
+
| Precision | ${tt}% of suggested files were used |
|
|
1558
|
+
| Recall | ${pt}% of modified files were suggested |`}let Rt=null;try{let{prjctDb:tt}=(te(),at(to)),pt=tt.getDoc(n,"rpi:current:research"),us=tt.getDoc(n,"rpi:current:plan");pt?us||(Rt=`### RPI Phase: Plan Ready
|
|
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,de([{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=Ae.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 ii(t),i=0,a=[],c=Ae.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=Ae.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=Ae.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(we("Workflow Initialized",`Added ${a.length} default ship rules`),$e(a),de([{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(!et.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(et.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(et.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=et.createWorkflow(t,{name:i,description:a}),d=await Ml.generateWorkflowTemplate(i,a);if(!d.success){et.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(we("Workflow Created",`Created workflow: ${i}`),Y("Description",a),Y("Template",`Installed at ${d.path}`),de([{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(`
|
|
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=et.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(Y("Built-in Workflows",a.join(`
|
|
1563
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(Y("Custom Workflows",a.join(`
|
|
1564
|
+
`)))}console.log(L(...i,de([{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(`
|
|
1556
1565
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1557
|
-
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(!
|
|
1558
|
-
`)}l(
|
|
1559
|
-
`)}catch{return null}}l(
|
|
1560
|
-
`)}l(
|
|
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(!et.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await Ml.deleteWorkflowTemplate(n),s.md?console.log(L(we("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 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){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=et.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 Bt(o,i,"before",{projectPath:t});if(!c.success){if(s.md)ht("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 Bt(o,i,"after",{projectPath:t}),s.md?console.log(L(we(`Workflow: ${i}`,a.description||""),de([{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 Es.cleanup();return t.md?console.log(we("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await Es.listAllSnapshots();if(s.length===0)return t.md?ht("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=ct(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(Y("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),$e(n),de([{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=ct(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 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 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(Y("Tokens",m))):f.fail(m),{success:!1,error:m}}let d=await O.addTokens(o,c,u);return d?(s.md?console.log(L(Y("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),rt({"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 lb(){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(`
|
|
1567
|
+
`)}l(lb,"buildEfficiencySection");function ub(r){try{let{prjctDb:e}=(te(),at(to)),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(`
|
|
1568
|
+
`)}catch{return null}}l(ub,"buildRpiSection");function Og(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(Og,"formatMinutesToDuration");async function db(r){try{let e=ab.join(r,"analysis","repo-analysis.json"),t=await ib.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return D(e),null}}l(db,"loadRepoAnalysis");function mb(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(W=>` ${W.enabled?h:"o"} #${W.id} ${W.action}`),k=[p,...b],R=Math.max(...k.map(W=>W.length))+2;u.push(`+${"-".repeat(R)}+`);for(let W of k)u.push(`| ${W.padEnd(R-1)}|`);u.push(`+${"-".repeat(R)}+`)},"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(`
|
|
1569
|
+
`)}l(mb,"buildFlowDiagram");async function pb(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(`
|
|
1561
1570
|
`)){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(`
|
|
1562
1571
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
|
|
1563
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(qS,"getFilesModifiedSinceTaskStart");function KS(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(KS,"formatVariance");var Jn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Bn,this.planning=new Js,this.shipping=new Ln,this.analytics=new Dn,this.performanceCmds=new $n,this.maintenance=new In,this.analysis=new Ks,this.setupCmds=new _n,this.updateCmds=new Hn,this.velocityCmds=new Gn,this.contextCmds=new Xs,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 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)}},$F=new Jn;ti();var bg={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}},Tg=[{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:"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"]}];ei();Yt();fe();H();J();Dt();import{execSync as fi}from"node:child_process";import pt from"node:fs/promises";import XS from"node:os";import rs from"node:path";import YS from"node:readline";import be from"chalk";var hi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Dr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Eg(r){let e=0;try{let t=await pt.readdir(r,{withFileTypes:!0});for(let s of t){let n=rs.join(r,s.name);if(s.isDirectory())e+=await Eg(n);else try{let o=await pt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Eg,"getDirectorySize");function vg(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(vg,"formatSize");async function QS(r){try{return(await pt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(QS,"countDirectoryItems");function ZS(){let r={homebrew:!1,npm:!1};try{fi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(ZS,"detectInstallation");async function eb(){let r=[],e=gu(),t=R.getGlobalBasePath(),s=await x(t),n=s?await QS(rs.join(t,"projects")):0,o=s?await Eg(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=rs.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let D=await pt.readFile(i,"utf-8");c=D.includes(hi)&&D.includes(Dr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await x(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=rs.join(e.claude.config,"prjct-statusline.sh"),m=await x(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,h=await x(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let S=rs.join(e.gemini.config,"GEMINI.md"),w=await x(S),E=!1;if(w)try{let D=await pt.readFile(S,"utf-8");E=D.includes(hi)&&D.includes(Dr)}catch{}return w&&E&&r.push({path:S,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(eb,"gatherUninstallItems");async function tb(r){try{let e=await pt.readFile(r,"utf-8");if(!e.includes(hi)||!e.includes(Dr))return!1;let t=e.indexOf(hi),s=e.indexOf(Dr)+Dr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1564
|
-
|
|
1565
|
-
`).trim(),!n||n.trim().length===0?await
|
|
1566
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
1567
|
-
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(
|
|
1568
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1569
|
-
${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.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(ob,"uninstall");var yi=class extends Se{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return ob(e,t)}};var Ss=new Bn,wi=new Js,ib=new Ln,Cg=new Dn,ab=new $n,bs=new In,zn=new Ks,jr=new _n,cb=new Xs,lb=new Gn,ub=new yi,db=new Hn;function mb(){for(let[r,e]of Object.entries(bg))U.registerCategory(r,e)}l(mb,"registerCategories");function pb(){if(U.has("work"))return;mb();let r=l(e=>Tg.find(t=>t.name===e),"getMeta");U.registerMethod("task",Ss,"now",r("task")),U.registerMethod("done",Ss,"done",r("done")),U.registerMethod("next",Ss,"next",r("next")),U.registerMethod("pause",Ss,"pause",r("pause")),U.registerMethod("resume",Ss,"resume",r("resume")),U.registerMethod("workflow",Ss,"workflow",r("workflow")),U.registerMethod("tokens",Ss,"tokens",r("tokens")),U.registerMethod("sessions",Ss,"sessions",r("sessions")),U.registerMethod("init",wi,"init",r("init")),U.registerMethod("bug",wi,"bug",r("bug")),U.registerMethod("idea",wi,"idea",r("idea")),U.registerMethod("spec",wi,"spec",r("spec")),U.registerMethod("ship",ib,"ship",r("ship")),U.registerMethod("dash",Cg,"dash",r("dash")),U.registerMethod("help",Cg,"help",r("help")),U.registerMethod("perf",ab,"perf",r("perf")),U.registerMethod("velocity",lb,"velocity",r("velocity")),U.registerMethod("cleanup",bs,"cleanup",r("cleanup")),U.registerMethod("cleanup-projects",bs,"cleanupProjects",r("cleanup-projects")),U.registerMethod("design",bs,"design",r("design")),U.registerMethod("recover",bs,"recover",r("recover")),U.registerMethod("undo",bs,"undo",r("undo")),U.registerMethod("redo",bs,"redo",r("redo")),U.registerMethod("history",bs,"history",r("history")),U.registerMethod("enrich",bs,"enrich",r("enrich")),U.registerMethod("analyze",zn,"analyze",r("analyze")),U.registerMethod("sync",zn,"sync",r("sync")),U.registerMethod("stats",zn,"stats",r("stats")),U.registerMethod("status",zn,"status",r("status")),U.registerMethod("seal",zn,"seal",r("seal")),U.registerMethod("verify",zn,"verify",r("verify")),U.registerMethod("start",jr,"start",r("start")),U.registerMethod("setup",jr,"setup",r("setup")),U.registerMethod("login",jr,"login",r("login")),U.registerMethod("logout",jr,"logout",r("logout")),U.registerMethod("auth",jr,"auth",r("auth")),U.registerMethod("uninstall",ub,"uninstall",r("uninstall")),U.registerMethod("update",db,"update",r("update")),U.registerMethod("context",cb,"context",r("context"))}l(pb,"registerAllCommands");pb();De();or();Pt();import{Hono as Eb}from"hono";import{cors as Pb}from"hono/cors";import{logger as Cb}from"hono/logger";import{secureHeaders as xb}from"hono/secure-headers";fe();ee();ps();Wt();Ns();wt();H();Kt();import gb from"node:fs/promises";import fb from"node:path";import{Hono as hb}from"hono";function yb(r){return R.getGlobalProjectPath(r)}l(yb,"getProjectDataPath");function xg(r,e){let t=new hb,s=yb(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await we.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Le.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 Xe.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),we.read(r),Le.read(r),Xe.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=fb.join(s,"context",`${o}.md`),c=await gb.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return A(a)||G.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(xg,"createRoutes");fe();ee();ps();Wt();Ns();wt();import qn from"node:fs/promises";import wb from"node:path";import{Hono as kb}from"hono";var Sb=R.getGlobalBasePath(),Kn=wb.join(Sb,"projects");function ki(r){return P.getDoc(r,"project")}l(ki,"getProjectConfig");async function Cl(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(Cl,"calculateDuration");function Rg(){let r=new kb;return r.get("/projects",async e=>{try{await qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ki(o),a=await _.read(o),c=await we.read(o),u=await Le.read(o),d=await Xe.read(o),p=a?.currentTask,m=await Cl(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}: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(ki(t)),_.read(t),we.read(t),Le.read(t),Xe.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Cl(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=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)>=p)?.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:m,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),we.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(p=>typeof p=="string").slice(0,20):[],d=await Le.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 qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{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 we.read(c),p=await Le.read(c),m=await Xe.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.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 qn.mkdir(Kn,{recursive:!0});let n=(await qn.readdir(Kn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=ki(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await _.read(d),m=ki(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Cl(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.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(Rg,"createExtendedRoutes");import{streamSSE as bb}from"hono/streaming";var Ag=3600*1e3,Tb=300*1e3,vb=3e4;function Dg(){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()>Ag&&t(i)},Tb),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 bb(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")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},vb),m=setTimeout(()=>{t(a)},Ag);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,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(Dg,"createSSEManager");function jg(r){let e=new Eb,t=Dg();e.use("*",xb()),r.enableCors!==!1&&e.use("*",Pb({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("*",Cb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ve,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=xg(r.projectId,r.projectPath);e.route("/api",s);let n=Rg();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(Rs())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: ${Rs()?"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(jg,"createServer");var Ig=3478;ee();hl();var Ab=50,Xn=null,Ir=null,me=null,Te=null;async function $g(r){let e=Me.socket(),t=Me.pid(),s=Me.runDir();if(_e.mkdirSync(s,{recursive:!0}),_e.existsSync(t)){let i=parseInt(_e.readFileSync(t,"utf-8").trim(),10);Mb(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),_e.unlinkSync(t)}_e.existsSync(e)&&_e.unlinkSync(e),Nb();let n=_b(),o=null;if(n)try{o=_e.statSync(n).mtimeMs}catch{}if(Te={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ng,idleTimer:null,entryPath:n,entryMtime:o},me=new Jn,Xn=Rb(i=>Db(i)),Xn.listen(e,()=>{_e.chmodSync(e,384),_e.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Mg()}),Xn.on("error",i=>{console.error("Daemon socket error:",i.message),Yn(1)}),!r.noHttp)try{let i=process.cwd(),a=await M.getProjectId(i);if(a){let c=r.port||Ig;Ir=jg({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Ir.start()}}catch{}if(process.on("SIGTERM",()=>Yn(0)),process.on("SIGINT",()=>Yn(0)),process.on("SIGHUP",()=>{me=new Jn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l($g,"startDaemon");function Db(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>rg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Fn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1570
|
-
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await
|
|
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 wt.unlink(r):await wt.writeFile(r,`${n}
|
|
1575
|
+
`,"utf-8"),!0}catch{return!1}}l(Sb,"removePrjctSection");async function bb(){let r=fb.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ls.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await Hg(s,ls.join(t,".prjct-cli")),t}catch{return null}}l(bb,"createBackup");async function Hg(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let s of t){let n=ls.join(r,s.name),o=ls.join(e,s.name);s.isDirectory()?await Hg(n,o):await wt.copyFile(n,o)}}l(Hg,"copyDirectory");async function Tb(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await Sb(o.path)&&s.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${y(i)}`)}try{await new ts().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ei(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Ei("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(Tb,"performUninstall");async function vb(r){let e=hb.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(vb,"promptConfirmation");async function Eb(r={},e=process.cwd()){let t=await kb(),s=wb(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Te.yellow(`
|
|
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(Te.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Te.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Fg(c.size)})`)),console.log(` ${Te.cyan(u.padEnd(35))} ${d}`),console.log(` ${Te.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Te.cyan("Homebrew".padEnd(35))} ${Te.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Te.cyan("npm global".padEnd(35))} ${Te.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Te.dim(` Total size: ${Fg(o)}`)),console.log("")),r.dryRun)return console.log(Te.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Te.blue("Creating backup..."));let c=await bb();c?(console.log(Te.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Te.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Te.yellow('Type "uninstall" to confirm:')),!await vb("> ")))return console.log(Te.yellow(`
|
|
1577
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await Tb(t,s,r);if(console.log(""),i.length>0&&console.log(Te.green(`Removed ${i.length} items`)),a.length>0){console.log(Te.yellow(`
|
|
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 Xb(o);r.write(Bn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Bn(i))}}}),r.on("error",()=>{})}l(Kb,"handleConnection");async function Xb(r){if(!ve||!ge)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Xg(),ve.commandsServed++,ve.lastActivity=Date.now(),ve.commandsServed%zb===0&&$.checkpointAll(),Yg()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),nr(0)},200)),r.command==="daemon")return Qb(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 Yb(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1571
1580
|
`)||o.message||void 0,stderr:t.join(`
|
|
1572
|
-
`)||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(
|
|
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(Xb,"handleRequest");async function Yb(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return ge.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 ge.status(r.cwd,{json:t.json===!0,md:s});case"stats":return ge.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ge.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return ge.seal(r.cwd,{json:t.json===!0});case"rollback":return ge.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return ge.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ge.task(e,r.cwd,{md:s});case"done":return ge.done(r.cwd,{md:s});case"next":return ge.next(r.cwd,{md:s});case"pause":return ge.pause(e||"",r.cwd,{md:s});case"resume":return ge.resume(e,r.cwd,{md:s});case"bug":return ge.bug(e||"",r.cwd,{md:s});case"idea":return ge.idea(e||"",r.cwd,{md:s});case"ship":return ge.ship(e,r.cwd,{md:s});case"dash":return ge.dash(e||"default",r.cwd,{md:s});case"workflow":return ge.workflowPrefs(e,r.cwd,{md:s});case"sessions":return ge.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ge.design(e||"",t,r.cwd);case"analysis-payload":return ge.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ge.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return ge.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return ge.analyze(t,r.cwd);case"cleanup":return ge.cleanup(t,r.cwd);case"cleanup-projects":return ge.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return F.execute(r.command,e,r.cwd)}}l(Yb,"executeCommand");function Qb(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:_e.socket(),uptime:ve?Date.now()-ve.startedAt:0,commandsServed:ve?.commandsServed??0,lastActivity:ve?new Date(ve.lastActivity).toISOString():null,registeredCommands:F.list().length,stale:Yg()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>nr(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(Qb,"handleDaemonCommand");function Xg(){ve&&(ve.idleTimer&&clearTimeout(ve.idleTimer),ve.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${ve.idleTimeoutMs/1e3/60} minutes, shutting down`),nr(0)},ve.idleTimeoutMs),ve.idleTimer.unref&&ve.idleTimer.unref())}l(Xg,"resetIdleTimer");function nr(r){console.log("Daemon shutting down..."),ve?.idleTimer&&clearTimeout(ve.idleTimer),Nr&&(Nr.stop(),Nr=null),sr&&(sr.close(),sr=null),$.close();let e=_e.socket(),t=_e.pid();try{Oe.existsSync(e)&&Oe.unlinkSync(e)}catch{}try{Oe.existsSync(t)&&Oe.unlinkSync(t)}catch{}process.exit(r)}l(nr,"shutdown");function Zb(r){try{return process.kill(r,0),!0}catch{return!1}}l(Zb,"isProcessRunning");function eT(){let r=kt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Oe.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Oe.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(Oe.existsSync(n))return n;let s=process.argv[1];return s&&Oe.existsSync(s)?s:null}l(eT,"resolveEntryPath");var tT=1024*1024;function sT(){let r=_e.log();try{if(Oe.statSync(r).size>tT){let t=`${r}.1`;try{Oe.unlinkSync(t)}catch{}Oe.renameSync(r,t)}}catch{}}l(sT,"rotateLog");function Yg(){if(!ve?.entryPath||ve.entryMtime===null)return!1;try{return Oe.statSync(ve.entryPath).mtimeMs!==ve.entryMtime}catch{return!1}}l(Yg,"isCodeStale");var Gl=process.argv.slice(2),nT=parseInt(Gl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,rT=Gl.includes("--no-http"),oT=Gl.includes("--foreground");Kg({port:nT,noHttp:rT,foreground:oT}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|