prjct-cli 1.51.3 → 1.53.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 +29 -1
- package/dist/bin/prjct-core.mjs +661 -582
- package/dist/cli/jira.mjs +6 -6
- package/dist/cli/linear.mjs +7 -7
- package/dist/daemon/entry.mjs +518 -441
- package/dist/mcp/server.mjs +708 -0
- package/package.json +2 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,11 +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 Qf(r,e){try{let t=await we.readFile(r,"utf-8");await we.writeFile(r,e+t,"utf-8")}catch(t){if(R(t))await we.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await we.access(r),!0}catch(e){if(R(e))return!1;throw e}}async function es(r){try{return(await we.stat(r)).isDirectory()}catch(e){if(R(e))return!1;throw e}}async function Tt(r){await we.mkdir(r,{recursive:!0})}async function Zf(r){try{return await we.unlink(r),!0}catch(e){if(R(e))return!1;throw e}}async function eh(r){try{return await we.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(R(e))return!1;throw e}}async function ts(r,e={}){try{let s=await we.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(R(t))return[];throw t}}async function th(r){return(await we.stat(r)).size}async function sh(r){return(await we.stat(r)).mtime}async function nh(r,e){await we.copyFile(r,e)}async function rh(r,e){await we.rename(r,e)}async function oh(r){return(await it(r,"")).split(`
|
|
10
|
-
`)}
|
|
11
|
-
`);await Jt(r,t)}function ah(r){return Zt.extname(r)}function ch(r){return Zt.basename(r,Zt.extname(r))}var K=S(()=>{"use strict";Ni();cu();W();l(Is,"walkDir");l($s,"batchProcess");l(xe,"readJson");l(le,"writeJson");l(it,"readFile");l(Jt,"writeFile");l(Xf,"atomicWrite");l(Yf,"appendToFile");l(Li,"appendLine");l(Qf,"prependToFile");l(P,"fileExists");l(es,"dirExists");l(Tt,"ensureDir");l(Zf,"deleteFile");l(eh,"deleteDir");l(ts,"listFiles");l(th,"getFileSize");l(sh,"getFileModifiedTime");l(nh,"copyFile");l(rh,"moveFile");l(oh,"readLines");l(ih,"writeLines");l(ah,"getFileExtension");l(ch,"getFileNameWithoutExtension")});var or=S(()=>{"use strict"});import{z as qt}from"zod";function lu(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 Uv,Hv,Gv,un,Wv,Jr=S(()=>{"use strict";Uv=qt.enum(["opus","sonnet","haiku"]),Hv=qt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Gv=qt.string().min(1),un=qt.object({provider:qt.string(),model:qt.string(),cliVersion:qt.string().optional(),recordedAt:qt.string()}),Wv=qt.object({preferredModel:qt.string().optional(),lastAnalysisModel:un.optional()});l(lu,"compareSemver")});var du={};Ot(du,{execAsync:()=>O,execFileAsync:()=>Fi});import{exec as lh,execFile as uh}from"node:child_process";import{promisify as uu}from"node:util";var O,Fi,He=S(()=>{"use strict";O=uu(lh),Fi=uu(uh)});function fs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var dn,Ms=S(()=>{"use strict";l(fs,"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 dh from"node:fs/promises";import ph from"node:os";import pu from"node:path";async function gu(){try{let r=await dh.readFile(mu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||fs(e.timestamp,gh)?null:e.detection}catch{return null}}async function fu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(mu,e)}var mh,mu,gh,hu=S(()=>{"use strict";Ms();K();mh=pu.join(ph.homedir(),".prjct-cli","cache"),mu=pu.join(mh,"providers.json"),gh=600*1e3;l(gu,"readProviderCache");l(fu,"writeProviderCache")});var vt={};Ot(vt,{AntigravityProvider:()=>Hi,ClaudeProvider:()=>qr,CodexProvider:()=>Gi,CursorProvider:()=>wu,GeminiProvider:()=>Ui,Providers:()=>gt,WindsurfProvider:()=>ku,detectAllProviders:()=>ir,detectAntigravity:()=>Yr,detectCodex:()=>_s,detectCursorProject:()=>Tu,detectProvider:()=>Kr,detectWindsurfProject:()=>vu,getActiveProvider:()=>wh,getCapabilities:()=>hh,getCommandsDir:()=>Ph,getGlobalContextPath:()=>Th,getGlobalSettingsPath:()=>vh,getProjectCommandsPath:()=>Eh,getProviderBranding:()=>Xr,getSkillsPath:()=>Ch,hasProviderConfig:()=>kh,needsCursorRouterRegeneration:()=>Sh,needsWindsurfRouterRegeneration:()=>bh,selectProvider:()=>Wi,validateCliVersion:()=>bu});import hs from"node:os";import Ve from"node:path";function hh(r,e){return{...fh[r],...e}}async function Su(r){try{let{stdout:e}=await O(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function yh(r){try{let{stdout:e}=await O(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Kr(r){let e=gt[r];if(!e.cliCommand)return{installed:!1};let t=await Su(e.cliCommand);if(!t)return{installed:!1};let s=await yh(e.cliCommand),n=bu(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function bu(r,e){let t=gt[r];return!t.minCliVersion||!e?null:lu(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 ir(r=!1){if(!r){let i=await gu();if(i)return i}let[e,t,s]=await Promise.all([Kr("claude"),Kr("gemini"),_s()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await fu(o).catch(()=>{}),o}async function wh(r){if(r&>[r])return gt[r];let e=await ir();return e.claude.installed&&!e.gemini.installed?qr:e.gemini.installed&&!e.claude.installed?Ui:qr}async function kh(r){let e=gt[r];return e.configDir?P(e.configDir):!1}function Xr(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 Tu(r){let e=Ve.join(r,".cursor"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.mdc"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Sh(r){let e=await Tu(r);return e.detected&&!e.routerInstalled}async function vu(r){let e=Ve.join(r,".windsurf"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.md"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function bh(r){let e=await vu(r);return e.detected&&!e.routerInstalled}async function Yr(){let r=Hi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ve.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function _s(){let r=Gi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Su("codex"),t=Ve.join(r,"skills","prjct","SKILL.md"),s=await P(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Th(r){let e=gt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function vh(r){let e=gt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Ch(r){return gt[r].skillsDir}function Ph(r){return gt[r].commandsDir}function Eh(r,e){let t=gt[r];return Ve.join(e,t.commandsDir)}async function Wi(){let r=await ir(),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 fh,qr,Ui,Hi,wu,ku,Gi,gt,at=S(()=>{"use strict";or();Jr();He();K();hu();fh={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(hh,"getCapabilities");qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ve.join(hs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ve.join(hs.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"},Ui={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ve.join(hs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ve.join(hs.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"},Hi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ve.join(hs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ve.join(hs.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"},wu={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"},ku={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"},Gi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ve.join(hs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ve.join(hs.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"},gt={claude:qr,gemini:Ui,cursor:wu,antigravity:Hi,windsurf:ku,codex:Gi};l(Su,"whichCommand");l(yh,"getCliVersion");l(Kr,"detectProvider");l(bu,"validateCliVersion");l(ir,"detectAllProviders");l(wh,"getActiveProvider");l(kh,"hasProviderConfig");l(Xr,"getProviderBranding");l(Tu,"detectCursorProject");l(Sh,"needsCursorRouterRegeneration");l(vu,"detectWindsurfProject");l(bh,"needsWindsurfRouterRegeneration");l(Yr,"detectAntigravity");l(_s,"detectCodex");l(Th,"getGlobalContextPath");l(vh,"getGlobalSettingsPath");l(Ch,"getSkillsPath");l(Ph,"getCommandsDir");l(Eh,"getProjectCommandsPath");l(Wi,"selectProvider")});import xh from"node:crypto";import Kt from"node:fs/promises";import Vi from"node:os";import z from"node:path";import{globSync as Rh}from"glob";var Bi,Ah,A,Te=S(()=>{"use strict";ie();K();Bi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(Vi.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return xh.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await es(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Tt(this.globalBaseDir),await Tt(this.globalProjectsDir),await Tt(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 Tt(z.join(t,n));return await Tt(z.join(t,"planning","tasks")),await Tt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Oi(t);return z.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 Tt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Kt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await Kt.readdir(c,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||s&&p.name!==s.toString().padStart(2,"0"))continue;let m=z.join(c,p.name),d=await Kt.readdir(m,{withFileTypes:!0});for(let g of d)g.isDirectory()&&o.push({year:a.name,month:p.name,day:g.name,path:z.join(m,g.name),date:new Date(`${a.name}-${p.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 z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Kt.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 es(t)}getDisplayPath(e){let t=Vi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(at(),ot(vt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(at(),ot(vt)).getActiveProvider();return(at(),ot(vt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(Vi.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.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=z.join(e,n.file);if(await P(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await P(n))try{let o=await Kt.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 Kt.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
12
|
-
|
|
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(`
|
|
13
15
|
-- =======================================================================
|
|
14
16
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
15
17
|
-- =======================================================================
|
|
@@ -373,22 +375,133 @@ var zr=Object.defineProperty;var If=Object.getOwnPropertyDescriptor;var $f=Objec
|
|
|
373
375
|
);
|
|
374
376
|
|
|
375
377
|
CREATE INDEX idx_cc_project ON context_compactions(project_id);
|
|
376
|
-
`)},"up")}
|
|
378
|
+
`)},"up")},{version:10,name:"fts5-memories",up:l(r=>{r.run(`
|
|
379
|
+
-- =======================================================================
|
|
380
|
+
-- Memories: Tagged, searchable memory store (replaces memories.json)
|
|
381
|
+
-- =======================================================================
|
|
382
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
383
|
+
id TEXT PRIMARY KEY,
|
|
384
|
+
project_id TEXT NOT NULL,
|
|
385
|
+
title TEXT NOT NULL,
|
|
386
|
+
content TEXT NOT NULL,
|
|
387
|
+
tags TEXT,
|
|
388
|
+
topic_key TEXT,
|
|
389
|
+
content_hash TEXT,
|
|
390
|
+
user_triggered INTEGER NOT NULL DEFAULT 0,
|
|
391
|
+
revision_count INTEGER NOT NULL DEFAULT 1,
|
|
392
|
+
confidence TEXT,
|
|
393
|
+
observation_count INTEGER DEFAULT 0,
|
|
394
|
+
created_at TEXT NOT NULL,
|
|
395
|
+
updated_at TEXT NOT NULL,
|
|
396
|
+
deleted_at TEXT
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
|
|
400
|
+
CREATE INDEX IF NOT EXISTS idx_memories_topic ON memories(topic_key);
|
|
401
|
+
CREATE INDEX IF NOT EXISTS idx_memories_hash ON memories(content_hash);
|
|
402
|
+
CREATE INDEX IF NOT EXISTS idx_memories_deleted ON memories(deleted_at);
|
|
403
|
+
|
|
404
|
+
-- FTS5 virtual table for full-text search with BM25 ranking
|
|
405
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
406
|
+
title, content, tags,
|
|
407
|
+
content='memories', content_rowid='rowid'
|
|
408
|
+
);
|
|
409
|
+
|
|
410
|
+
-- Triggers to keep FTS index in sync
|
|
411
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
412
|
+
INSERT INTO memories_fts(rowid, title, content, tags)
|
|
413
|
+
VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
|
|
414
|
+
END;
|
|
415
|
+
|
|
416
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
417
|
+
INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
|
|
418
|
+
VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
|
|
419
|
+
END;
|
|
420
|
+
|
|
421
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
422
|
+
INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
|
|
423
|
+
VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
|
|
424
|
+
INSERT INTO memories_fts(rowid, title, content, tags)
|
|
425
|
+
VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
|
|
426
|
+
END;
|
|
427
|
+
`);try{let e=r.prepare("SELECT data FROM kv_store WHERE key = 'memory:memories'").get();if(e){let t=JSON.parse(e.data);if(t.memories&&t.memories.length>0){let s=r.prepare(`
|
|
428
|
+
INSERT OR IGNORE INTO memories
|
|
429
|
+
(id, project_id, title, content, tags, content_hash, user_triggered, confidence, observation_count, created_at, updated_at)
|
|
430
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
431
|
+
`);for(let n of t.memories)s.run(n.id,"_migrated",n.title,n.content,(n.tags||[]).join(","),null,n.userTriggered?1:0,n.confidence??null,n.observationCount??0,n.createdAt,n.updatedAt)}}}catch{}},"up")},{version:11,name:"agent-sessions",up:l(r=>{r.run(`
|
|
432
|
+
-- =======================================================================
|
|
433
|
+
-- Agent Sessions: Track AI agent work sessions across compactions
|
|
434
|
+
-- =======================================================================
|
|
435
|
+
CREATE TABLE IF NOT EXISTS agent_sessions (
|
|
436
|
+
id TEXT PRIMARY KEY,
|
|
437
|
+
project_id TEXT NOT NULL,
|
|
438
|
+
directory TEXT,
|
|
439
|
+
task_id TEXT,
|
|
440
|
+
goal TEXT,
|
|
441
|
+
started_at TEXT NOT NULL,
|
|
442
|
+
ended_at TEXT,
|
|
443
|
+
summary TEXT,
|
|
444
|
+
files_touched TEXT,
|
|
445
|
+
created_at TEXT NOT NULL
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_project ON agent_sessions(project_id);
|
|
449
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_task ON agent_sessions(task_id);
|
|
450
|
+
|
|
451
|
+
-- =======================================================================
|
|
452
|
+
-- User Prompts: Capture what the user asked (intent tracking)
|
|
453
|
+
-- =======================================================================
|
|
454
|
+
CREATE TABLE IF NOT EXISTS user_prompts (
|
|
455
|
+
id TEXT PRIMARY KEY,
|
|
456
|
+
project_id TEXT NOT NULL,
|
|
457
|
+
session_id TEXT,
|
|
458
|
+
content TEXT NOT NULL,
|
|
459
|
+
created_at TEXT NOT NULL
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
|
|
463
|
+
CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
|
|
464
|
+
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],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(`
|
|
377
465
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
378
466
|
version INTEGER PRIMARY KEY,
|
|
379
467
|
name TEXT NOT NULL,
|
|
380
468
|
applied_at TEXT NOT NULL
|
|
381
469
|
)
|
|
382
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of jh)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}},C=new Qr,N=C});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var H,cr=S(()=>{"use strict";H={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(eo,"calculateConfidence")});var Ns,lr,ur,dr=S(()=>{"use strict";re();cr();ie();Ns=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=N.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();N.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}},lr=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()}},ur=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:T(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var pr,qi=S(()=>{"use strict";re();cr();ie();dr();pr=class r extends Ns{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=T();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=eo(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=T(),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=T();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=eo(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=T(),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:T(),confidence:eo(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=T(),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 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=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import $h from"node:crypto";import{homedir as Mh}from"node:os";import{join as _h}from"node:path";function ye(){return $h.randomUUID()}var GC,It=S(()=>{"use strict";l(ye,"generateUUID");GC=_h(Mh(),".prjct-cli","projects")});var Ls,Ki=S(()=>{"use strict";It();cr();ie();dr();Ls=class extends Ns{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(H),t={};for(let s of e)t[s]=[];return t}_normalizeIndex(e){let t=Object.values(H);for(let s of t)e.index[s]||(e.index[s]=[])}_coerceTags(e){let t=new Set(Object.values(H));return e.filter(s=>t.has(s))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(n),c=T(),u={id:ye(),title:t,content:s,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let p of a)i.index[p].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,s){let n=await this.load(e),o=n.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=n.memories[o],a=i.tags||[];if(s.title&&(i.title=s.title),s.content&&(i.content=s.content),s.tags){let c=this._coerceTags(s.tags);for(let u of a)n.index[u]=n.index[u].filter(p=>p!==t);for(let u of c)n.index[u].push(t);i.tags=c}return i.updatedAt=T(),await this.save(e),!0}async deleteMemory(e,t){let s=await this.load(e),n=s.memories.findIndex(i=>i.id===t);if(n===-1)return!1;let o=s.memories[n];for(let i of o.tags||[])s.index[i]&&(s.index[i]=s.index[i].filter(a=>a!==t));return s.memories.splice(n,1),await this.save(e),!0}async findByTags(e,t,s=!1){let n=await this.load(e),o=this._coerceTags(t);if(s)return n.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=n.index[a];for(let u of c)i.add(u)}return n.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let s=await this.load(e),n=t.toLowerCase();return s.memories.filter(o=>o.title.toLowerCase().includes(n)||o.content.toLowerCase().includes(n))}async getRelevantMemories(e,t,s=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let d of i.tags||[])c.includes(d)&&(a+=10);let p=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-p),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let d of m)i.content.toLowerCase().includes(d)&&(a+=2),i.title.toLowerCase().includes(d)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,s).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let s=await this.load(e),n=s.memories.length;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=s.memories.map(d=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,d.tags||[])),t.commandName){let v=this._getCommandTags(t.commandName),D=(d.tags||[]).filter(U=>v.includes(U));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(d.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),d.confidence?g.confidence=d.confidence==="high"?20:d.confidence==="medium"?12:5:d.observationCount&&(g.confidence=Math.min(20,d.observationCount*3)),t.taskDescription){let v=this._extractKeywordsFromText(t.taskDescription),D=0;for(let U of v)d.content.toLowerCase().includes(U)&&(D+=2),d.title.toLowerCase().includes(U)&&(D+=3);g.keywords=Math.min(15,D)}d.userTriggered&&(g.userTriggered=5);let y=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...d,relevanceScore:y,scoreBreakdown:g}}).filter(d=>d.relevanceScore>=i),p=c.sort((d,g)=>g.relevanceScore-d.relevanceScore).slice(0,o),m=p.length>0?Math.round(p.reduce((d,g)=>d+g.relevanceScore,0)/p.length):0;return{memories:p,metrics:{totalMemories:n,memoriesConsidered:c.length,memoriesReturned:p.length,filteringRatio:n>0?p.length/n:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){return 0}_getCommandTags(e){return{ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE],task:[H.BRANCH_NAMING,H.CODE_STYLE],sync:[H.TECH_STACK,H.ARCHITECTURE,H.DEPENDENCIES],test:[H.TEST_BEHAVIOR],bug:[H.CODE_STYLE,H.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),s=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(n=>n.length>2&&!s.has(n))}_extractContextTags(e){let t=[],s={ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE]};return e.commandName&&s[e.commandName]&&t.push(...s[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let s=["the","a","an","is","are","to","for","and","or","in"];return t.filter(n=>n.length>2&&!s.includes(n))}async autoRemember(e,t,s,n=""){let i={commit_footer:[H.COMMIT_STYLE],branch_naming:[H.BRANCH_NAMING],test_before_ship:[H.TEST_BEHAVIOR,H.SHIP_WORKFLOW],preferred_agent:[H.AGENT_PREFERENCE],code_style:[H.CODE_STYLE],verbosity:[H.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${s}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
|
472
|
+
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
473
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}async updateMemory(e,t,s){let n=$.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
|
|
476
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
477
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
478
|
+
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Zt)}catch{let o=`%${t}%`;return $.query(e,`SELECT * FROM memories
|
|
479
|
+
WHERE project_id = ? AND deleted_at IS NULL
|
|
480
|
+
AND (title LIKE ? OR content LIKE ?)
|
|
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
|
|
482
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
483
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
484
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(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
|
|
486
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
487
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
488
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Zt)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=$.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
489
|
+
WHERE project_id = ? AND deleted_at IS NULL
|
|
490
|
+
GROUP BY title HAVING cnt > 1`,e),n=S();for(let o of s){let i=$.query(e,`SELECT * FROM memories
|
|
491
|
+
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
492
|
+
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(p=>p.content!==a.content).map(p=>p.content)].filter((p,g,h)=>h.indexOf(p)===g).join(`
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
`),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&$.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}
|
|
387
500
|
|
|
388
|
-
${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,`
|
|
389
502
|
|
|
390
503
|
`).trim()}
|
|
391
|
-
`}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 -->
|
|
392
505
|
# p/ \u2014 Context layer for AI agents
|
|
393
506
|
|
|
394
507
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -404,22 +517,22 @@ Data:
|
|
|
404
517
|
|
|
405
518
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
406
519
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
407
|
-
`;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
|
|
408
521
|
|
|
409
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(`
|
|
410
|
-
`)}function
|
|
411
|
-
`)}function hr(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 ca=S(()=>{"use strict";l(Lu,"generateAnalysisDiff");l(aa,"formatAnalysisDiffMd");l(Fu,"formatAnalysisDiffText");l(hr,"diffStringArray")});var la,ua,Uu,yr=S(()=>{"use strict";la=[1,2,3,5,8,13,21],ua={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}},Uu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import oy from"node:fs/promises";import iy from"node:path";function yn(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 ay(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let d of s)t.push(...yn(d));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 d of n){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(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 d of o){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let d=a[1];if(d.startsWith(".")||d.startsWith("@/"))t.push(...yn(d));else{let g=d.startsWith("@")?d.split("/").slice(0,2).join("/"):d.split("/")[0];t.push(...yn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let d=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...d)}let p=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=p.exec(r))!==null;){let d=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...d)}return t.filter(d=>d.length>1&&!Wu.has(d)&&/^[a-z][a-z0-9]*$/.test(d))}function cy(r){return r.split(/\s+/).flatMap(e=>yn(e)).filter(e=>e.length>1&&!Wu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function ly(r){let e=await Is(r),t={},s={},n=0,o=await $s(e,50,async a=>{try{let c=await oy.readFile(iy.join(r,a),"utf-8"),u=ay(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 p of c)u.set(p,(u.get(p)||0)+1);for(let[p,m]of u)s[p]||(s[p]=[]),s[p].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 uy(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function dy(r,e){let t=cy(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=uy(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let p=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),d=i*(p/m);s.set(a,(s.get(a)||0)+d)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function py(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]))};N.setDoc(r,Vu,t)}function po(r){let e=N.getDoc(r,Vu);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 Bu(r,e){let t=await ly(r);return py(e,t),t}function zu(r,e,t=15){let s=po(r);return s?dy(e,s).slice(0,t):[]}var Wu,Vu,da=S(()=>{"use strict";yr();re();K();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(yn,"splitIdentifier");l(ay,"tokenizeFile");l(cy,"tokenizeQuery");l(ly,"buildIndex");l(uy,"idf");l(dy,"score");Vu="bm25-index";l(py,"saveIndex");l(po,"loadIndex");l(Bu,"indexProject");l(zu,"queryFiles")});import pa from"node:fs/promises";import ys from"node:path";import{z as X}from"zod";async function yy(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=ys.join(e,"package.json"),n=await pa.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let p=u.toLowerCase();Object.keys(i).some(d=>d.toLowerCase().includes(p))?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 R(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 wy(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 Ty(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=hy[a];if(!c)continue;c.some(p=>n.has(p))?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 ky(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=ys.join(e,a);await P(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 Sy(r,e){let t=Date.now();try{let s=await vy(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 by(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=ys.join(e,o.file);await P(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([yy(r,e),wy(r,e),ky(r,e),Sy(r,e),by(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 Ty(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ys.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function vy(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.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 my,gy,fy,ma,hE,hy,qu=S(()=>{"use strict";W();K();Jr();my=X.enum(["draft","verified","sealed"]),gy=X.object({name:X.string(),description:X.string(),location:X.string().optional(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),fy=X.object({issue:X.string(),file:X.string(),suggestion:X.string(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),ma=X.object({projectId:X.string(),languages:X.array(X.string()),frameworks:X.array(X.string()),packageManager:X.string().optional(),sourceDir:X.string().optional(),testDir:X.string().optional(),configFiles:X.array(X.string()),fileCount:X.number(),patterns:X.array(gy),antiPatterns:X.array(fy),analyzedAt:X.string(),modelMetadata:un.optional(),status:my.default("draft"),commitHash:X.string().optional(),signature:X.string().optional(),sealedAt:X.string().optional(),verifiedAt:X.string().optional()}),hE={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},hy={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(yy,"verifyFrameworks");l(wy,"verifyLanguages");l(ky,"verifyPatternLocations");l(Sy,"verifyFileCount");l(by,"verifyAntiPatternFiles");l(Ju,"semanticVerify");l(Ty,"getProjectExtensions");l(vy,"countProjectFiles")});import{createHash as Ku}from"node:crypto";function wr(r){return Ku("sha256").update(r).digest("hex")}function mo(r){return wr(r).slice(0,16)}function Xu(r){return Ku("md5").update(r).digest("hex")}var wn=S(()=>{"use strict";l(wr,"sha256");l(mo,"sha256Short");l(Xu,"md5")});var ga,ws,fa=S(()=>{"use strict";Te();ie();K();ga=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await xe(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await xe(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:T(),success:!0};await le(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await xe(t,null)}},ws=new ga});var qe,is=S(()=>{"use strict";fa();Ms();ie();re();qe=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=C.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){C.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:T(),projectId:e};await ws.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:T()};await this.publishEvent(e,o,i)}async exists(e){try{return C.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ha,Ke,kn=S(()=>{"use strict";qu();ca();ie();wn();is();ha=class extends qe{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"};ma.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:T()})),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=T(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ma.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=T();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:Lu(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 wr(JSON.stringify(t))}},Ke=new ha});var ya,Cy,Lt,kr=S(()=>{"use strict";ie();re();ya=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=C.getDb(e),n=T();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=C.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?C.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return C.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}})}},Cy=new ya,Lt=Cy});import{z as b}from"zod";var Py,go,Ey,xy,Ry,wa,Qu,Zu,ed,td,Yu,Ay,Dy,sd,nd,rd,jy,Iy,BE,ka=S(()=>{"use strict";Jr();Py=b.enum(["low","medium","high","critical"]),go=b.enum(["feature","bug","improvement","chore"]),Ey=b.enum(["active","backlog","previously_active"]),xy=b.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ry=b.enum(["task_completed","feature_shipped","idea_captured","session_started"]),wa=b.object({title:b.string(),description:b.string(),filesChanged:b.array(b.object({path:b.string(),action:b.enum(["created","modified","deleted"])})),whatWasDone:b.array(b.string()).min(1),outputForNextAgent:b.string().min(1),notes:b.string().optional()}),Qu=b.object({output:b.string().min(1,"Subtask output is required"),summary:wa}),Zu=b.object({id:b.string(),description:b.string(),domain:b.string(),agent:b.string(),status:xy,dependsOn:b.array(b.string()),startedAt:b.string().optional(),completedAt:b.string().optional(),output:b.string().optional(),summary:wa.optional(),skipReason:b.string().optional(),blockReason:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional()}),ed=b.object({completed:b.number(),total:b.number(),percentage:b.number()}),td=b.object({id:b.string(),description:b.string(),type:go.optional(),startedAt:b.string(),sessionId:b.string(),featureId:b.string().optional(),subtasks:b.array(Zu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:ed.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional(),parentDescription:b.string().optional(),branch:b.string().optional(),prUrl:b.string().optional()}),Yu=b.object({id:b.string(),description:b.string(),status:b.literal("paused"),startedAt:b.string(),pausedAt:b.string(),pauseReason:b.string().optional(),type:go.optional(),sessionId:b.string().optional(),featureId:b.string().optional(),subtasks:b.array(Zu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:ed.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),Ay=b.object({stackConfirmed:b.array(b.string()).optional(),patternsDiscovered:b.array(b.string()).optional(),agentAccuracy:b.array(b.object({agent:b.string(),rating:b.enum(["helpful","neutral","inaccurate"]),note:b.string().optional()})).optional(),issuesEncountered:b.array(b.string()).optional()}),Dy=b.object({taskId:b.string(),title:b.string(),classification:go,startedAt:b.string(),completedAt:b.string(),subtaskCount:b.number(),subtaskSummaries:b.array(wa),outcome:b.string(),branchName:b.string(),linearId:b.string().optional(),linearUuid:b.string().optional(),prUrl:b.string().optional(),feedback:Ay.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),sd=b.object({currentTask:td.nullable(),previousTask:Yu.nullable().optional(),pausedTasks:b.array(Yu).optional(),taskHistory:b.array(Dy).optional(),lastUpdated:b.string()}),nd=b.object({id:b.string(),description:b.string(),priority:Py,type:go,featureId:b.string().optional(),originFeature:b.string().optional(),completed:b.boolean(),completedAt:b.string().optional(),createdAt:b.string(),section:Ey,agent:b.string().optional(),groupName:b.string().optional(),groupId:b.string().optional()}),rd=b.object({tasks:b.array(nd),lastUpdated:b.string()}),jy=b.object({tasksToday:b.number(),tasksThisWeek:b.number(),streak:b.number(),velocity:b.string(),avgDuration:b.string()}),Iy=b.object({type:Ry,description:b.string(),timestamp:b.string(),duration:b.string().optional()}),BE=b.object({projectId:b.string(),currentTask:td.nullable(),queue:b.array(nd),stats:jy,recentActivity:b.array(Iy),lastSync:b.string()})});var Sr,Sa,Gs,ba=S(()=>{"use strict";Sr={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"}},Sa=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=Sr[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 Sr[e]}getPrompt(e){return Sr[e].prompt}getValidCommands(e){return Sr[e].transitions}formatNextSteps(e){return Sr[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}`}})}},Gs=new Sa});var as,Ta,Mt,Ws=S(()=>{"use strict";It();ie();re();as={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ta=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=ye(),n=T();return C.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=T();return C.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(ye(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?C.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):C.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=C.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=C.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(C.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);C.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return C.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Mt=new Ta});var va,_,Pt=S(()=>{"use strict";It();ka();ie();ba();Ws();is();va=class extends qe{static{l(this,"StateStorage")}constructor(){super("state.json",sd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Gs.getCurrentState(e),n=Gs.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:T()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:T()})),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:T()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=T(),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:T(),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:T()})),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:p,...m}=i,d={...m,startedAt:T(),sessionId:i.sessionId??ye()};return await this.update(e,g=>({...g,currentTask:d,previousTask:null,pausedTasks:a,lastUpdated:T()})),await this.publishEvent(e,"task.resumed",{taskId:d.id,description:d.description,resumedAt:d.startedAt,remainingPaused:a.length}),d}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:T()}));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:T()}))}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(d=>d.feedback),n=[],o=[],i=[],a=[];for(let d of s){let g=d.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)],p=new Map;for(let d of a)p.set(d,(p.get(d)||0)+1);let m=[...p.entries()].filter(([d,g])=>g>=2).map(([d])=>d);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}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:T()})),{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?T():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:T()})),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=Qu.safeParse(t);if(!s.success){let h=s.error.issues.map(k=>`${k.path.join(".")}: ${k.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:
|
|
412
525
|
${h.join(`
|
|
413
|
-
`)}`)}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:
|
|
414
|
-
// ... 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(`
|
|
415
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+=`
|
|
416
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
417
|
-
`).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(`
|
|
418
531
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
419
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
420
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
421
|
-
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let
|
|
422
|
-
`)}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(`
|
|
423
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(`
|
|
424
537
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
425
538
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -430,19 +543,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Ea(r){return r.incl
|
|
|
430
543
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
431
544
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
432
545
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
433
|
-
`)}var
|
|
434
|
-
`).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: ${
|
|
435
|
-
`)}async getSessionInfo(e){return
|
|
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(`
|
|
547
|
+
`).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${y(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
548
|
+
`)}async getSessionInfo(e){return md.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
436
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(`
|
|
437
|
-
`)}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}},
|
|
438
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&Qy(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function Qy(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 Zy(r,e=100){let t=await Yy(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 p=ew(a[c],a[u]);n.set(p,(n.get(p)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),p=s.get(c)||0,m=s.get(u)||0;if(p<2||m<2)continue;let d=p+m-a,g=d>0?a/d: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 ew(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function tw(r,e){N.setDoc(r,Ad,e)}function Dd(r){return N.getDoc(r,Ad)}async function jd(r,e,t=100){let s=await Zy(r,t);return tw(e,s),s}var Ad,Id=S(()=>{"use strict";yr();re();He();l(Yy,"parseGitLog");l(Qy,"isSourceFile");l(Zy,"buildMatrix");l(ew,"pairKey");Ad="cochange-index";l(tw,"saveMatrix");l(Dd,"loadMatrix");l(jd,"indexCoChanges")});async function ko(r){try{let{stdout:e}=await O(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sw(){let r=await ko("gh api user --jq .login");return r.success&&r.output||(r=await ko("git config --global github.user"),r.success&&r.output)?r.output:null}async function nw(){let r=await ko("git config user.name");return r.success&&r.output?r.output:null}async function rw(){let r=await ko("git config user.email");return r.success&&r.output?r.output:null}async function Tn(){let[r,e,t]=await Promise.all([sw(),nw(),rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var So=S(()=>{"use strict";He();l(ko,"execCommand");l(sw,"detectGitHubUsername");l(nw,"detectGitName");l(rw,"detectGitEmail");l(Tn,"detect")});import Ma from"node:fs/promises";import ow from"node:path";import*as bo from"jsonc-parser";function $d(r){let e=[],t=bo.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}: ${bo.printParseErrorCode(s.error)}`)}return t}var _a,iw,$,Et=S(()=>{"use strict";ss();W();ie();K();Ct();So();Te();l($d,"parseJsonc");_a=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await Ma.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read config at ${e}: ${ue(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 Ma.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read global config for ${e}: ${ue(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=T();t={projectId:e,authors:[],version:Ae,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=T(),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:Ae,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=T(),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 Ma.readdir(ow.join(o,"core"))).length===0}catch(i){return R(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId: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=T();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=T(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Tn(),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))}}},iw=new _a,$=iw});import Nd from"node:fs/promises";import Md from"node:os";import Oa from"node:path";function cw(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:Na}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Na}}}}function Ld(){return cw().mcpServers?.context7||Na}function _d(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Oa.join(Md.tmpdir(),"prjct-context7-test","mcp.json"):Oa.join(Md.homedir(),".claude","mcp.json")}async function Od(r){try{let e=await Nd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(R(e))return{};throw e}}async function lw(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Ld(),e=[...r.args||[],"--help"];await Fi(r.command||"npx",e,{timeout:15e3})}var Na,vn,La,uw,ls,br=S(()=>{"use strict";Hs();or();W();He();K();Na={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},vn=null;l(cw,"parseTemplateConfig");l(Ld,"getContext7Config");l(_d,"getConfigPath");l(Od,"readConfig");l(lw,"runSmokeCheck");La=class{static{l(this,"Context7Service")}async install(){let e=_d(),t=Oa.dirname(e);await Nd.mkdir(t,{recursive:!0});let s=await Od(e),n=s.mcpServers||{};return n.context7=Ld(),s.mcpServers=n,await le(e,s),vn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(vn&&Date.now()-vn.at<3e5)return vn.status;let e=_d(),n=((await Od(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 lw();let o={installed:!0,verified:!0,configPath:e};return vn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${w(o)}`};return vn={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}},uw=new La,ls=uw});var To,Fa=S(()=>{"use strict";To={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 Ua(r,e){return{...To[r],...e}}function vo(r,e,t){return{message:r,hint:e,...t}}var Co=S(()=>{"use strict";Fa();Fa();l(Ua,"getError");l(vo,"createError")});import{execSync as Ha}from"node:child_process";var Po,Ga,Eo,Fd,Ud=S(()=>{"use strict";Ms();Co();Po={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ga=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=Po[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=Po[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=Po[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
550
|
+
`)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},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(`
|
|
439
552
|
`);throw new Eo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
440
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
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}
|
|
441
554
|
|
|
442
555
|
${s}
|
|
443
|
-
`,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
|
|
444
557
|
# prjct Status Line for Claude Code
|
|
445
|
-
CLI_VERSION="${
|
|
558
|
+
CLI_VERSION="${Ee}"
|
|
446
559
|
input=$(cat)
|
|
447
560
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
448
561
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -471,7 +584,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
471
584
|
fi
|
|
472
585
|
fi
|
|
473
586
|
echo "prjct"
|
|
474
|
-
`;await Z.writeFile(n,k,{mode:493})}await Bd(t,n),await Vd(e,t)}catch(r){R(r)||V.warn(`Status line warning: ${w(r)}`)}}async function Ao(r,e){if(!await P(r))return;let t=await Z.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ce.join(r,s),o=ce.join(e,s);await Z.copyFile(n,o),await Z.chmod(o,493)}}async function Bd(r,e){try{if(await P(r)){if((await Z.lstat(r)).isSymbolicLink()&&await Z.readlink(r)===e)return;await Z.unlink(r)}await Z.symlink(e,r)}catch{try{await P(e)&&(await Z.copyFile(e,r),await Z.chmod(r,493))}catch(s){R(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function vw(r,e){if(console.log(""),r.cliInstalled?console.log(` ${fe.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${fe.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${fe.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${fe.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${fe.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${fe.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${fe.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var qd,Cw,jo=S(()=>{"use strict";Hs();br();Ud();re();W();Vs();K();wn();ns();Ct();at();os();Ja();ia();l(fw,"installAICLI");l(zd,"run");l(hw,"installGeminiRouter");l(yw,"installGeminiGlobalConfig");l(Jd,"installAntigravitySkill");l(ww,"needsAntigravityInstallation");qd="prjct-codex-router";l(Kd,"getCodexSkillPath");l(kw,"getCodexSkillMetadata");l(Wd,"parseCodexSkillMetadata");l(Sw,"hashContent");l(Xd,"loadCodexSkillTemplate");l(Yd,"buildCodexSkillContent");l(qa,"installCodexSkill");l(Do,"verifyCodexPRouterReady");l(bw,"migrateProjectsCliVersion");l(Vd,"ensureStatusLineSettings");l(Tw,"installStatusLine");l(Ao,"installStatusLineModules");l(Bd,"ensureStatusLineSymlink");l(vw,"showResults");Cw=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Cw&&zd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as B}from"zod";var Pw,Ew,Qd,xw,Rw,Aw,Dw,jw,Zd,uA,ep=S(()=>{"use strict";Pw=B.enum(["low","medium","high"]),Ew=B.enum(["pending","converted","completed","archived","dormant"]),Qd=B.enum(["high","medium","low"]),xw=B.object({impact:Qd,effort:Qd}),Rw=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Aw=B.object({name:B.string(),description:B.string()}),Dw=B.object({name:B.string(),description:B.string().optional()}),jw=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:Pw,status:Ew,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:xw.optional(),implementationNotes:B.string().optional(),stack:Rw.optional(),modules:B.array(Aw).optional(),roles:B.array(Dw).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),Zd=B.object({ideas:B.array(jw),lastUpdated:B.string()}),uA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Xa,Ge,ks=S(()=>{"use strict";ep();It();ie();Ws();is();Xa=class extends qe{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Zd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:ye(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:T()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:T()})),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:T()})),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:T()})),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:T()}))}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:T()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:T()}))}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:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=gs(as.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:T()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Ge=new Xa});var Ya,Pn,Qa=S(()=>{"use strict";uo();ie();is();Ya=class extends qe{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",_u)}getDefault(){return{...Ou}}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,p=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],d=m.findIndex(v=>v.date===o);if(d>=0){let v=m[d];m[d]={...v,tokensSaved:v.tokensSaved+s,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+n)/(v.syncs+1),totalDuration:v.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],k=m.filter(v=>v.date>=h),y=[...i.agentUsage];if(t.agents)for(let v of t.agents){let D=y.findIndex(U=>U.agentName===v);D>=0?y[D]={...y[D],usageCount:y[D].usageCount+1,tokensSaved:y[D].tokensSaved+Math.floor(s/t.agents.length)}:y.push({agentName:v,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:p,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:y,dailyStats:k,firstSync:i.firstSync||T(),lastUpdated:T()}})}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:Nu(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)}},Pn=new Ya});import ee from"node:fs/promises";import Y from"node:path";async function Io(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(C.exists(r)&&C.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=Y.join(s,"storage"),o=Y.join(s,"index"),i=Y.join(s,"memory");t.backupDir=await Iw(n,o,i),C.getDb(r);for(let{filename:c,key:u}of tc){let p=Y.join(n,c),m=await Ut(p);if(m===null){t.skippedFiles.push(c);continue}try{C.setDoc(r,u,m),tp(r,u,m),t.migratedFiles.push(c)}catch(d){t.errors.push({file:c,error:String(d)})}}for(let{filename:c,key:u}of ec){let p=Y.join(o,c),m=await Ut(p);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),sp(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(d){t.errors.push({file:`index/${c}`,error:String(d)})}}await Uw(r,o,t),await Hw(r,o,t),await Gw(r,i,t),await Ww(r,i,t);let a=Y.join(s,"sessions");return await Vw(r,a,t),t.errors.length===0&&await Bw(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 Iw(r,e,t){let s=Y.join(r,"backup");return await ee.mkdir(s,{recursive:!0}),await ee.mkdir(Y.join(s,"index"),{recursive:!0}),await ee.mkdir(Y.join(s,"memory"),{recursive:!0}),await Za(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Za(e,Y.join(s,"index")),await Za(t,Y.join(s,"memory")),s}async function Za(r,e,t){try{let s=await ee.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Y.join(r,n.name),i=Y.join(e,n.name);await ee.copyFile(o,i)}}catch(s){if(!R(s))throw s}}function tp(r,e,t){switch(e){case"state":$w(r,t);break;case"queue":Mw(r,t);break;case"ideas":_w(r,t);break;case"shipped":Ow(r,t);break;case"metrics":Nw(r,t);break;case"analysis":Lw(r,t);break}}function $w(r,e){let t=C.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(`
|
|
475
588
|
INSERT OR REPLACE INTO tasks
|
|
476
589
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
477
590
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -482,92 +595,92 @@ echo "prjct"
|
|
|
482
595
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
483
596
|
depends_on, started_at, completed_at, output, summary)
|
|
484
597
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
485
|
-
`),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
|
|
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(`
|
|
486
599
|
INSERT OR REPLACE INTO queue_tasks
|
|
487
600
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
488
601
|
feature_id, feature_name)
|
|
489
602
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
490
|
-
`);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
|
|
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(`
|
|
491
604
|
INSERT OR REPLACE INTO ideas
|
|
492
605
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
493
606
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
494
|
-
`);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
|
|
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(`
|
|
495
608
|
INSERT OR REPLACE INTO shipped_features
|
|
496
609
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
497
610
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
498
|
-
`);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
|
|
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(`
|
|
499
612
|
INSERT OR REPLACE INTO metrics_daily
|
|
500
613
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
501
614
|
VALUES (?, ?, ?, ?, ?)
|
|
502
|
-
`);for(let o of t)n.run(I(o.date)??new Date().toISOString().slice(0,10),
|
|
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(`
|
|
503
616
|
INSERT OR REPLACE INTO analysis
|
|
504
617
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
505
618
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
506
|
-
`),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
|
|
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(`
|
|
507
620
|
INSERT OR REPLACE INTO index_files
|
|
508
621
|
(path, categories, domain, score, size, mtime, language)
|
|
509
622
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
510
|
-
`);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
|
|
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(`
|
|
511
624
|
INSERT OR REPLACE INTO index_files
|
|
512
625
|
(path, score, size, mtime, language, categories, domain)
|
|
513
626
|
VALUES (?, ?, ?, ?, NULL,
|
|
514
627
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
515
628
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
516
|
-
`);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,
|
|
517
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=
|
|
518
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=
|
|
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(`
|
|
519
632
|
INSERT OR IGNORE INTO sessions
|
|
520
633
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
521
634
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
522
|
-
`),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),
|
|
523
|
-
`).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(`
|
|
524
637
|
INSERT OR IGNORE INTO sessions
|
|
525
638
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
526
639
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
527
|
-
`).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),Ss(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=Y.join(a,"current.json"),p=await Ut(u);p!==null&&(c(p),await ee.unlink(u).catch(()=>{}),s++);let m=Y.join(a,"archive");try{let h=await ee.readdir(m);for(let y of h){let v=Y.join(m,y);try{if(!(await ee.stat(v)).isDirectory())continue;let U=await ee.readdir(v);for(let j of U){if(!j.endsWith(".json"))continue;let E=await Ut(Y.join(v,j));E!==null&&(c(E),await ee.unlink(Y.join(v,j)).catch(()=>{}),s++)}(await ee.readdir(v)).length===0&&await ee.rmdir(v).catch(()=>{})}catch{}}(await ee.readdir(m).catch(()=>[])).length===0&&await ee.rmdir(m).catch(()=>{})}catch{}try{(await ee.readdir(a)).length===0&&await ee.rmdir(a).catch(()=>{})}catch{}let d=Y.join(e,"index"),g=[...ec.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let k=Y.join(d,h),y=await Ut(k);if(y===null)continue;let v=ec.find(D=>D.filename===h);v&&(C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(y),new Date().toISOString()),sp(r,v.key,y));try{await ee.unlink(k)}catch{}s++}return s}var tc,ec,sc=S(()=>{"use strict";Te();W();re();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(Io,"migrateJsonToSqlite");l(Iw,"createBackup");l(Za,"copyFiles");l(tp,"populateNormalized");l($w,"populateTasksFromState");l(Mw,"populateQueueTasks");l(_w,"populateIdeas");l(Ow,"populateShippedFeatures");l(Nw,"populateMetricsDaily");l(Lw,"populateAnalysis");l(sp,"populateIndexTables");l(Fw,"populateCategoriesIndex");l(Uw,"migrateChecksums");l(Hw,"migrateFileScores");l(Gw,"migrateEventsJsonl");l(Ww,"migrateLearningsJsonl");l(Vw,"migrateSessionFiles");l(Bw,"cleanupJsonFiles");l(I,"toStr");l(Ss,"toNum");l(Ut,"readJsonSafe");l($o,"sweepLegacyJson")});function op(r){return[...r].sort((e,t)=>{let s=rp[e.section]-rp[t.section];return s!==0?s:np[e.priority]-np[t.priority]})}function Tr(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var np,rp,Mo=S(()=>{"use strict";np={critical:0,high:1,medium:2,low:3},rp={active:0,previously_active:1,backlog:2};l(op,"sortBySectionAndPriority");l(Tr,"uniqueBy")});var nc,be,Xt=S(()=>{"use strict";It();ka();Mo();ie();Ws();is();nc=class extends qe{static{l(this,"QueueStorage")}constructor(){super("queue.json",rd)}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 op(t)[0]||null}async addTask(e,t){let s={...t,id:ye(),createdAt:T(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:T()})),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=T(),n=t.map(o=>({...o,id:ye(),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:T()})),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:T()},s):i),lastUpdated:T()})),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:T()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:T()}))}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:T()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=gs(as.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:T()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},be=new nc});import{z as te}from"zod";var zw,ip,Jw,qw,Kw,Xw,Yw,Qw,Zw,ap,cp=S(()=>{"use strict";zw=te.enum(["feature","fix","improvement","refactor"]),ip=te.enum(["pass","warning","fail","skipped"]),Jw=te.enum(["added","changed","fixed","removed"]),qw=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),Kw=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),Xw=te.object({description:te.string(),type:Jw.optional()}),Yw=te.object({lintStatus:ip.nullable().optional(),lintDetails:te.string().optional(),testStatus:ip.nullable().optional(),testDetails:te.string().optional()}),Qw=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),Zw=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:zw,agent:te.string().optional(),description:te.string().optional(),changes:te.array(Xw).optional(),codeSnippets:te.array(te.string()).optional(),commit:Qw.optional(),codeMetrics:Kw.optional(),qualityMetrics:Yw.optional(),quantitativeImpact:te.string().optional(),duration:qw.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),ap=te.object({shipped:te.array(Zw),lastUpdated:te.string()})});var rc,tt,zs=S(()=>{"use strict";It();cp();ie();Ws();is();rc=class extends qe{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",ap)}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:ye(),shippedAt:T()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:T()})),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=gs(as.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:T()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},tt=new rc});import{z as me}from"zod";var ek,tk,lp,ZA,eD,tD,bs,up,vr=S(()=>{"use strict";ek=me.enum(["improving","stable","declining"]),tk=me.object({sprintNumber:me.number(),startDate:me.string(),endDate:me.string(),pointsCompleted:me.number(),tasksCompleted:me.number(),avgVariance:me.number(),estimationAccuracy:me.number()}),lp=me.object({category:me.string(),avgVariance:me.number(),taskCount:me.number()}),ZA=me.object({totalPoints:me.number(),sprints:me.number(),estimatedDate:me.string()}),eD=me.object({sprints:me.array(tk),averageVelocity:me.number(),velocityTrend:ek,estimationAccuracy:me.number(),overEstimated:me.array(lp),underEstimated:me.array(lp),lastUpdated:me.string()}),tD=me.object({sprintLengthDays:me.number().min(1).max(90).default(7),startDay:me.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:me.number().min(1).max(52).default(6),accuracyTolerance:me.number().min(0).max(100).default(20)}),bs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},up={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var oc,_o,ic=S(()=>{"use strict";vr();is();oc=class extends qe{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:up,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}},_o=new oc});var Cr,ac,cc,dp=S(()=>{"use strict";cr();ie();Cr=3,ac=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>=Cr){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}/${Cr} 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>=Cr){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}/${Cr} 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]}`,p=t.get(u)||{count:0,tasks:[]};p.count++,p.tasks.push(n.taskId),t.set(u,p)}}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>=Cr&&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:[H.FILE_STRUCTURE,H.ARCHITECTURE],tech_stack:[H.TECH_STACK],architecture:[H.ARCHITECTURE,H.CODE_STYLE],estimation:[H.SHIP_WORKFLOW],workflow:[H.SHIP_WORKFLOW,H.CODE_STYLE],gotcha:[H.TEST_BEHAVIOR,H.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: ${T()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
528
|
-
`)}},
|
|
529
|
-
`)}},
|
|
530
|
-
${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?"":`
|
|
531
644
|
## Patterns
|
|
532
645
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
533
646
|
`)}
|
|
534
|
-
`}function
|
|
647
|
+
`}function Tw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
535
648
|
## Anti-Patterns
|
|
536
649
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
537
650
|
`)}
|
|
538
|
-
`}function
|
|
651
|
+
`}function vw(r){return r.knownGotchas.length===0?"":`
|
|
539
652
|
## Known Gotchas
|
|
540
653
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
541
654
|
`)}
|
|
542
|
-
`}function
|
|
655
|
+
`}function Ew(r){return r.recentShipped.length===0?"":`
|
|
543
656
|
## Recent Deliveries
|
|
544
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(`
|
|
545
658
|
`)}
|
|
546
|
-
`}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?"":`
|
|
547
660
|
## Velocity
|
|
548
661
|
${e.join(" | ")}
|
|
549
|
-
`}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?"":`
|
|
550
663
|
## Commands
|
|
551
664
|
| Action | Command |
|
|
552
665
|
|--------|---------|
|
|
553
666
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
554
667
|
`)}
|
|
555
|
-
`}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?"":`
|
|
556
669
|
## State
|
|
557
670
|
${e.join(`
|
|
558
671
|
`)}
|
|
559
|
-
`}function
|
|
672
|
+
`}function Aw(r){return r.userPatterns.length===0?"":`
|
|
560
673
|
## User Patterns
|
|
561
674
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
562
675
|
`)}
|
|
563
|
-
`}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`---
|
|
564
677
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
565
678
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
566
679
|
user-invocable: ${t}
|
|
567
|
-
---`}function
|
|
680
|
+
---`}function Iw(r,e){return`${Dw(r,e)}
|
|
568
681
|
|
|
569
|
-
${r.body(e)}`}var
|
|
570
|
-
${
|
|
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(`
|
|
571
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(`
|
|
572
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
|
|
573
686
|
|
|
@@ -650,47 +763,81 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
650
763
|
|
|
651
764
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
652
765
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
653
|
-
`,"body")}];l(
|
|
654
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let
|
|
655
|
-
`).filter(Boolean).map(u=>{let[p,m,d]=u.split("|");return{hash:p,message:m,date:d}});let{stdout:c}=await O('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:ue(t)})}return e}async function Ht(r,e){let t=await P(yc.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Ip(r){let e={fileCount:0,version:"0.0.0",name:yc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await O('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){V.debug("File count failed",{path:r,error:ue(t)}),e.fileCount=0}try{let t=yc.join(r,"package.json"),s=await xe(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 Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:ue(t)})}return await Ht(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Ht(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Ht(r,"requirements.txt")||await Ht(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function $p(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Ht(r,"bun.lockb")||await Ht(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 Ht(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Ht(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Ht(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Ht(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Mp(r){return new Lo(r).detect()}var _p=S(()=>{"use strict";ss();Rp();He();K();ns();Dp();l(jp,"analyzeGit");l(Ht,"fileExistsInProject");l(Ip,"gatherStats");l($p,"detectCommands");l(Mp,"detectStack")});import Op from"node:fs/promises";import Fo from"node:path";var wc,kc,Np,Lp=S(()=>{"use strict";Pt();W();He();K();wc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Fo.join(r,n);await P(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=Fo.basename(r);try{await _.read(s)}catch(n){R(n)||t.push(`state: ${w(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=Fo.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 Op.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Op.readFile(Fo.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(!R(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(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}}},kc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[wc.contextFilesExist(t),wc.jsonFilesValid(t),wc.noSensitiveData(t)];for(let d of c){let g=await d;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(d=>d.passed))&&s?.checks)for(let d of s.checks){if(d.enabled===!1){a++;continue}let g=await this.runCustomCheck(d,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(d)+1);a+=h.filter(k=>k.enabled!==!1).length;break}}let p=o.filter(d=>!d.passed).length,m=o.filter(d=>d.passed).length;return{passed:p===0,checks:o,totalMs:Date.now()-n,failedCount:p,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 O(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}}}},Np=new kc});import Fp from"node:fs/promises";import Sc from"node:path";var bc,qs,Tc=S(()=>{"use strict";mr();da();vd();Ed();Id();Da();ss();at();os();Et();Te();jo();kn();Ws();re();ks();kr();Qa();sc();Xt();zs();Pt();ic();ie();K();ns();dp();bp();br();vp();Js();Pp();xp();_p();Lp();bc=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 $.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 Fp.rm(Sc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await _s()).installed){let j=await Do({autoRepair:!0});j.verified||V.warn(`Codex p. router not ready: ${j.message||"verification failed"}`)}try{n=await ls.ensureReady()}catch(j){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:ue(j)},error:`Context7 MCP is required but not ready: ${ue(j)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Io(this.projectId);try{let j=await $o(this.projectId);j>0&&V.info("Swept legacy JSON files into SQLite",{swept:j})}catch(j){V.debug("Legacy JSON sweep failed (non-critical)",{error:ue(j)})}let[a,c,u,p]=await Promise.all([jp(this.projectPath),Ip(this.projectPath),$p(this.projectPath),Mp(this.projectPath)]),m=t.full===!0,d,g=!0,h=new Set;if(!m&&Pd(this.projectId))try{let{diff:j,currentHashes:E}=await Ia(this.projectPath,this.projectId),M=j.added.length+j.modified.length+j.deleted.length;if(M===0&&!t.changedFiles?.length)g=!1,d={isIncremental:!0,filesChanged:0,filesUnchanged:j.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let se=bd(j,this.projectId);h=Td(se.allAffected);let Me=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=se.allAffected.some(mt=>{let ms=mt.substring(mt.lastIndexOf("."));return Me.has(ms)}),d={isIncremental:!0,filesChanged:M,filesUnchanged:j.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}ja(this.projectId,E)}catch(j){V.debug("Incremental detection failed, falling back to full sync",{error:ue(j)})}else try{let{currentHashes:j}=await Ia(this.projectPath,this.projectId);ja(this.projectId,j)}catch(j){V.debug("Hash computation failed (non-critical)",{error:ue(j)})}if(g)try{await Promise.all([Bu(this.projectPath,this.projectId),Sd(this.projectPath,this.projectId),jd(this.projectPath,this.projectId)])}catch(j){V.debug("File ranking index build failed (non-critical)",{error:ue(j)})}let k;try{let[j,E,M,se,Me,q,mt,ms,nr,Ii,$i]=await Promise.all([Promise.resolve(Lt.getActive(this.projectId)).catch(()=>null),Ke.getActive(this.projectId).catch(()=>null),tt.getRecent(this.projectId,3).catch(()=>[]),_o.getMetrics(this.projectId).catch(()=>null),be.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Ge.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),tt.getCount(this.projectId).catch(()=>0)]),Mi={backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,hasActiveTask:!!nr},_i=j?j.patterns.map(oe=>({name:oe.name,description:oe.description,location:oe.locations?.[0]})):(E?.patterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({name:oe.name,description:oe.description,location:oe.location})),Ue=j?j.antiPatterns.map(oe=>({issue:oe.issue,file:oe.files?.[0]??"multiple",suggestion:oe.suggestion,severity:oe.severity??"medium"})):(E?.antiPatterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({issue:oe.issue,file:oe.file,suggestion:oe.suggestion,severity:oe.severity??"medium"})),_t=j?.commands?{install:j.commands.install??u.install,run:u.run,test:j.commands.test??u.test,build:j.commands.build??u.build,dev:j.commands.dev??u.dev,lint:j.commands.lint??u.lint,format:j.commands.format??u.format}:u,rr={version:c.version,fileCount:c.fileCount,patterns:_i,antiPatterns:Ue,recentShipped:M.map(oe=>({name:oe.name,type:oe.type??"feature",duration:oe.duration,filesChanged:oe.changes?.length})),velocity:se?{avgPoints:se.averageVelocity,trend:se.velocityTrend,accuracy:se.estimationAccuracy}:null,backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,knownGotchas:ms?.knownGotchas??[],userPatterns:ms?.patternsDiscovered??[],hasActiveTask:!!nr,activeTaskDescription:nr?.description??"",pausedTasks:mt.map(oe=>({description:oe.description,pausedAt:oe.pausedAt??""})),topBacklog:Me.slice(0,3).map(oe=>({description:oe.description,priority:oe.priority??"medium"})),ideasCount:Ii?.pending??0,shippedCount:$i};k=await Ep.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:_t,stack:p},Mi,rr)}catch(j){V.debug("Native skill generation failed (non-critical)",{error:ue(j)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,p),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,p,n.verified)]);let y=await Ke.getActive(this.projectId),v={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(j=>j.severity==="high").length||0},D=Date.now()-s,U=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await De.installGlobalConfig(),await De.syncCommands();let F;try{let j=await $.readConfig(this.projectPath);F=await Np.verify(this.projectPath,this.globalPath,j?.verification)}catch(j){V.debug("Verification failed (non-critical)",{error:ue(j)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:p,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:v,syncMetrics:U,verification:F,incremental:d,generatedSkills:k}}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:ue(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Fp.mkdir(Sc.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=C.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||T(),lastSync:T(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};C.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=T(),n.lastUpdated=T(),n.context={...n.context||{},lastSession:T(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await Tp.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:ue(o)})}}async logToMemory(e,t){C.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=po(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:ue(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Pn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:ue(a)})}let i={};try{let a=po(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=wo(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Dd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:ue(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(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Cp.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 Ke.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:T(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:ue(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([tt.archiveOldShipped(this.projectId).catch(()=>0),Ge.markDormantIdeas(this.projectId).catch(()=>0),be.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),xt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Mt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:ue(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Ls,s=await cc.learnFromTaskHistory(this.projectId,e,t);try{let n=await Sp.getFeatureOutcomes(this.projectId);n.length>0&&await cc.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:ue(e)})}}async getCliVersion(){try{let e=Sc.join(__dirname,"..","..","package.json");return(await xe(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:ue(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:[]}}},qs=new bc});function $k(){return"---"}function Mk(){return`---
|
|
656
|
-
prjct v${
|
|
657
|
-
`)}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}
|
|
658
771
|
${r}
|
|
659
|
-
\`\`\``}function
|
|
660
|
-
${e}`}function
|
|
661
|
-
`)}function
|
|
662
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
663
|
-
${
|
|
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
|
|
664
777
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
665
|
-
`)}`}function
|
|
666
|
-
${
|
|
667
|
-
> ${e}`:`## ${r}`}function
|
|
668
|
-
|
|
669
|
-
`)}function
|
|
670
|
-
`))}var
|
|
671
|
-
Next:`));for(let o of n){let i=
|
|
672
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
673
|
-
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(
|
|
674
|
-
${
|
|
675
|
-
`),this)},progress(r,e,t){if(
|
|
676
|
-
`),this)}},f=
|
|
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
|
|
792
|
+
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
793
|
+
`);let s=Ww.basename(e);if(t.push(`## Project: ${s}
|
|
794
|
+
`),t.push(`## Stack Detected
|
|
795
|
+
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
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
|
|
797
|
+
`),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
|
|
798
|
+
`)),r.goMod&&(t.push(`### Go
|
|
799
|
+
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
800
|
+
`)),r.requirements&&(t.push(`### Python
|
|
801
|
+
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
802
|
+
`));let n=r.directories;t.push(`## Structure
|
|
803
|
+
`),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
|
|
804
|
+
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
|
|
805
|
+
`),r.gitLog.split(`
|
|
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
|
|
807
|
+
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
808
|
+
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
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(`
|
|
677
810
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
678
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
679
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
`).filter(Boolean).length,s.hasUncommittedChanges&&(e.push(`${s.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{s.gitAvailable=!1}let n=Cs.join(r.projectPath,"package.json");try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.currentVersion=a.version,s.hasPackageJson=!0}catch(i){if(R(i))s.hasPackageJson=!1;else if(i instanceof SyntaxError)s.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Be.readFile(o,"utf-8");s.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${$c(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(R(i))s.shippedExists=!1;else throw i}if(s.hasPackageJson)try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.hasTestScript=!!a.scripts?.test}catch(i){if(R(i)||i instanceof SyntaxError)s.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function im(r){let e=[],t=[],s={},n=r.paths.next;try{let a=await Be.readFile(n,"utf-8");s.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];s.taskCount=c.length,s.pendingTasks=(a.match(/- \[ \]/g)||[]).length,s.taskCount>=90&&(e.push(`Queue nearly full (${s.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(R(a))s.nextExists=!1,s.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Be.readFile(o,"utf-8");s.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp($c(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(R(a))s.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Be.readFile(i,"utf-8");s.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),s.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(R(a))s.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function am(r){let e=[],t=[],s={},n=r.paths.now;try{let i=await Be.readFile(n,"utf-8");s.nowExists=!0,s.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(s.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(R(i))s.nowExists=!1,s.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Be.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;s.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(R(i))s.pendingTasks=0;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function cm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Be.readFile(n,"utf-8");s.alreadyInitialized=!0,s.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(R(i))s.alreadyInitialized=!1;else if(i instanceof SyntaxError)s.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Cs.join(nm.homedir(),".prjct-cli");try{await Be.access(o,Be.constants.W_OK),s.globalPathWritable=!0}catch(i){if(R(i))try{await Be.mkdir(o,{recursive:!0}),s.globalPathWritable=!0,s.globalPathCreated=!0}catch{s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function lm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Be.readFile(n,"utf-8");s.hasConfig=!0,s.config=JSON.parse(a)}catch(a){if(R(a))return s.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:s,warnings:e,recommendations:t};if(a instanceof SyntaxError)return s.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:s,warnings:e,recommendations:t};throw a}let o=s.config?.projectId,i=Cs.join(nm.homedir(),".prjct-cli/projects",o||"");return await P(i)?s.globalStorageExists=!0:(s.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate")),{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function um(r){let e=[],t=[],s={},n=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];s.detectedFiles=[];for(let i of n)await P(Cs.join(r.projectPath,i))&&s.detectedFiles.push(i);s.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];s.detectedSrcDirs=[];for(let i of o)try{(await Be.stat(Cs.join(r.projectPath,i))).isDirectory()&&s.detectedSrcDirs.push(i)}catch(a){if(!R(a))throw a}return{verified:!0,actual:s,warnings:e,recommendations:t}}async function dm(r){let e=[],t=[],s={},n=r.paths.specs;if(await P(n)){s.specsExists=!0;let i=await Be.readdir(n);s.existingSpecs=i.filter(a=>a.endsWith(".md")),s.specCount=s.existingSpecs.length}else s.specsExists=!1,s.specCount=0;let o=r.params.feature||r.params.name||r.params.description;if(o&&s.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");s.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function mm(r,e,t){let s=pm[r];if(!s)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await s(e,t)}catch(n){return{verified:!1,actual:{},warnings:[`Verification error: ${w(n)}`],recommendations:["Check file permissions and project configuration"]}}}async function Qk(r,e,t){let s=await mm(r,e,t);return{...e,groundTruth:{...s,verifiedAt:new Date().toISOString(),command:r}}}function Zk(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var pm,eS,Wo,gm=S(()=>{"use strict";W();He();K();ie();l($c,"escapeRegex");l(Yk,"formatWarnings");l(rm,"verifyDone");l(om,"verifyShip");l(im,"verifyFeature");l(am,"verifyNow");l(cm,"verifyInit");l(lm,"verifySync");l(um,"verifyAnalyze");l(dm,"verifySpec");pm={done:rm,ship:om,feature:im,now:am,init:cm,sync:lm,analyze:um,spec:dm};l(mm,"verify");l(Qk,"prepareCommand");l(Zk,"requiresVerification");eS={verify:mm,prepareCommand:Qk,requiresVerification:Zk,verifiers:pm,formatWarnings:Yk,formatDuration:ht,escapeRegex:$c,verifyDone:rm,verifyShip:om,verifyFeature:im,verifyNow:am,verifyInit:cm,verifySync:lm,verifyAnalyze:um,verifySpec:dm},Wo=eS});function sS(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 nS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of tS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:sS(t)};return{detected:!1}}function rS(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 oS(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 iS(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 aS(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 tS,Mc,cS,Rn,fm=S(()=>{"use strict";tS=[{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(sS,"getHallucinationSuggestion");l(nS,"detectHallucination");l(rS,"isSimilarError");l(oS,"analyzeErrorPattern");l(iS,"generateEscalationMessage");l(aS,"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=>rS(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=oS(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:iS(e,o,this.maxAttempts),suggestion:aS(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 nS(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}}},cS=new Mc,Rn=cS});function _c(r,e){let t=Ir(e),s=Uu[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 lS(r,e){let t=Ir(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function uS(r,e,t){let s=Ir(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 Vo(r,e=bs){let t=Ir(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=dS(r,e),n=pS(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=fS(o),a=mS(o),c=gS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:p}=hS(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:p,lastUpdated:new Date().toISOString()}}function ym(r,e,t=bs){let s=Ir(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 dS(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=uS(i,n,e);if(!t.has(a)){let c=_c(i,e),u=lS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function pS(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,p)=>u+yS(p),0),o=s.outcomes.filter(u=>u.variance).map(u=>Oc(u)),i=o.length>0?Math.round(o.reduce((u,p)=>u+p,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 mS(r){if(r.length<3)return"stable";let e=r.map(p=>p.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let p=0;p<t;p++)s+=p,n+=e[p],o+=p*e[p],i+=p*p;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 gS(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 fS(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 hS(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=yt(r.estimatedDuration),t=yt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function wm(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(`
|
|
688
|
-
|
|
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(`
|
|
813
|
+
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
814
|
+
version INTEGER PRIMARY KEY,
|
|
815
|
+
name TEXT NOT NULL,
|
|
816
|
+
applied_at TEXT NOT NULL
|
|
817
|
+
)
|
|
818
|
+
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
|
|
819
|
+
CREATE TABLE mcp_health (
|
|
820
|
+
provider TEXT PRIMARY KEY,
|
|
821
|
+
status TEXT NOT NULL,
|
|
822
|
+
last_checked TEXT NOT NULL,
|
|
823
|
+
last_error TEXT,
|
|
824
|
+
token_version TEXT,
|
|
825
|
+
config_valid INTEGER NOT NULL DEFAULT 0,
|
|
826
|
+
oauth_valid INTEGER NOT NULL DEFAULT 0,
|
|
827
|
+
updated_at TEXT NOT NULL
|
|
828
|
+
)
|
|
829
|
+
`)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
|
|
830
|
+
INSERT OR REPLACE INTO mcp_health
|
|
831
|
+
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
832
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
833
|
+
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},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 '
|
|
689
836
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
690
837
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
691
838
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
692
839
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
693
|
-
`).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],
|
|
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 '
|
|
694
841
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
695
842
|
NF {
|
|
696
843
|
count[$0]++
|
|
@@ -700,8 +847,8 @@ Recommendations:
|
|
|
700
847
|
for (f in count) print count[f], lastmod[f], f
|
|
701
848
|
}
|
|
702
849
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
703
|
-
`).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),
|
|
704
|
-
`).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 '
|
|
705
852
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
706
853
|
NF {
|
|
707
854
|
count[$0]++
|
|
@@ -711,22 +858,15 @@ Recommendations:
|
|
|
711
858
|
for (f in count) print count[f], lastmod[f], f
|
|
712
859
|
}
|
|
713
860
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
714
|
-
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let
|
|
715
|
-
`);return{file:r,language:
|
|
716
|
-
`),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,
|
|
717
|
-
`).length,m=i[0].trim(),
|
|
718
|
-
`).filter(
|
|
719
|
-
`);return{
|
|
720
|
-
`)
|
|
721
|
-
`)
|
|
722
|
-
`);let t=[];
|
|
723
|
-
Context: ${r.fileCount} files in project.`),e.join(`
|
|
724
|
-
`)}var f$,Um=S(()=>{"use strict";Xc();f$=Xe.object({projectPath:Xe.string(),language:Xe.string().optional(),framework:Xe.string().optional(),techStack:Xe.array(Xe.string()).default([]),domains:Xe.object({hasFrontend:Xe.boolean().default(!1),hasBackend:Xe.boolean().default(!1),hasDatabase:Xe.boolean().default(!1),hasTesting:Xe.boolean().default(!1),hasDocker:Xe.boolean().default(!1)}).optional(),fileCount:Xe.number().optional(),analysisLanguages:Xe.array(Xe.string()).default([]),analysisFrameworks:Xe.array(Xe.string()).default([]),analysisPackageManager:Xe.string().optional()});l(Fm,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var rb,Hm,Gm=S(()=>{"use strict";rb=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Hm=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),rb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Wm(r,e){return{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Vm=S(()=>{"use strict";l(Wm,"classifyCommand")});import Yc from"node:fs/promises";import ob from"node:path";async function zm(){if($r)return $r;let r=await Yc.readFile(Qc,"utf-8"),e=JSON.parse(r);return $r=Hm.parse(e),$r}function ib(r){return Jm.get(r)}function ab(r,e){Jm.set(r,e)}function lb(r,e){let t=r,s=Bm.get(t);return s&&db(s.entry,e)?(s.count++,s.count>=cb):(Bm.set(t,{entry:e,count:1}),!1)}async function ub(r,e){let t=await Yc.readFile(Qc,"utf-8"),s=JSON.parse(t);s.commands[r]=e,await Yc.writeFile(Qc,`${JSON.stringify(s,null,2)}
|
|
725
|
-
`,"utf-8"),$r=null}function db(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,s)=>t===e.modules[s])}function qm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let s=ib(e);if(s)return{entry:s,source:"cache"};if(t){let n=Wm(e,t);return ab(e,n),lb(e,n)&&ub(e,n).catch(()=>{}),{entry:n,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Qc,$r,Jm,Bm,cb,Km=S(()=>{"use strict";Gm();Ct();Vm();Qc=ob.join(Ze,"core/config/command-context.config.json"),$r=null;l(zm,"loadCommandContextConfig");Jm=new Map;l(ib,"getCachedClassification");l(ab,"cacheClassification");Bm=new Map,cb=3;l(lb,"trackClassification");l(ub,"persistClassification");l(db,"isSameEntry");l(qm,"resolveCommandContextFull")});import pb from"node:os";import{z as Qt}from"zod";function mb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Xm(r){let e=r.platform??pb.platform(),t=r.runtime??mb(),s=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
726
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",gb(e)],["runtime",t],["date",s],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
727
|
-
`)}
|
|
728
|
-
</env>`}var j$,Ym=S(()=>{"use strict";j$=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(mb,"detectRuntime");l(gb,"normalizePlatform");l(Xm,"buildEnvironmentBlock")});function Zm(r){let e=r.getAllocationFor("injection");return{...Qo,totalPrompt:e}}function Mr(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
729
|
-
... (truncated to ~${e} tokens)`}function Qm(r){return Math.ceil(r.length/4)}var Qo,Yo,eg=S(()=>{"use strict";ho();Qo={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Zm,"budgetsFromCoordinator");l(Mr,"truncateToTokenBudget");l(Qm,"estimateTokens");Yo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Qo,...e}}addSection(e,t){let s=Mr(e,t),n=Qm(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Mr(s,o);return this.used+=Qm(i),i}return this.used+=n,s}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});var og={};Ot(og,{AgentAssignmentSchema:()=>tg,OUTPUT_SCHEMAS:()=>ng,SubtaskBreakdownSchema:()=>sg,TaskClassificationSchema:()=>jn,renderSchemaForPrompt:()=>fb});import{z as Ye}from"zod";function fb(r){let e=ng[r];return e?`## OUTPUT FORMAT
|
|
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(`
|
|
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(`
|
|
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
|
|
730
870
|
|
|
731
871
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
732
872
|
|
|
@@ -735,163 +875,175 @@ ${e.example}
|
|
|
735
875
|
\`\`\`
|
|
736
876
|
|
|
737
877
|
Fields:
|
|
738
|
-
${
|
|
739
|
-
`)}return"(see example above)"}function
|
|
740
|
-
`)
|
|
741
|
-
`),n.
|
|
742
|
-
`),n.
|
|
743
|
-
`),
|
|
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}
|
|
882
|
+
`),n.role&&g.push(`Role: ${n.role}
|
|
883
|
+
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
884
|
+
`),g.push(`
|
|
744
885
|
Apply specialized expertise. Read agent file for details if needed.
|
|
745
886
|
|
|
746
|
-
`)),
|
|
747
|
-
`),e.frontmatter["allowed-tools"]&&
|
|
748
|
-
`);let
|
|
749
|
-
`);let
|
|
750
|
-
|
|
751
|
-
|
|
887
|
+
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
888
|
+
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
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(`
|
|
891
|
+
<env>
|
|
892
|
+
${M.join(`
|
|
893
|
+
`)}
|
|
894
|
+
</env>
|
|
895
|
+
`)}if(u){let w=u.sealedAnalysis;if(g.push(`
|
|
752
896
|
## PROJECT ANALYSIS (Sealed)
|
|
753
|
-
`),
|
|
754
|
-
`),
|
|
755
|
-
`),
|
|
756
|
-
`),
|
|
757
|
-
`),
|
|
758
|
-
`),
|
|
759
|
-
`),
|
|
760
|
-
`),
|
|
761
|
-
`),
|
|
762
|
-
`),
|
|
763
|
-
`),!m)){if(
|
|
897
|
+
`),g.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
898
|
+
`),g.push(`**Primary Domain**: ${u.primaryDomain}
|
|
899
|
+
`),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
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(`
|
|
764
908
|
### Code Patterns (Follow These)
|
|
765
|
-
`);for(let M of
|
|
766
|
-
`)}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(`
|
|
767
911
|
### Anti-Patterns (Avoid These)
|
|
768
|
-
`);for(let M of
|
|
769
|
-
`)}}
|
|
770
|
-
`)}if(!m){let
|
|
771
|
-
`),
|
|
912
|
+
`);for(let M of w.antiPatterns)g.push(`- **${M.issue}** in \`${M.file}\` \u2014 ${M.suggestion}
|
|
913
|
+
`)}}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(`
|
|
772
916
|
Full patterns: Read analysis/patterns.md
|
|
773
|
-
`))}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(`
|
|
774
918
|
## STACK
|
|
775
|
-
Stack: ${
|
|
776
|
-
`),
|
|
777
|
-
`)}}
|
|
778
|
-
`),
|
|
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(`
|
|
779
923
|
## PLAN MODE
|
|
780
924
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
781
|
-
`),c.allowedTools&&
|
|
782
|
-
`)),c?.requiresApproval&&
|
|
925
|
+
`),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
|
|
926
|
+
`)),c?.requiresApproval&&g.push(`
|
|
783
927
|
## APPROVAL REQUIRED
|
|
784
928
|
Show changes, list affected files, ask for confirmation.
|
|
785
|
-
`),
|
|
786
|
-
|
|
787
|
-
|
|
929
|
+
`),E){g.push(`
|
|
930
|
+
## CONSTRAINTS
|
|
931
|
+
SCOPE: Only files in \`${E}\` are accessible.
|
|
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(`
|
|
788
935
|
### CONTEXT DEGRADATION NOTICE
|
|
789
936
|
|
|
790
|
-
`),
|
|
791
|
-
`),
|
|
792
|
-
`),
|
|
937
|
+
`),g.push(`**Level**: ${w.level}
|
|
938
|
+
`),g.push(`**Unavailable**: ${w.failedTools.join(", ")}
|
|
939
|
+
`),g.push(`Some context tools failed. Explore the codebase manually for missing context.
|
|
793
940
|
|
|
794
|
-
`)}if(u?.realContext){let
|
|
941
|
+
`)}if(u?.realContext){let w=u.realContext;if(g.push(`
|
|
795
942
|
### CODEBASE CONTEXT
|
|
796
943
|
|
|
797
|
-
`),
|
|
944
|
+
`),g.push(`**Git State**: Branch \`${w.gitBranch}\` | ${w.gitStatus}
|
|
798
945
|
|
|
799
|
-
`),
|
|
800
|
-
`),
|
|
801
|
-
`),
|
|
802
|
-
`);for(let M of
|
|
803
|
-
`);
|
|
804
|
-
`)}if(
|
|
805
|
-
`);for(let M of
|
|
946
|
+
`),w.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
|
|
947
|
+
`),g.push(`| Score | File | Why |
|
|
948
|
+
`),g.push(`|-------|------|-----|
|
|
949
|
+
`);for(let M of w.relevantFiles.slice(0,8))g.push(`| ${M.score} | ${M.path} | ${M.reason} |
|
|
950
|
+
`);g.push(`
|
|
951
|
+
`)}if(w.signatures.length>0){g.push(`**Code Signatures** (top files):
|
|
952
|
+
`);for(let M of w.signatures)g.push(`\`\`\`typescript
|
|
806
953
|
// ${M.path}
|
|
807
954
|
${M.content}
|
|
808
955
|
\`\`\`
|
|
809
|
-
`);
|
|
810
|
-
`)}if(
|
|
956
|
+
`);g.push(`
|
|
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}
|
|
811
958
|
|
|
812
|
-
`)}}let
|
|
813
|
-
## FILES: ${
|
|
814
|
-
`),
|
|
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}
|
|
961
|
+
`),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
815
962
|
|
|
816
|
-
`)}else
|
|
817
|
-
## PROJECT: ${
|
|
963
|
+
`)}else E&&g.push(`
|
|
964
|
+
## PROJECT: ${E}
|
|
818
965
|
Read files before modifying.
|
|
819
966
|
|
|
820
|
-
`);let
|
|
967
|
+
`);let W=this.filterRelevantState(s);if(W&&(g.push(`
|
|
821
968
|
## PRJCT STATE (Project Management Data)
|
|
822
|
-
`),
|
|
823
|
-
`)),u?.velocityContext&&(
|
|
969
|
+
`),g.push(W),g.push(`
|
|
970
|
+
`)),u?.velocityContext&&(g.push(`
|
|
824
971
|
### VELOCITY (Historical Estimation Data)
|
|
825
972
|
|
|
826
|
-
`),
|
|
973
|
+
`),g.push(u.velocityContext),g.push(`
|
|
827
974
|
|
|
828
|
-
`)),o&&Object.keys(o).some(
|
|
975
|
+
`)),o&&Object.keys(o).some(w=>o[w])){g.push(`
|
|
829
976
|
## PROJECT DEFAULTS (apply automatically)
|
|
830
|
-
`);for(let[
|
|
831
|
-
`)}if(i?.plan&&i.plan.length>0){if(
|
|
977
|
+
`);for(let[w,M]of Object.entries(o))M&&g.push(`- ${w}: ${M}
|
|
978
|
+
`)}if(i?.plan&&i.plan.length>0){if(g.push(`
|
|
832
979
|
## THINK FIRST (reasoning from analysis)
|
|
833
|
-
`),i.conclusions&&i.conclusions.length>0){
|
|
834
|
-
`);for(let
|
|
835
|
-
`)}
|
|
836
|
-
`);for(let
|
|
837
|
-
`);
|
|
838
|
-
`)}if(a&&a.length>0){
|
|
980
|
+
`),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
|
|
981
|
+
`);for(let w of i.conclusions)g.push(` \u2192 ${w}
|
|
982
|
+
`)}g.push(`Plan:
|
|
983
|
+
`);for(let w=0;w<i.plan.length;w++)g.push(` ${w+1}. ${i.plan[w]}
|
|
984
|
+
`);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
985
|
+
`)}if(!p&&a&&a.length>0){g.push(`
|
|
839
986
|
## CONTEXT (apply these)
|
|
840
|
-
`);for(let
|
|
841
|
-
`),
|
|
842
|
-
`)}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(`
|
|
843
990
|
### RPI PHASE
|
|
844
991
|
|
|
845
|
-
`),
|
|
846
|
-
`);break;case"plan":
|
|
847
|
-
`),
|
|
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.
|
|
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.
|
|
994
|
+
`),w.researchDoc&&g.push(`
|
|
848
995
|
<research-context>
|
|
849
|
-
${
|
|
996
|
+
${w.researchDoc}
|
|
850
997
|
</research-context>
|
|
851
|
-
`);break;case"implement":
|
|
852
|
-
`),
|
|
998
|
+
`);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
|
|
999
|
+
`),w.planDoc&&g.push(`
|
|
853
1000
|
<plan-context>
|
|
854
|
-
${
|
|
1001
|
+
${w.planDoc}
|
|
855
1002
|
</plan-context>
|
|
856
|
-
`),
|
|
857
|
-
**Scoped Files**: ${
|
|
858
|
-
`);break}
|
|
859
|
-
`)}if(
|
|
1003
|
+
`),w.scopedFiles&&w.scopedFiles.length>0&&g.push(`
|
|
1004
|
+
**Scoped Files**: ${w.scopedFiles.map(M=>`\`${M}\``).join(", ")}
|
|
1005
|
+
`);break}g.push(`
|
|
1006
|
+
`)}if(g.push(`
|
|
860
1007
|
---
|
|
861
|
-
`),
|
|
1008
|
+
`),g.push(e.content),u?.requiresFragmentation&&u.subtasks){g.push(`
|
|
862
1009
|
### SUBTASKS (Execute in Order)
|
|
863
1010
|
|
|
864
|
-
`),
|
|
865
|
-
`),
|
|
866
|
-
`);for(let M of u.subtasks){let
|
|
867
|
-
`)}let
|
|
868
|
-
**FOCUS ON SUBTASK #${
|
|
869
|
-
`),
|
|
870
|
-
`),
|
|
871
|
-
`),
|
|
1011
|
+
`),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
|
|
1012
|
+
`),g.push(`|---|--------|-------------|--------|
|
|
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(`
|
|
872
1019
|
### Previous Subtask Handoff
|
|
873
1020
|
|
|
874
|
-
`),
|
|
1021
|
+
`),g.push(`**From:** ${M.fromSubtask}
|
|
875
1022
|
|
|
876
|
-
`),
|
|
877
|
-
`);for(let
|
|
878
|
-
`);if(M.filesChanged.length>0){
|
|
1023
|
+
`),g.push(`**What was done:**
|
|
1024
|
+
`);for(let N of M.whatWasDone)g.push(`- ${N}
|
|
1025
|
+
`);if(M.filesChanged.length>0){g.push(`
|
|
879
1026
|
**Files changed:**
|
|
880
|
-
`);for(let
|
|
881
|
-
`)}
|
|
1027
|
+
`);for(let N of M.filesChanged)g.push(`- \`${N.path}\` (${N.action})
|
|
1028
|
+
`)}g.push(`
|
|
882
1029
|
**Context for this subtask:**
|
|
883
1030
|
${M.outputForNextAgent}
|
|
884
|
-
`)}
|
|
885
|
-
`)}let
|
|
1031
|
+
`)}g.push(`
|
|
1032
|
+
`)}let z=this.getSchemaTypeForCommand(h);if(z){let{renderSchemaForPrompt:w}=await Promise.resolve().then(()=>(_p(),Mp)),M=w(z);M&&g.push(`
|
|
886
1033
|
${M}
|
|
887
|
-
`)}if(
|
|
1034
|
+
`)}if(b.checklist){let w=await this.loadChecklistRouting(),M=await this.loadChecklists();w&&Object.keys(M).length>0&&(g.push(`
|
|
888
1035
|
## QUALITY CHECKLISTS
|
|
889
|
-
`),
|
|
890
|
-
`),
|
|
891
|
-
`),
|
|
892
|
-
`),
|
|
893
|
-
`))}return
|
|
894
|
-
|
|
1036
|
+
`),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1037
|
+
`),g.push(`Available: ${Object.keys(M).join(", ")}
|
|
1038
|
+
`),g.push(`Path: templates/checklists/{name}.md
|
|
1039
|
+
`),g.push(`Use Read tool to load checklists you determine are relevant.
|
|
1040
|
+
`))}return g.push(`
|
|
1041
|
+
## EFFICIENCY
|
|
1042
|
+
`),g.push(`- Be concise. No preamble, no filler.
|
|
1043
|
+
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1044
|
+
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1045
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new 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}
|
|
1046
|
+
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
895
1047
|
|
|
896
1048
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
897
1049
|
|
|
@@ -907,52 +1059,13 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
907
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(`
|
|
908
1060
|
Avoid:
|
|
909
1061
|
${a}`)}let o=t.join(`
|
|
910
|
-
`);return
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
`):t.zone==="dumb"&&e.push(`
|
|
918
|
-
**CONTEXT CRITICAL** (${Math.round(t.usagePercent)}% used): STOP expanding context. Work only with referenced files. Compact now.
|
|
919
|
-
`),this._healthMonitor.checkTransition()}return e.join("")}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let s=t.domains;return{hasFrontend:s.hasFrontend??!1,hasBackend:s.hasBackend??!1,hasDatabase:s.hasDatabase??!1,hasTesting:s.hasTesting??!1,hasDocker:s.hasDocker??!1}}}},yb=new Zc,cg=yb});import Ps from"node:path";var el,wb,Zo,ug=S(()=>{"use strict";Dc();Et();Te();el=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Ps.dirname(bt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,s){let n=await this.getProjectId(s),o=A.getGlobalProjectPath(n),a=await(at(),ot(vt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Ps.join(u,"templates")}catch{c=Ps.join(__dirname,"..","..","templates")}return{projectPath:s,projectId:n,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:Ps.join(c,"agentic","orchestrator.md"),taskFragmentation:Ps.join(c,"agentic","task-fragmentation.md"),commandTemplate:Ps.join(c,"commands",`${e}.md`),repoAnalysis:Ps.join(o,"analysis","repo-analysis.json"),skillsDir:a.skillsDir,stateJson:Ps.join(o,"storage","state.json")}}}requiresOrchestration(e){return em.includes(e)?!0:!tm.includes(e)}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
920
|
-
## Agentic Execution Mode
|
|
921
|
-
|
|
922
|
-
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
923
|
-
|
|
924
|
-
### Context
|
|
925
|
-
- Command: ${e.command}
|
|
926
|
-
- Args: ${e.args}
|
|
927
|
-
- Project: ${e.projectPath}
|
|
928
|
-
- Project ID: ${e.projectId}
|
|
929
|
-
|
|
930
|
-
### Paths (Read as needed)
|
|
931
|
-
- Command Template: ${e.paths.commandTemplate}
|
|
932
|
-
- Repo Analysis: ${e.paths.repoAnalysis}
|
|
933
|
-
- Skills Directory: ${e.paths.skillsDir}
|
|
934
|
-
- State JSON: ${e.paths.stateJson}
|
|
935
|
-
|
|
936
|
-
### Instructions
|
|
937
|
-
|
|
938
|
-
1. **Read the command template** (${e.paths.commandTemplate})
|
|
939
|
-
${t?`
|
|
940
|
-
2. **Orchestration:**
|
|
941
|
-
- Read: ${e.paths.repoAnalysis} to understand project technologies
|
|
942
|
-
- Analyze the task: "${e.args}"
|
|
943
|
-
- Determine which domains are relevant
|
|
944
|
-
- Check if task should be fragmented into subtasks
|
|
945
|
-
`:`
|
|
946
|
-
2. **Execute the command template directly**
|
|
947
|
-
`}
|
|
948
|
-
3. **Return results**
|
|
949
|
-
`,context:e,requiresOrchestration:t}}},wb=new el,Zo=wb});function _r(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&kb.has(e.code))return!0;if(e.code&&pg.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 ti(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&pg.has(e.code))}function dg(r,e,t){let s=Es.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Es.delete(r),!1):!0:!1}function tl(r,e){let t=Es.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Es.set(r,t)}function Sb(r){Es.delete(r)}var kb,pg,Es,ei,mg,si,sl=S(()=>{"use strict";kb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),pg=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(_r,"isTransientError");l(ti,"isPermanentError");Es=new Map;l(dg,"isCircuitOpen");l(tl,"recordFailure");l(Sb,"recordSuccess");ei=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(dg(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 Sb(t),o}catch(o){if(s=o,n++,ti(o))throw tl(t,this.options.circuitBreakerThreshold),o;if(!(_r(o)&&n<this.options.maxAttempts))throw tl(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 tl(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return _r(e)}isCircuitOpen(e){return dg(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Es.get(e)}resetCircuit(e){Es.delete(e)}resetAllCircuits(){Es.clear()}},mg=new ei({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),si=new ei({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import gg from"node:fs/promises";var Zs,nt,nl=S(()=>{"use strict";He();sl();Zs={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};Zs.register("Read",async r=>{try{return await si.execute(async()=>await gg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ti(e)||_r(e),null}});Zs.register("Write",async(r,e)=>{try{return await si.execute(async()=>await gg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ti(t)||_r(t),!1}});Zs.register("Bash",async r=>{try{return await si.execute(async()=>await O(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Zs.register("GetTimestamp",async()=>new Date().toISOString());Zs.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Zs.register("GetDateTime",async()=>new Date().toISOString());nt=Zs});import rl from"node:fs/promises";import bb from"node:os";import ol from"node:path";function fg(){let r=process.env.PRJCT_CLI_HOME?.trim()||ol.join(bb.homedir(),".prjct-cli");return ol.join(r,".running")}async function Tb(r){try{let e=fg(),t=ol.dirname(e);await P(t)||await rl.mkdir(t,{recursive:!0}),await rl.writeFile(e,`/p:${r}`)}catch{}}async function vb(){try{let r=fg();await P(r)&&await rl.unlink(r)}catch{}}var il,Cb,ni,al=S(()=>{"use strict";W();Xp();K();Zp();sm();Ic();gm();fm();mr();Jc();Om();lg();ug();Hs();nl();l(fg,"getRunningFilePath");l(Tb,"signalStart");l(vb,"signalEnd");il=class{static{l(this,"CommandExecutor")}async signalStart(e){await Tb(e)}async signalEnd(){await vb()}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Rn.shouldEscalate(e,n)){let o=Rn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await oa.load(e),i=await Wt.build(s,t),a=We.requiresPlanning(e),c=We.isDestructive(e),u=We.isInPlanningMode(i.projectId),p=null;a&&!u&&!t.skipPlanning?p=We.startPlanning(i.projectId,e,t):u&&(p=We.getActivePlan(i.projectId));let m=null;if(Wo.requiresVerification(e)){let q=await Wt.loadStateForCommand(i,e);m=await Wo.verify(e,i,q),!m.verified&&m.warnings.length>0&&console.log(Wo.formatWarnings(m))}let d=null;if(Ho.requiresReasoning(e)){let q=await Wt.loadStateForCommand(i,e);d=await Ho.reason(e,i,q),d.reasoning&&!d.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ho.formatPlan(d)))}let g=t.task||t.description||"",h=await Zo.buildContext(e,g,s),k=Zo.buildAgenticPrompt(h),y=null;if(Zo.requiresOrchestration(e)&&g)try{if(y=await Ko.execute(e,g,s),y.detectedDomains.length>0&&Kp.orchestrate(y.detectedDomains),y.requiresFragmentation&&y.subtasks){let q=y.subtasks.map(mt=>({id:mt.id,domain:mt.domain,description:mt.description,status:mt.status}));Qp(q)}}catch(q){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(q)}`)}let v={...i,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await Wt.loadState(i),U=null,F=null;i.projectId&&(U={commit_footer:await ct.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ct.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ct.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ct.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await ct.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let j={isPlanning:a||u,requiresApproval:c&&!t.approved,active:p,allowedTools:We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},se=(await(at(),ot(vt)).getActiveProvider()).name==="claude",Me=await cg.build(o,v,D,null,U,null,F,j,y,{skipNativeContext:se});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${h.paths.orchestrator}`),Rn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:v,state:D,prompt:Me,agenticDelegation:!0,agenticMode:!0,agenticExecContext:h,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,reasoning:d,groundTruth:m,learnedPatterns:U,relevantMemories:F,orchestratorContext:y,memory:{create:l(q=>ct.createMemory(i.projectId,q),"create"),autoRemember:l((q,mt,ms)=>ct.autoRemember(i.projectId,q,mt,ms),"autoRemember"),search:l(q=>ct.searchMemories(i.projectId,q),"search"),findByTags:l(q=>ct.findByTags(i.projectId,q),"findByTags"),getStats:l(()=>ct.getMemoryStats(i.projectId),"getStats")},plan:{active:p,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(q=>We.recordGatheredInfo(i.projectId,q),"recordInfo"),setAnalysis:l(q=>We.setAnalysis(i.projectId,q),"setAnalysis"),propose:l(q=>We.proposePlan(i.projectId,q),"propose"),approve:l(q=>We.approvePlan(i.projectId,q),"approve"),reject:l(q=>We.rejectPlan(i.projectId,q),"reject"),getApprovalPrompt:l(()=>We.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>We.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>We.getNextStep(i.projectId),"getNextStep"),completeStep:l(q=>We.completeStep(i.projectId,q),"completeStep"),failStep:l(q=>We.failStep(i.projectId,q),"failStep"),abort:l(q=>We.abortPlan(i.projectId,q),"abort"),getStatus:l(()=>We.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rn.recordAttempt(e,n,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Rn.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,s){if(!nt.isAllowed(e,s))throw new Error(`Tool ${e} not allowed for this command`);let n=nt.get(e);if(!n)throw new Error(`Tool ${e} not found`);return await n(...t)}async executeSimple(e,t,s){try{let o=(await oa.load(e)).frontmatter["allowed-tools"]||[],i=await Wt.build(s);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,p)=>this.executeTool("Write",[u,p],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(n){return{success:!1,error:w(n)}}}},Cb=new il,ni=Cb});import Pb from"node:https";import Eb from"node:os";import cl from"node:path";import Bt from"chalk";var ll,ri,ul=S(()=>{"use strict";W();K();ll=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=cl.join(Eb.homedir(),".prjct-cli","config"),this.cacheFile=cl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=cl.join(__dirname,"..","..","package.json");return(await xe(e))?.version??null}catch(e){return console.error("Error reading package version:",w(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=Pb.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 P(this.cacheFile))return await xe(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:`
|
|
950
|
-
`+Bt.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")+`
|
|
951
|
-
`+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
|
|
952
|
-
`+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
|
|
953
|
-
`+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
|
|
954
|
-
`+Bt.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")+`
|
|
955
|
-
`}},ri=ll});import hg from"node:path";async function Ab(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(hg.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(hg.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Db(){return{...xb}}function jb(){return{...Rb}}async function yg(){return oi||(oi=await Ab()?Db():jb(),oi)}var oi,xb,Rb,wg=S(()=>{"use strict";K();oi=null,xb={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}},Rb={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(Ab,"isClaudeEnvironment");l(Db,"getClaudeAgent");l(jb,"getTerminalAgent");l(yg,"detect")});import ii from"node:fs/promises";var dl,kg,Sg=S(()=>{"use strict";W();K();dl=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: ${w(t)}`)}return await ii.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: ${w(s)}`)}await ii.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: ${w(t)}`)}return await ii.readdir(e)}async fileExists(e){return P(e)}async createDirectory(e){await ii.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
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:
|
|
956
1069
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
957
1070
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
958
1071
|
|
|
@@ -997,10 +1110,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
997
1110
|
|
|
998
1111
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
999
1112
|
|
|
1000
|
-
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}}},
|
|
1001
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n
|
|
1002
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),
|
|
1003
|
-
`);
|
|
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
|
|
1004
1117
|
|
|
1005
1118
|
No current task. Use \`/p:now\` to set focus.
|
|
1006
1119
|
`,"core/next.md":`# NEXT
|
|
@@ -1020,29 +1133,29 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1020
1133
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1021
1134
|
|
|
1022
1135
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1023
|
-
`,"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[
|
|
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
|
|
1024
1137
|
|
|
1025
1138
|
## Idea
|
|
1026
|
-
${
|
|
1139
|
+
${k}
|
|
1027
1140
|
|
|
1028
1141
|
## Status
|
|
1029
1142
|
Initialized - awaiting stack recommendation
|
|
1030
1143
|
|
|
1031
1144
|
Generated: ${new Date().toLocaleString()}
|
|
1032
|
-
`;return await
|
|
1033
|
-
`);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.
|
|
1034
1147
|
|
|
1035
1148
|
Create a plan first:
|
|
1036
1149
|
1. Run /p:init in an empty directory
|
|
1037
1150
|
2. Answer the discovery questions
|
|
1038
1151
|
3. Plan will be auto-generated
|
|
1039
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...
|
|
1040
|
-
`);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/),
|
|
1041
|
-
`)[0].trim():"Unknown project",m=c?c[1]:"Not specified",
|
|
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(`
|
|
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(`
|
|
1042
1155
|
\u{1F527} Stack:
|
|
1043
1156
|
${m}`),console.log(`
|
|
1044
1157
|
\u{1F4CB} Implementation Steps:
|
|
1045
|
-
${
|
|
1158
|
+
${p}`),console.log(`
|
|
1046
1159
|
${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
|
|
1047
1160
|
The architect plan is ready. Claude will now:
|
|
1048
1161
|
1. Read the architectural plan
|
|
@@ -1051,7 +1164,7 @@ The architect plan is ready. Claude will now:
|
|
|
1051
1164
|
4. Create starter files with boilerplate
|
|
1052
1165
|
`),console.log(`
|
|
1053
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.
|
|
1054
|
-
`),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
|
|
1055
1168
|
|
|
1056
1169
|
## Idea
|
|
1057
1170
|
${e}
|
|
@@ -1066,14 +1179,14 @@ Initialized - awaiting architecture design
|
|
|
1066
1179
|
4. Generate roadmap
|
|
1067
1180
|
|
|
1068
1181
|
Generated: ${new Date().toLocaleString()}
|
|
1069
|
-
`;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(`
|
|
1070
1183
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1071
|
-
`)),{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(`
|
|
1072
1185
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1073
1186
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1074
1187
|
\u{1F4CB} SPECIFICATIONS
|
|
1075
|
-
`),console.log("\u2550".repeat(50)),h.forEach((k
|
|
1076
|
-
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=
|
|
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}
|
|
1077
1190
|
|
|
1078
1191
|
## Overview
|
|
1079
1192
|
[Brief description of the feature]
|
|
@@ -1103,65 +1216,45 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1103
1216
|
---
|
|
1104
1217
|
Created: ${new Date().toLocaleString()}
|
|
1105
1218
|
Status: Draft
|
|
1106
|
-
`;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(`
|
|
1107
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
|
|
1108
|
-
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(
|
|
1109
|
-
`)
|
|
1110
|
-
`)}function jg(r,e){let t=[];t.push(`# Repository Analysis
|
|
1111
|
-
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1112
|
-
`);let s=Ub.basename(e);if(t.push(`## Project: ${s}
|
|
1113
|
-
`),t.push(`## Stack Detected
|
|
1114
|
-
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1115
|
-
`),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
|
|
1116
|
-
`),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
|
|
1117
|
-
`)),r.goMod&&(t.push(`### Go
|
|
1118
|
-
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
1119
|
-
`)),r.requirements&&(t.push(`### Python
|
|
1120
|
-
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
1121
|
-
`));let n=r.directories;t.push(`## Structure
|
|
1122
|
-
`),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
|
|
1123
|
-
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
|
|
1124
|
-
`),r.gitLog.split(`
|
|
1125
|
-
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,p]=a.split("|");t.push(`- \`${c}\` ${p} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1126
|
-
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1127
|
-
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1128
|
-
`)}var Ig=S(()=>{"use strict";os();uo();Js();En();vs();dt();l(Tl,"showSyncResult");l(Rg,"getSessionActivity");l(Mn,"formatTokens");l(vl,"formatDuration");l(Ag,"generateSparkline");l(Dg,"generateStatsMarkdown");l(jg,"generateAnalysisSummary")});var Eg={};Ot(Eg,{AnalysisCommands:()=>on});import Cl from"node:fs/promises";import $g from"node:path";import*as rn from"@clack/prompts";var on,pi=S(()=>{"use strict";mr();Eu();os();uo();ca();ad();md();Aa();Tc();kn();re();kr();Qa();W();Ks();En();vs();Ig();dt();on=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1129
|
-
`),Je.init(t);let s=await Wt.build(t,e),n={packageJson:await Je.readPackageJson(),cargoToml:await Je.readCargoToml(),goMod:await Je.readGoMod(),requirements:await Je.readRequirements(),directories:await Je.listDirectories(),fileCount:await Je.countFiles(),gitStats:await Je.getGitStats(),gitLog:await Je.getGitLog(20),hasDockerfile:await Je.fileExists("Dockerfile"),hasDockerCompose:await Je.fileExists("docker-compose.yml"),hasReadme:await Je.fileExists("README.md"),hasTsconfig:await Je.fileExists("tsconfig.json"),hasViteConfig:await Je.fileExists("vite.config.ts")||await Je.fileExists("vite.config.js"),hasNextConfig:await Je.fileExists("next.config.js")||await Je.fileExists("next.config.mjs")},o=jg(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await nt.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:J.getTimestamp(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(at(),ot(vt)).getActiveProvider(),p=await De.installGlobalConfig();return p.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(p.path)}`),console.log(`\u2705 Analysis complete!
|
|
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!
|
|
1130
1223
|
`),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1131
|
-
`),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:",
|
|
1132
|
-
${
|
|
1133
|
-
`)}catch{y="### Next: Run `prjct analysis-payload --md` to update project analysis"}let v=Uo("sync",!0),D=p.syncMetrics?.indexes,U={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${d} generated`,"Files indexed":p.stats.fileCount};if(D?.bm25Files){let j=D.bm25Files*(D.bm25AvgTokens||0);U["Tokens indexed"]=`${Math.round(j/1e3)}K`,U["Import edges"]=D.importEdges||0,U["Co-change commits"]=D.cochangeCommits||0}let F=L(ke("Sync Complete"),lt(U),g,p.git.hasChanges?Wp("Uncommitted changes detected"):null,y,ge(v.map(j=>({label:j.desc,command:j.cmd}))));return console.log(F),{success:!0,data:p,metrics:{elapsed:m,skillCount:d,fileCount:p.stats.fileCount}}}return Tl(p,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${w(s)}`)):f.fail(w(s)),{success:!1,error:w(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await qs.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(ke("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:w(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.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(ke("LLM Analysis Saved"),lt({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:w(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.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=[ke(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Q("Architecture Insights",Oe(o.architecture.insights))),o.patterns.length>0&&i.push(Q("Patterns",Oe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Q("Anti-Patterns",Oe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Q("Tech Debt",Oe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Q("Conventions",Oe(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:w(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(n),i=await Pn.getDailyStats(n,30),a=await Rg(n),c=await ct.getPatternsSummary(n);if(t.json){let d={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(d,null,2)),{success:!0,data:d}}let u="Unknown";try{u=C.getDoc(n,"project")?.name||"Unknown"}catch{}let p=await Pn.read(n),m=p.firstSync?new Date(p.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 d=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${d}`)}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: ${Mn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${lo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let d=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=d>0?(g.usageCount/d*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 d=Ag(i);if(console.log(` ${d} ${Mn(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 d=Dg(o,i,u,m,a,c);return console.log(d),{success:!0,data:{markdown:d}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",w(s)),{success:!1,error:w(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.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=yo(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Ke.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=$g.basename(e),p=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",d=[];c.hasSealed&&d.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&d.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&d.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,lt({Staleness:p,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),d.length>0?Q("Analysis",Oe(d)):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=w(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 $.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 Ke.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(aa(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Fu(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=w(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 $.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 Ke.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=w(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 $.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 Ke.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(ke("Analysis Rolled Back"),lt({"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=w(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 $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ke.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=w(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 $.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=C.getDoc(n,"project")?.repoPath||e}catch{}let i=await Ke.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=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Vn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1134
|
-
`)}var
|
|
1135
|
-
`);if(u!==-1){let
|
|
1136
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){
|
|
1137
|
-
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return
|
|
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)
|
|
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)
|
|
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
|
|
1138
1231
|
WHERE project_id = ? AND timestamp >= ?
|
|
1139
|
-
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=
|
|
1140
|
-
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}}},
|
|
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
|
|
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(`
|
|
1141
1234
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1142
|
-
`),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
|
|
1143
|
-
Activity: ${
|
|
1144
|
-
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let m=await
|
|
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(`
|
|
1145
1238
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1146
|
-
`),console.log("\u2550".repeat(50)),!
|
|
1147
|
-
`);else{let g=
|
|
1148
|
-
`)[0].trim();console.log(` ${
|
|
1149
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${
|
|
1150
|
-
`+
|
|
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(`
|
|
1151
1244
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1152
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
1245
|
+
`),console.log("\u2550".repeat(50));let m=ko(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1153
1246
|
${g}`),console.log(`
|
|
1154
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=
|
|
1155
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,
|
|
1156
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let
|
|
1157
|
-
\u{1F4A1} IDEAS`),console.log(` ${
|
|
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(`
|
|
1250
|
+
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1158
1251
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1159
|
-
`)}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(`
|
|
1160
1253
|
PRJCT COMMANDS
|
|
1161
|
-
`),console.log("=".repeat(50));let i=
|
|
1162
|
-
${m?.title||u}:`),
|
|
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(`
|
|
1163
1256
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1164
|
-
`),{success:!0,topic:"overview"}}let s=
|
|
1257
|
+
`),{success:!0,topic:"overview"}}let s=F.getByName(e);if(s){if(console.log(`
|
|
1165
1258
|
\u{1F4DA} HELP: /p:${s.name}
|
|
1166
1259
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
|
|
1167
1260
|
Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
|
|
@@ -1171,9 +1264,9 @@ ${"\u2550".repeat(50)}
|
|
|
1171
1264
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1172
1265
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1173
1266
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1174
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(
|
|
1175
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(
|
|
1176
|
-
`)}}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}
|
|
1177
1270
|
|
|
1178
1271
|
*Use templates/design/architecture.md for full design*
|
|
1179
1272
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1188,14 +1281,14 @@ ${"\u2550".repeat(50)}
|
|
|
1188
1281
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1189
1282
|
|
|
1190
1283
|
*Use templates/design/flow.md for full design*
|
|
1191
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,
|
|
1192
|
-
`),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){
|
|
1193
|
-
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(),
|
|
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(`
|
|
1194
1287
|
Found abandoned session:
|
|
1195
|
-
`),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(`
|
|
1196
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
|
|
1197
|
-
`),{success:!0,session:n}}catch(e){return f.fail(
|
|
1198
|
-
`).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(`
|
|
1199
1292
|
SNAPSHOT HISTORY
|
|
1200
1293
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1201
1294
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1203,56 +1296,40 @@ ${"\u2550".repeat(50)}
|
|
|
1203
1296
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1204
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
|
|
1205
1298
|
`)),console.log(`${"=".repeat(50)}
|
|
1206
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(
|
|
1207
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};
|
|
1208
|
-
|
|
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.")}
|
|
1209
1307
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1210
|
-
${
|
|
1211
|
-
${
|
|
1212
|
-
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
1213
|
-
version INTEGER PRIMARY KEY,
|
|
1214
|
-
name TEXT NOT NULL,
|
|
1215
|
-
applied_at TEXT NOT NULL
|
|
1216
|
-
)
|
|
1217
|
-
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
|
|
1218
|
-
CREATE TABLE mcp_health (
|
|
1219
|
-
provider TEXT PRIMARY KEY,
|
|
1220
|
-
status TEXT NOT NULL,
|
|
1221
|
-
last_checked TEXT NOT NULL,
|
|
1222
|
-
last_error TEXT,
|
|
1223
|
-
token_version TEXT,
|
|
1224
|
-
config_valid INTEGER NOT NULL DEFAULT 0,
|
|
1225
|
-
oauth_valid INTEGER NOT NULL DEFAULT 0,
|
|
1226
|
-
updated_at TEXT NOT NULL
|
|
1227
|
-
)
|
|
1228
|
-
`)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
|
|
1229
|
-
INSERT OR REPLACE INTO mcp_health
|
|
1230
|
-
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
1231
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
1232
|
-
`).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)}},tT=new Fl;W();K();var ki="mcp-remote@0.1.38",Ul={linear:{command:"npx",args:["-y",ki,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ki,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},KL={linear:`npx -y ${ki} https://mcp.linear.app/mcp`,jira:`npx -y ${ki} https://mcp.atlassian.com/v1/mcp`};function ds(){return process.env.PRJCT_TEST_MODE==="1"?qg.join(Jg.tmpdir(),"prjct-context7-test","mcp.json"):qg.join(Jg.homedir(),".claude","mcp.json")}l(ds,"getClaudeMcpConfigPath");async function Kg(r=ds()){try{let e=await sT.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${w(e)}`)}}l(Kg,"readMcpConfig");async function nT(r,e=ds()){await le(e,r)}l(nT,"writeMcpConfig");async function Hl(r,e,t=ds()){let s=await Kg(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await nT(s,t),{path:t,changed:i}}l(Hl,"upsertMcpServer");async function Lr(r,e=ds()){return!!(await Kg(e)).mcpServers?.[r]}l(Lr,"hasMcpServer");vs();Ct();dt();var Un=class extends Ce{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 ft.write({apiKey:o,...i?{apiUrl:i}:{}}),await Fn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
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
|
|
1233
1310
|
- **Status**: Connected
|
|
1234
1311
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1235
|
-
- **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
|
|
1236
1313
|
- **Status**: Key saved (server unreachable)
|
|
1237
|
-
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await
|
|
1238
|
-
- **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
|
|
1239
1316
|
- **Authenticated**: Yes
|
|
1240
1317
|
- **Email**: ${o.email||"N/A"}
|
|
1241
1318
|
- **Key**: \`${o.apiKeyPrefix}\`
|
|
1242
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"}
|
|
1243
1320
|
Key: ${o.apiKeyPrefix}
|
|
1244
|
-
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${
|
|
1245
|
-
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
|
|
1246
1323
|
- **Email**: ${t.email}
|
|
1247
1324
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1248
1325
|
|
|
1249
|
-
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}
|
|
1250
1327
|
Key: ${u.substring(0,12)}...
|
|
1251
1328
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1252
|
-
- **Email**: ${
|
|
1329
|
+
- **Email**: ${d}
|
|
1253
1330
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1254
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
|
|
1255
|
-
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>
|
|
1256
1333
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1257
1334
|
<title>prjct CLI Connected</title>
|
|
1258
1335
|
<style>
|
|
@@ -1307,31 +1384,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1307
1384
|
<h1>Authentication Failed</h1>
|
|
1308
1385
|
<div class="msg">${e}</div>
|
|
1309
1386
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1310
|
-
</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}...
|
|
1311
1388
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1312
1389
|
|
|
1313
1390
|
Please install one first:
|
|
1314
1391
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1315
1392
|
- Gemini CLI: https://geminicli.com/docs
|
|
1316
|
-
- 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(`
|
|
1317
1394
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1318
1395
|
${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1319
|
-
\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(()=>(
|
|
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(`
|
|
1320
1397
|
\u{1F389} Setup complete!`),console.log(`
|
|
1321
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...
|
|
1322
|
-
`),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(`
|
|
1323
1400
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1324
1401
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1325
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1326
|
-
\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(`
|
|
1327
1404
|
\u{1F389} Setup complete!
|
|
1328
1405
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1329
|
-
\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
|
|
1330
1407
|
# prjct Status Line for Claude Code
|
|
1331
1408
|
# Shows version update notifications and current task
|
|
1332
1409
|
|
|
1333
1410
|
# Current CLI version (embedded at install time)
|
|
1334
|
-
CLI_VERSION="${
|
|
1411
|
+
CLI_VERSION="${Ee}"
|
|
1335
1412
|
|
|
1336
1413
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1337
1414
|
read -r json
|
|
@@ -1382,14 +1459,14 @@ fi
|
|
|
1382
1459
|
|
|
1383
1460
|
# Default: show prjct branding
|
|
1384
1461
|
echo "\u26A1 prjct"
|
|
1385
|
-
`;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
|
|
1386
1463
|
|
|
1387
1464
|
All notable changes to this project will be documented in this file.
|
|
1388
1465
|
|
|
1389
1466
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1390
1467
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1391
|
-
`,
|
|
1392
|
-
`),{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}
|
|
1393
1470
|
${a}`}return`${e.trimEnd()}
|
|
1394
1471
|
|
|
1395
1472
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1399,31 +1476,31 @@ ${a}`}return`${n}
|
|
|
1399
1476
|
|
|
1400
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(`
|
|
1401
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(`
|
|
1402
|
-
`)}};
|
|
1403
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(
|
|
1404
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1405
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
1406
|
-
${
|
|
1407
|
-
${
|
|
1408
|
-
`,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let
|
|
1409
|
-
${
|
|
1410
|
-
${
|
|
1411
|
-
${
|
|
1412
|
-
`}}let
|
|
1413
|
-
${
|
|
1414
|
-
${
|
|
1415
|
-
`,n}}return n}l(
|
|
1416
|
-
|
|
1417
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
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}
|
|
1484
|
+
${y(g)}
|
|
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}
|
|
1493
|
+
|
|
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,`
|
|
1418
1495
|
|
|
1419
1496
|
`).trim()}
|
|
1420
|
-
`}await
|
|
1421
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1422
|
-
${
|
|
1423
|
-
`),{success:!0,message:"No data"};let a=
|
|
1424
|
-
${
|
|
1425
|
-
${
|
|
1426
|
-
${
|
|
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`---
|
|
1427
1504
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1428
1505
|
---
|
|
1429
1506
|
|
|
@@ -1459,46 +1536,46 @@ Suggest relevant actions based on the workflow results:
|
|
|
1459
1536
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1460
1537
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1461
1538
|
- Run again: \`p. ${e}\`
|
|
1462
|
-
`}},
|
|
1463
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(
|
|
1464
|
-
`)}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 ${
|
|
1465
|
-
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=
|
|
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)
|
|
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
|
|
1466
1543
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1467
|
-
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=
|
|
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
|
|
1468
1545
|
WHERE actual_files IS NOT NULL
|
|
1469
|
-
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),
|
|
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)
|
|
1470
1547
|
|
|
1471
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",
|
|
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(`
|
|
1472
1549
|
`)}).join(`
|
|
1473
1550
|
|
|
1474
|
-
`)}`}l(
|
|
1475
|
-
`)}l(
|
|
1476
|
-
${
|
|
1477
|
-
${
|
|
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
|
|
1478
1555
|
| Metric | Value |
|
|
1479
1556
|
|--------|-------|
|
|
1480
|
-
| Precision | ${
|
|
1481
|
-
| Recall | ${
|
|
1482
|
-
Research is available. Create your implementation plan next.`):M="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(ke("Completed",`${a}${F}`),lt({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),j,E,M,ge([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&U?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),jr("completed"),At("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:p,actualMinutes:u,timestamp:J.getTimestamp()}),await zt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await be.getActiveTasks(n);if(o.length===0)return t.md?Rt("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(Q("Queue",`${o.length} task${o.length!==1?"s":""}`),Oe(i,!0),ge([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),At("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.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?Rt("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=J.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await Rs.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(ke("Task Paused",`**Paused:** ${i.description}`),lt({Reason:e||void 0,"Duration worked":a||void 0}),ge([{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})`:""}`),jr("paused"),At("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:J.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.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?Rt("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(ke("Task Resumed",`**Resumed:** ${a.description}`),ge([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),jr("working"),At("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:J.getTimestamp()}),{success:!0,task:a.description}):(s.md?Rt("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(w(n)),{success:!1,error:w(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.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: ${w(n)}`):f.fail(w(n)),{success:!1,error:w(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of PT){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=rt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let d=rt.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${d}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=je.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(ke("Rule Added",`#${p} [hook] ${a} ${c} \u2192 \`${n}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`rule #${p} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:p}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=rt.getAllWorkflows(t).map(g=>g.name).join(", "),d=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let p='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=je.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(ke("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ge([{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=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=rt.getAllWorkflows(t).map(y=>y.name).join(", "),k=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${k}`):f.warn(k),{success:!1,error:k}}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(),p=a.slice(c[0].length).trim(),[m]=this._parseAction(p);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 d=je.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(ke("Instruction Added",`#${d} [instruction] ${u} ${o} \u2192 \`${m}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`instruction #${d} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:d}}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(!je.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(ke("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(L(ke("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=je.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 je.updateRule(t,o,{enabled:!1}),s.md?console.log(L(ke("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ge([{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=je.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 je.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(ke("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(Q("Multiple matches",`${a.length} rules match "${n}"`),Oe(c),ge(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(Q("Workflow Help","Manage hooks, gates, and steps for your workflow"),Q("Commands",Oe(["`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"])),Q("Natural Language (EN/ES)",Oe(['`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=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(L(Q("Workflow Rules","No rules configured"),ge([{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 p of i){let m=o.filter(d=>d.command===p);m.length!==0&&a.push(AT(p,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(Q(c,u),a.length>0?Up(a.join(`
|
|
1483
|
-
|
|
1484
|
-
`),""):null,
|
|
1485
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:
|
|
1486
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1487
|
-
`)))}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(`
|
|
1488
1565
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1489
|
-
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(!
|
|
1490
|
-
`)}l(
|
|
1491
|
-
`)}catch{return null}}l(
|
|
1492
|
-
`)}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(`
|
|
1493
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(`
|
|
1494
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(`
|
|
1495
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(DT,"getFilesModifiedSinceTaskStart");function jT(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(jT,"formatVariance");var Yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Xn,this.planning=new sn,this.shipping=new Wn,this.analytics=new _n,this.performanceCmds=new Ln,this.maintenance=new Nn,this.analysis=new on,this.setupCmds=new Un,this.updateCmds=new zn,this.velocityCmds=new Jn,this.contextCmds=new an,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async 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)}},X1=new Yn;pi();var yf={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}},wf=[{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"]}];di();os();Te();W();K();dt();import{execSync as xi}from"node:child_process";import St from"node:fs/promises";import IT from"node:os";import ps from"node:path";import $T from"node:readline";import Pe from"chalk";var Ri="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Wr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Sf(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let s of t){let n=ps.join(r,s.name);if(s.isDirectory())e+=await Sf(n);else try{let o=await St.stat(n);e+=o.size}catch{}}}catch{}return e}l(Sf,"getDirectorySize");function kf(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(kf,"formatSize");async function MT(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(MT,"countDirectoryItems");function _T(){let r={homebrew:!1,npm:!1};try{xi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{xi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(_T,"detectInstallation");async function OT(){let r=[],e=$u(),t=A.getGlobalBasePath(),s=await P(t),n=s?await MT(ps.join(t,"projects")):0,o=s?await Sf(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=ps.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let D=await St.readFile(i,"utf-8");c=D.includes(Ri)&&D.includes(Wr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,p=await P(u);r.push({path:u,type:"file",description:"Claude router",exists:p});let m=ps.join(e.claude.config,"prjct-statusline.sh"),d=await P(m);r.push({path:m,type:"file",description:"Status line script",exists:d});let g=e.gemini.router,h=await P(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let k=ps.join(e.gemini.config,"GEMINI.md"),y=await P(k),v=!1;if(y)try{let D=await St.readFile(k,"utf-8");v=D.includes(Ri)&&D.includes(Wr)}catch{}return y&&v&&r.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(OT,"gatherUninstallItems");async function NT(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes(Ri)||!e.includes(Wr))return!1;let t=e.indexOf(Ri),s=e.indexOf(Wr)+Wr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1496
|
-
|
|
1497
|
-
`).trim(),!n||n.trim().length===0?await
|
|
1498
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
1499
|
-
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(
|
|
1500
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1501
|
-
${a.length} errors:`));for(let c of a)console.log(Pe.red(` - ${c}`))}return console.log(""),console.log(Pe.green("prjct has been uninstalled.")),console.log(Pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(HT,"uninstall");var Ai=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return HT(e,t)}};var As=new Xn,Di=new sn,GT=new Wn,Tf=new _n,WT=new Ln,Ds=new Nn,Qn=new on,Vr=new Un,VT=new an,BT=new Jn,zT=new Ai,JT=new zn;function qT(){for(let[r,e]of Object.entries(yf))G.registerCategory(r,e)}l(qT,"registerCategories");function KT(){if(G.has("work"))return;qT();let r=l(e=>wf.find(t=>t.name===e),"getMeta");G.registerMethod("task",As,"now",r("task")),G.registerMethod("done",As,"done",r("done")),G.registerMethod("next",As,"next",r("next")),G.registerMethod("pause",As,"pause",r("pause")),G.registerMethod("resume",As,"resume",r("resume")),G.registerMethod("workflow",As,"workflow",r("workflow")),G.registerMethod("tokens",As,"tokens",r("tokens")),G.registerMethod("sessions",As,"sessions",r("sessions")),G.registerMethod("init",Di,"init",r("init")),G.registerMethod("bug",Di,"bug",r("bug")),G.registerMethod("idea",Di,"idea",r("idea")),G.registerMethod("spec",Di,"spec",r("spec")),G.registerMethod("ship",GT,"ship",r("ship")),G.registerMethod("dash",Tf,"dash",r("dash")),G.registerMethod("help",Tf,"help",r("help")),G.registerMethod("perf",WT,"perf",r("perf")),G.registerMethod("velocity",BT,"velocity",r("velocity")),G.registerMethod("cleanup",Ds,"cleanup",r("cleanup")),G.registerMethod("cleanup-projects",Ds,"cleanupProjects",r("cleanup-projects")),G.registerMethod("design",Ds,"design",r("design")),G.registerMethod("recover",Ds,"recover",r("recover")),G.registerMethod("undo",Ds,"undo",r("undo")),G.registerMethod("redo",Ds,"redo",r("redo")),G.registerMethod("history",Ds,"history",r("history")),G.registerMethod("enrich",Ds,"enrich",r("enrich")),G.registerMethod("analyze",Qn,"analyze",r("analyze")),G.registerMethod("sync",Qn,"sync",r("sync")),G.registerMethod("stats",Qn,"stats",r("stats")),G.registerMethod("status",Qn,"status",r("status")),G.registerMethod("seal",Qn,"seal",r("seal")),G.registerMethod("verify",Qn,"verify",r("verify")),G.registerMethod("start",Vr,"start",r("start")),G.registerMethod("setup",Vr,"setup",r("setup")),G.registerMethod("login",Vr,"login",r("login")),G.registerMethod("logout",Vr,"logout",r("logout")),G.registerMethod("auth",Vr,"auth",r("auth")),G.registerMethod("uninstall",zT,"uninstall",r("uninstall")),G.registerMethod("update",JT,"update",r("update")),G.registerMethod("context",VT,"context",r("context"))}l(KT,"registerAllCommands");KT();Et();ar();Ct();import{Hono as iv}from"hono";import{cors as av}from"hono/cors";import{logger as cv}from"hono/logger";Te();re();ks();Xt();zs();Pt();W();ns();import XT from"node:fs/promises";import YT from"node:path";import{Hono as QT}from"hono";function ZT(r){return A.getGlobalProjectPath(r)}l(ZT,"getProjectDataPath");function vf(r,e){let t=new QT,s=ZT(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await be.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Ge.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=C.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await tt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),be.read(r),Ge.read(r),tt.read(r)]),u=C.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();return await _.write(r,o),n.json({success:!0})}catch(o){return n.json({success:!1,error:String(o)},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=YT.join(s,"context",`${o}.md`),c=await XT.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return R(a)||V.error(`Context read error: ${w(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(vf,"createRoutes");Te();re();ks();Xt();zs();Pt();import Zn from"node:fs/promises";import ev from"node:path";import{Hono as tv}from"hono";var sv=A.getGlobalBasePath(),er=ev.join(sv,"projects");function ji(r){return C.getDoc(r,"project")}l(ji,"getProjectConfig");async function Ql(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(Ql,"calculateDuration");function Cf(){let r=new tv;return r.get("/projects",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ji(o),a=await _.read(o),c=await be.read(o),u=await Ge.read(o),p=await tt.read(o),m=a?.currentTask,d=await Ql(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:d}: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:p?.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(t){return e.json({projects:[],error:String(t)},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(ji(t)),_.read(t),be.read(t),Ge.read(t),tt.read(t)]),c=C.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Ql(n.currentTask.startedAt));let u=new Date,p=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(p);m.setDate(m.getDate()-m.getDay());let d=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=p)?.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:d,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(s){return e.json({error:String(s)},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(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let n=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason: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(s){return e.json({success:!1,error:String(s)},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(s){return e.json({success:!1,error:String(s)},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)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),be.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(p=>p.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(s){return e.json({success:!1,error:String(s)},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)return e.json({success:!1,error:"text required"},400);let a=await Ge.addIdea(t,n,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${n.slice(0,50)}...`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/stats/global",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{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),p=await be.read(c),m=await Ge.read(c),d=await tt.read(c);u?.currentTask&&a++,n+=p?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=d?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Zn.mkdir(er,{recursive:!0});let n=(await Zn.readdir(er,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name),o=null;if(t)for(let p of n){let m=ji(p),d=m?.repoPath||m?.path;if(d&&t.startsWith(d)){o=p;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let p of u){let m=await _.read(p),d=ji(p);if(m?.currentTask){i={id:p,name:d?.name||p,path:d?.repoPath||d?.path},a={...m.currentTask,duration:await Ql(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:p,name:d?.name||p,path:d?.repoPath||d?.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(t){return e.json({error:String(t)},500)}}),r}l(Cf,"createExtendedRoutes");import{streamSSE as nv}from"hono/streaming";var Pf=3600*1e3,rv=300*1e3,ov=3e4;function Ef(){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()>Pf&&t(i)},rv),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 nv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,p={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)}},ov),d=setTimeout(()=>{t(a)},Pf);typeof m=="object"&&"unref"in m&&m.unref(),typeof d=="object"&&"unref"in d&&d.unref(),r.set(a,{client:p,heartbeatInterval:m,ttlTimeout:d,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(Ef,"createSSEManager");function xf(r){let e=new iv,t=Ef();r.enableCors!==!1&&e.use("*",av({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",cv()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ae,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=vf(r.projectId,r.projectPath);e.route("/api",s);let n=Cf();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(Os())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: ${Os()?"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(xf,"createServer");var Rf=3478;re();Gl();var uv=50,tr=null,Br=null,he=null,Ee=null;async function Af(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Fe.mkdirSync(s,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);fv(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),wv();let n=hv(),o=null;if(n)try{o=Fe.statSync(n).mtimeMs}catch{}if(Ee={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Qg,idleTimer:null,entryPath:n,entryMtime:o},he=new Yn,tr=lv(i=>dv(i)),tr.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Df()}),tr.on("error",i=>{console.error("Daemon socket error:",i.message),sr(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||Rf;Br=xf({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Br.start()}}catch{}if(process.on("SIGTERM",()=>sr(0)),process.on("SIGINT",()=>sr(0)),process.on("SIGHUP",()=>{he=new Yn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Af,"startDaemon");function dv(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Zg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Vn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1502
|
-
`))!==-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(`
|
|
1503
1580
|
`)||o.message||void 0,stderr:t.join(`
|
|
1504
|
-
`)||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)});
|